Spring Cloud 包括的プロジェクトの一部である Amazon Web Services 用の Spring Cloud は、ホストされている Amazon Web Services との統合を容易にします。メッセージングやキャッシング API などのよく知られた Spring イディオムや API を使用して、AWS が提供するサービスとやり取りするための便利な方法を提供します。開発者は、インフラストラクチャやメンテナンスを気にすることなく、ホストされたサービスを中心にアプリケーションを構築できます。

Spring Cloud は、制限のない Apache 2.0 ライセンスでリリースされています。ドキュメントのこのセクションに貢献したい場合、またはエラーを見つけた場合は、github (英語) のプロジェクトでソースコードと課題追跡ツールを見つけてください。

1. Amazon Web Services の使用

Amazon は、Amazon Web Service プラットフォームによって提供されるすべてのサービスのリクエストを発行するための Java SDK [Amazon] を提供します。SDK を使用する場合でも、アプリケーション開発者は、かなりの量のインフラストラクチャ関連コードを使用して SDK をアプリケーションに統合する必要があります。Spring Cloud AWS は、サービスを利用し、インフラストラクチャ関連のコードを可能な限り回避するために、すでに統合されている Spring ベースのモジュールをアプリケーション開発者に提供します。Spring Cloud AWS モジュールは、アプリケーション開発者が特定のサービスのニーズに基づいて依存関係を調整できるように、モジュールセットを提供します。次の図は、すべての Spring Cloud AWS モジュールの概要と、それぞれの Spring Cloud AWS サービスのサービスサポートを示しています。

Overview
  • Spring Cloud AWS コアは、セキュリティと構成のセットアップのための基本的なサービスを提供する Spring Cloud AWS のコアモジュールです。開発者は、このモジュールを直接使用するのではなく、他のモジュールを介して使用します。コアモジュールは、インスタンスベースの EC2 [Amazon] メタデータおよびアプリケーションスタック固有の CloudFormation [Amazon] メタデータ全体への直接アクセスを提供するクラウドベースの環境構成のサポートを提供します。

  • Spring Cloud AWS コンテキストは、Spring リソースローダーの抽象化を介してシンプルなストレージサービス [Amazon] へのアクセスを提供します。さらに、開発者はシンプルなメールサービス [Amazon] および Spring メール抽象化を使用してメールを送信できます。さらに、開発者は、Spring キャッシングサポートと ElastiCache [Amazon] キャッシングサービスを使用して宣言型キャッシングを導入できます。

  • Spring Cloud AWS JDBC は、リレーショナルデータベースサービス [Amazon] の自動データソースルックアップと構成を提供します。これは、JDBC または Spring によるその他のサポートデータアクセステクノロジで使用できます。

  • Spring Cloud AWS メッセージングを使用すると、開発者はシンプルなキューイングサービス [Amazon] を使用してメッセージを送受信し、ポイントツーポイント通信を行うことができます。パブリッシュ / サブスクライブメッセージングは、シンプルな通知サービス [Amazon] の統合でサポートされています。

  • Spring Cloud AWS パラメーターストアの構成を使用すると、Spring Cloud アプリケーションは AWS パラメーターストア [Amazon] をブートストラッププロパティソースとして使用できます。これは、Spring Cloud Config サーバーまたは Consul の Key-Value ストアで提供されるサポートに相当します。

  • Spring Cloud AWS シークレットマネージャーの構成を使用すると、Spring Cloud アプリケーションは AWS シークレットマネージャー [Amazon] をブートストラッププロパティソースとして使用できます。これは、Spring Cloud Config サーバーまたは Consul の Key-Value ストアで提供されるサポートに相当します。

2. 基本セットアップ

Spring Cloud AWS モジュールを使用する前に、開発者は依存関係を選択し、Spring Cloud AWS モジュールを構成する必要があります。次の章では、依存関係の管理と、Spring AWSCloud プロジェクトの基本的な設定について説明します。

2.1. Spring Cloud AWS maven 依存関係管理

Spring Cloud AWS モジュールの依存関係は、特定のモジュールの直接構成を使用して Maven (英語) で直接使用できます。Spring Cloud AWS モジュールには、Spring モジュールのすべての推移的な依存関係と、モジュールの操作に必要な Amazon SDK が含まれています。一般的な依存関係の構成は次のようになります。

<dependencies>
  <dependency>
    <groupId>io.awspring.cloud</groupId>
    <artifactId>spring-cloud-aws-context</artifactId>
    <version>{spring-cloud-aws-version}</version>
  </dependency>
</dependencies>

モジュール名をそれぞれのモジュールに置き換えることにより、異なるモジュールを含めることができます (たとえば spring-cloud-aws-context の代わりに spring-cloud-aws-messaging )

2.2. Amazon SDK 依存関係バージョン管理

Amazon SDK は、Spring Cloud AWS よりも頻繁にリリースされます。Spring Cloud AWS によって構成されたものよりも新しいバージョンの AWSSDK を使用する必要がある場合は、AWS SDK BOM を依存関係管理セクションに追加して、AWSSDK 依存関係を構成する他の BOM 依存関係の前に宣言されていることを確認します。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-bom</artifactId>
            <version>${aws-java-sdk.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2.3. Amazon SDK 構成

Spring Cloud AWS 構成は現在、Spring Cloud AWS 名前空間によって提供されるカスタム要素を使用して行われます。JavaConfig はまもなくサポートされます。構成のセットアップは Spring XML 構成ファイルで直接行われるため、要素を直接使用できます。Spring Cloud AWS の各モジュールは、モジュールのモジュラー使用を可能にするカスタム名前空間を提供します。Spring Cloud AWS を使用するための一般的な XML 構成の概要を以下に示します。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aws-context="http://www.springframework.org/schema/cloud/aws/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/cloud/aws/context
        http://www.springframework.org/schema/cloud/aws/context/spring-cloud-aws-context.xsd">

           <aws-context:context-region region="..."/>
</beans>

アプリケーションの起動時に、Spring Cloud AWS は内部目的で、AWS SDK によって提供される EC2MetadataUtils クラスを使用して、アプリケーションが AWS クラウド環境で実行されているかどうかのチェックを実行します。バージョン 1.11.678 以降、AWS SDK は、このチェックが AWS 環境の外部で行われると、例外を除いて警告メッセージをログに記録します。この警告メッセージは、com.amazonaws.util.EC2MetadataUtils クラスで ERROR ログレベルを設定することで非表示にできます。

logging.level.com.amazonaws.util.EC2MetadataUtils=error

ContextInstanceDataAutoConfiguration が有効になっているが、アプリケーションが EC2 環境で実行されていない場合、AWS SDK は、アプリケーションログに不要なノイズを追加する可能性のある例外を除いて警告メッセージをログに記録します。この警告メッセージは、com.amazonaws.internal.InstanceMetadataServiceResourceFetcher クラスで ERROR ログレベルを設定することで非表示にできます。

logging.level.com.amazonaws.internal.InstanceMetadataServiceResourceFetcher=error

2.3.1. SDK クレデンシャルの構成

Amazon Web Service を呼び出すには、Amazon SDK の資格情報を構成する必要があります。Spring Cloud AWS は、パラメーターストアとシークレットマネージャーの構成を除いて、Spring Cloud AWS コンポーネントによって実行されるリクエストのサービス呼び出しに使用されるアプリケーションコンテキスト固有の資格情報を構成するためのサポートを提供します。アプリケーションコンテキスト全体のクレデンシャルの構成は 1 つだけである必要があります。

専用の資格情報プロバイダーが定義されていない場合、com.amazonaws.auth.DefaultAWSCredentialsProviderChain はすべてのクライアントによって使用されます。これは基本的に次の認証情報を使用します

  • 環境変数 AWS_ACCESS_KEY_ID および AWS_SECRET_ACCESS_KEY を使用します

  • システムプロパティ aws.accessKeyId および aws.secretKey を使用します

  • ユーザー固有のプロファイル資格情報ファイルを使用する

  • AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 環境変数が設定されている場合は、ECS クレデンシャルを使用します

  • インスタンスプロファイルのクレデンシャルを使用する (下記を参照)

全体的な資格情報ポリシーに基づいて、資格情報を構成するためのさまざまなオプションがあります。考えられるものについては、次のサブチャプターで説明します。

簡単な資格情報の構成

Amazon SDK の資格情報は、アクセスキー(共有される可能性があります)と秘密鍵(共有されてはならない)で構成されます。両方のセキュリティ属性は、Spring Cloud AWS モジュールによって作成された各 Amazon SDK サービスの XML 名前空間を使用して構成できます。全体の構成は次のようになります

<beans ...>
  <aws-context:context-credentials>
   <aws-context:simple-credentials access-key="AKIAIO" secret-key="wJalrXUtnFEMI/K7M" />
  </aws-context:context-credentials>
</beans>

アクセスキーとシークレットキーは、プロパティファイル(Spring Boot アプリケーション設定など)に外部化する必要があり、ソース管理システムにチェックインしないでください。

インスタンスプロファイルの構成

インスタンスプロファイル設定 [Amazon] では、EC2 インスタンスの起動時にロールによって承認されたプロファイルを割り当てることができます。EC2 インスタンスから行われたすべての呼び出しは、インスタンスプロファイル固有のユーザーロールで認証されます。構成に専用のアクセスキーとシークレットキーは必要ありません。Spring Cloud AWS のインスタンスプロファイルの構成は次のようになります。

<beans ...>
    <aws-context:context-credentials>
        <aws-context:instance-profile-credentials/>
    </aws-context:context-credentials>
</beans>
両方のセキュリティ構成を混在させる

場合によっては、両方の認証戦略を組み合わせて、アプリケーションがインスタンスプロファイルを使用し、明示的なアクセスキーとシークレットキーの構成のフォールバックを使用できるようにすると便利です。これは、アプリケーションが EC2 内(テストサーバーなど)でテストされ、ローカルでテストされる場合に役立ちます。次のスニペットは、両方のセキュリティ構成の組み合わせを示しています。

<beans ...>
   <aws-context:context-credentials>
       <aws-context:instance-profile-credentials/>
       <aws-context:simple-credentials access-key="${accessKey:}" secret-key="${secretKey:}"/>
   </aws-context:context-credentials>
</beans>

アクセスキーとシークレットキーは、プロパティがまったく構成されていない場合にブートストラップエラーを回避するために、デフォルト値とともにプレースホルダー式を使用して定義されます。

パラメーターストアとシークレットマネージャーの構成資格情報とリージョン構成

パラメーターストアおよびシークレットマネージャーの構成サポートは、ブートストラップコンテキストを使用して、com.amazonaws.auth.DefaultAWSCredentialsProviderChain および com.amazonaws.regions.DefaultAwsRegionProviderChain を使用するデフォルトの AWSSimpleSystemsManagement クライアントを構成します。これをオーバーライドする場合は、選択した資格情報やリージョンプロバイダーを使用するように構成された、型 AWSSimpleSystemsManagement の Bean を使用して独自の Spring Cloud ブートストラップ構成クラスを定義する必要 (英語) があります。このコンテキストは Spring Cloud Bootstrap コンテキストの作成時に作成されるため、通常の @Configuration クラスで Bean を単純にオーバーライドすることはできません。

2.3.2. リージョン構成

Amazon Web サービスはさまざまな領域 [Amazon] で利用できます。カスタム要件に基づいて、ユーザーはさまざまな Amazon リージョンでアプリケーションをホストできます。spring-cloud-aws-context モジュールは、アプリケーションコンテキスト全体の領域を定義する方法を提供します。

明示的な領域構成

領域は、XML 要素を使用して明示的に構成できます。これは、アプリケーションが EC2 インスタンスでホストされていないため(ローカルテストなど)、リージョンを自動的に派生できない場合、リージョンを手動でオーバーライドする必要がある場合に特に役立ちます。

<beans ...>
    <aws-context:context-region region="eu-west-1"/>
</beans>

式またはプレースホルダーを使用して設定を外部化し、領域をプロパティファイルまたはシステムプロパティで再設定できるようにすることもできます。

自動領域構成

アプリケーションコンテキストが EC2 インスタンス内で開始された場合、リージョンはインスタンスメタデータ [Amazon] から自動的にフェッチできるため、静的に設定しないでください。構成は次のようになります。

<beans ...>
  <aws-context:context-region auto-detect="true" />
</beans>
サービス固有のリージョン構成

1 つのアプリケーションコンテキストが異なるリージョンからのサービスを消費する場合、リージョンは特定のサービスに対してオーバーライドされることもあります。構成は、上記のようにグローバルに実行でき、リージョン属性を使用してサービスごとに構成できます。データベースサービスの構成は次のようになります (後で説明します)

<beans ...>
 <aws-context:context-region region="eu-central-1" />
 <jdbc:data-source ... region="eu-west-1" />
</beans>

アプリケーションごとに複数のリージョンを使用することは理論的には可能ですが、1 つのリージョン内でのみホストされるアプリケーションを作成し、同時に異なるリージョンでホストされる場合はアプリケーションを分割することを強くお勧めします。

2.3.3. Spring Boot 自動構成

Spring Cloud 包括的プロジェクトに続いて、Spring Cloud AWS は専用の Spring Boot サポートも提供します。Spring Cloud AWS は、Spring Boot プロパティを使用して構成でき、一般的な設定に基づいて適切な構成を自動的に推測します。

Maven 依存関係

Spring Cloud AWS は、Spring Boot サポートを有効にするための専用モジュールを提供します。そのモジュールは、アプリケーション内の一般的な maven 依存関係に追加する必要があります。一般的な構成は次のようになります

<dependencies>
  <dependency>
    <groupId>io.awspring.cloud</groupId>
    <artifactId>spring-cloud-aws-autoconfigure</artifactId>
    <version>{spring-cloud-version}</version>
  </dependency>
</dependencies>

メッセージングや JDBC などの特定の機能を有効にするための追加の依存関係を追加する必要があります。Spring Cloud AWS は、Spring Boot アプリケーションのクラスパスで使用可能なクラスのみを構成します。

クレデンシャルの構成

Spring Boot は、プロパティファイルまたは YAML 構成ファイルを使用してプロパティを定義する標準的な方法を提供します。Spring Cloud AWS は、Spring Boot アプリケーション構成ファイルを使用して資格情報を構成するためのサポートを提供します。

デフォルトでは、Spring Cloud AWS は AWS クレデンシャルを解決するように DefaultAWSCredentialsProviderChain [Amazon] を設定します。

他の資格情報プロバイダーが構成されている場合、DefaultAWSCredentialsProviderChain [Amazon] は使用されず、Spring Cloud AWS は次の資格情報チェーンを構成します。

  1.  cloud.aws.credentials.access-key が提供されている場合は AWSStaticCredentialsProvider 

  2.  cloud.aws.credentials.instance-profile が true に設定されている場合は EC2ContainerCredentialsProviderWrapper 

  3.  cloud.aws.credentials.profile-name が提供されている場合は ProfileCredentialsProvider 

Spring Cloud AWS は、アプリケーション全体の資格情報の設定を構成するために、次のプロパティを提供します。

プロパティ 説明

cloud.aws.credentials.access-key

AKIAIOSFODNN7EXAMPLE

静的プロバイダーで使用されるアクセスキー

cloud.aws.credentials.secret-key

wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

静的プロバイダーで使用される秘密鍵

cloud.aws.credentials.instance-profile

true

それ以上の構成なしでインスタンスプロファイル資格情報プロバイダーを構成します

cloud.aws.credentials.profile-name

default

指定された構成ファイル内の構成プロファイルの名前

cloud.aws.credentials.profile-path

~/.aws/credentials

プロファイル構成ファイルが配置されているファイルパス。値が指定されていない場合、デフォルトは ~/.aws/credentials です。

リージョンの構成

クレデンシャルと同様に、Spring Cloud AWS モジュールも Spring Boot 構成ファイル内の領域の構成をサポートします。リージョンは、DefaultAwsRegionProviderChain [Amazon] を使用して自動的に検出するか、明示的に設定できます(たとえば、AWS クラウドに対するローカルテストの場合)。

リージョンを構成するためのプロパティを以下に示します

プロパティ 説明

cloud.aws.region.static

eu-west-1

アプリケーションの静的領域を構成します。可能な領域は(現在)us-east-1、us-west-1、us-west-2、eu-west-1、eu-central-1、ap-southeast-1、ap-southeast-1、ap- です。northeast-1、sa-east-1、cn-north-1、独自のリージョンメタデータで構成されたカスタムリージョン

各統合は、特定のリージョンを持つように構成できるようになりました。このようにリージョンを指定すると、デフォルトまたは静的リージョンよりも優先されます。例:

プロパティ 説明

cloud.aws.sqs.region

eu-west-1

SQS 統合が使用するリージョンを設定します。

統合の有効化

各統合は、プロパティを介して有効または無効にできます。デフォルトでは、ContextInstanceDataAutoConfiguration を除くすべての統合が有効になっています。

プロパティ 説明

cloud.aws.sqs.enabled

false

SQS 統合の自動構成を無効にします。

エンドポイントの構成

統合された AWS サービスごとに、設定プロパティを使用してカスタムエンドポイントを使用するように Spring Cloud AWS を設定できます。例:

cloud.aws.s3.endpoint=http://localhost:4566
cloud.aws.sqs.endpoint=http://localhost:4566
cloud.aws.rds.endpoint=http://localhost:4566

カスタムエンドポイントの使用は、統合テストで Localstack [GitHub] (英語) を使用する場合、または MinIO (英語) などの AWS 互換のサードパーティサービスと統合する場合に特に役立ちます。

クライアント構成の構成

一部の AWS サービス統合では、カスタム ClientConfiguration を使用するように Spring Cloud AWS を設定できます。

すべての統合で使用されるデフォルトの ClientConfiguration をオーバーライドするには、com.amazonaws.ClientConfiguration.BEAN_NAME という名前の型 ClientConfiguration の Bean を作成します。

@Configuration
class CustomAwsConfiguration {

    @Bean(name = "com.amazonaws.ClientConfiguration.BEAN_NAME")
    ClientConfiguration clientConfiguration() {
        ClientConfiguration clientConfiguration= new ClientConfiguration();
        clientConfiguration.setProxyHost(proxyHost);
        clientConfiguration.setProxyPort(proxyPort);
        clientConfiguration.setProxyUsername(proxyUserName);
        clientConfiguration.setProxyPassword(proxyPassword);
        return clientConfiguration;
    }
}

型 ClientConfiguration の Bean と統合に固有の名前を定義することにより、特定の統合に ClientConfiguration を提供することもできます。

SQS

sqsClientConfiguration

SNS

snsClientConfiguration

SES

sesClientConfiguration

RDS

rdsClientConfiguration

ElastiCache

elastiCacheClientConfiguration

CloudWatch

cloudWatchClientConfiguration

例:

@Configuration
class CustomSqsConfiguration {

    @Bean
    ClientConfiguration sqsClientConfiguration() {
        ClientConfiguration clientConfiguration= new ClientConfiguration();
        clientConfiguration.setProxyHost(proxyHost);
        clientConfiguration.setProxyPort(proxyPort);
        clientConfiguration.setProxyUsername(proxyUserName);
        clientConfiguration.setProxyPassword(proxyPassword);
        return clientConfiguration;
    }
}

3. クラウド環境

アプリケーションは、特に Amazon クラウド環境のように変化する環境では、環境固有の構成情報を必要とすることがよくあります。Spring Cloud AWS は、プロパティプレースホルダーや Spring 式言語などの一般的な Spring メカニズムを使用して、アプリケーションコンテキスト内の環境固有のデータを取得して使用するためのサポートを提供します。

3.1. インスタンスメタデータの取得

インスタンスメタデータ [Amazon] は EC2 環境内で利用できます。メタデータは、インスタンスメタデータを提供する特別な HTTP アドレスを使用してクエリできます。Spring Cloud AWS を使用すると、アプリケーションは、外部 HTTP サービスを呼び出すことなく、式またはプロパティのプレースホルダーでこのメタデータに直接アクセスできます。

3.1.1. XML によるインスタンスメタデータサポートの有効化

インスタンスメタデータ取得のサポートは、Spring の標準プロパティプレースホルダーのような XML 要素を介して有効になります。次のコードサンプルは、アプリケーションコンテキスト内でのインスタンスメタデータサポートのアクティブ化を示しています。

<beans ...>
     <aws-context:context-instance-data />
</beans>

インスタンスメタデータは、認可されたサービスコールなしで取得できるため、上記の構成では、リージョンまたはセキュリティ固有の構成は必要ありません。

3.1.2. Java でインスタンスメタデータサポートを有効にする

インスタンスメタデータは、XML 構成を必要とせずに Java 構成クラス内で構成することもできます。次の例は、io.awspring.cloud.context.config.annotation.EnableInstanceData でインスタンスメタデータを有効にする典型的な Spring @Configuration クラスを示しています。

@Configuration
@EnableContextInstanceData
public static class ApplicationConfiguration {
}

3.1.3. Spring Boot でのインスタンスメタデータサポートの有効化

インスタンスメタデータは、アプリケーションが EC2 インスタンスで実行されており、cloud.aws.instance.data.enabled プロパティが true に設定されている場合、プロパティソースとして Spring Boot アプリケーションで使用できます。

3.1.4. インスタンスメタデータの使用

インスタンスメタデータは、XML、Java プレースホルダー、式で使用できます。以下の例は、プレースホルダーを使用した XML ファイル内のインスタンスメタデータの使用箇所と、特別な変数 environment を参照する式を示しています。

<beans ...>
 <bean class="io.awspring.cloud....SimpleConfigurationBean">
    <property name="value1" value="#{environment.ami-id}" />
    <property name="value2" value="#{environment.hostname}" />
    <property name="value3" value="${instance-type}" />
    <property name="value4" value="${instance-id}" />
 </bean>
</beans>

インスタンスメタデータは、Spring org.springframework.beans.factory.annotation.Value アノテーションを使用して Java フィールドに直接挿入することもできます。次の例は、Spring Bean 内でのインスタンスメタデータの使用を示しています。

@Component
public class ApplicationInfoBean {

    @Value("${ami-id:N/A}")
    private String amiId;

    @Value("${hostname:N/A}")
    private String hostname;

    @Value("${instance-type:N/A}")
    private String instanceType;

    @Value("${services/domain:N/A}")
    private String serviceDomain;
}

すべてのインスタンスメタデータには、インスタンスメタデータサービス [Amazon] で使用可能なキーでアクセスできます。ネストされたプロパティには、プロパティをスラッシュ('/')で区切ってアクセスできます。

3.1.5. インスタンスユーザーデータの使用

デフォルトのインスタンスメタデータに加えて、各インスタンスでユーザーデータを構成することもできます。このユーザーデータは、Spring Cloud AWS によって取得および解析されます。ユーザーデータは、アプリケーションで EC2 インスタンスを起動するときに定義できます。Spring Cloud AWS は、文字列を解析してキーと値のペアを抽出できるように、ユーザーデータ内に <key>:<value>;<key>:<value> 形式を想定しています。

ユーザーデータは、以下に示す管理コンソールまたは CloudFormation テンプレート [Amazon] のいずれかを使用して構成できます。

User data in the management console

ユーザーデータを構成するための CloudFormation テンプレートスニペットの概要を以下に示します。

...
"Resources": {
 "ApplicationServerInstance": {
  "Type": "AWS::EC2::Instance",
  "Properties": {
   "ImageId": "ami-6a56b81d",
   "UserData": {
      "Fn::Base64": "data1:value1;data2:value2"
    },
   "InstanceType": "t1.micro",
  }
}
...

ユーザーデータには、プレースホルダーや式を介して、インスタンスメタデータなどのアプリケーションコンテキストで直接アクセスできます。

@Component
public class SecondConfigurationBean {

    @Value("${data1}")
    private String firstDataOption;

    @Value("${data2}")
    private String secondDataOption;
}

3.1.6. インスタンスタグの使用

ユーザー構成プロパティは、ユーザーデータの代わりにタグを使用して構成することもできます。タグは、Amazon Web サービスのコンテキストにおけるグローバルな概念であり、さまざまなサービスで使用されます。Spring Cloud AWS は、さまざまなサービス間でもインスタンスタグをサポートします。ユーザーデータと比較して、ユーザータグは実行時に更新でき、インスタンスを停止して再起動する必要はありません。

ユーザーデータ [Amazon] は、インスタンスの起動時にスクリプトを実行するためにも使用できます。インスタンスの起動時にスクリプトを実行するために、ユーザー構成とユーザーデータにインスタンスタグを活用すると便利です。

インスタンス固有のタグは、以下に概説する管理コンソールを介してインスタンスレベルで構成でき、ユーザーデータと同様に、後で表示される CloudFormation テンプレートを使用して構成できます。

Instance data in the management console

インスタンスタグを構成するための CloudFormation テンプレートスニペットの概要を以下に示します。

...
"Resources": {
    "UserTagAndUserDataInstance": {
        "Type": "AWS::EC2::Instance",
        "Properties": {
            "ImageId": "ami-6a56b81d",
            "InstanceType": "t1.micro",
            "Tags": [
            {
                "Key": "tag1",
                "Value": "tagv1"
            },
            {
                "Key": "tag3",
                "Value": "tagv3"
            },
            {
                "Key": "tag2",
                "Value": "tagv2"
            },
            {
                "Key": "tag4",
                "Value": "tagv4"
            }
            ]
        }
    }
}
...

インスタンスタグを取得するには、Spring Cloud AWS は認証されたリクエストを行う必要があるため、プレースホルダーを実際に解決する前に、リージョンとセキュリティの構成が必要になります。また、インスタンスタグは、アプリケーションコンテキストの開始時には使用できないため、式としてのみ参照でき、プレースホルダーでは参照できません。context-instance-data 要素は、名前のアプリケーションコンテキストでマップを作成する属性 user-tags-map を定義します。このマップは、他の Bean 定義の式を使用して照会できます。

<beans ...>
 <aws-context:context-instance-data user-tags-map="instanceData" />
</beans>

java Bean は、@Value アノテーションを使用して式を解決する場合があります。

public class SimpleConfigurationBean {

   @Value("#{instanceData.tag1}")
   private String value1;

   @Value("#{instanceData.tag2}")
   private String value2;

   @Value("#{instanceData.tag3}")
   private String value3;

   @Value("#{instanceData.tag4}")
   private String value4;
}

3.1.7. カスタム EC2 クライアントの設定

状況によっては、インスタンス情報を取得するためにカスタム EC2 クライアントが必要になります。context-instance-data エレメントは、amazon-ec2 属性を持つカスタム EC2 クライアントをサポートします。次の例は、特別な設定が行われている可能性のあるカスタム EC2 クライアントの使用を示しています。

<beans ...>

  <aws-context:context-credentials>....</aws-context:context-credentials>
  <aws-context:context-region ... />
  <aws-context:context-instance-data  amazon-ec2="myCustomClient"/>

  <bean id="myCustomClient" class="com.amazonaws.services.ec2.AmazonEC2Client">
    ...
  </bean>
</beans>

3.1.8. デフォルトの EC2 クライアントを注入する

インスタンスデータ用に設定されたユーザータグがある場合(上記を参照)、Spring Cloud AWS は指定されたリージョンとセキュリティクレデンシャルを使用して EC2 クライアントを設定します。アプリケーション開発者は、@Autowired アノテーションを使用して、EC2 クライアントをコードに直接挿入できます。

public class ApplicationService {

    private final AmazonEC2 amazonEc2;

    @Autowired
    public ApplicationService(AmazonEC2 amazonEc2) {
        this.amazonEc2 = amazonEc2;
    }
}

3.2. Spring Cloud アプリケーションを AWS パラメーターストアと統合する

Spring Cloud は、一元化された構成のサポートを提供します。これは、アプリケーションの起動時に通常の Spring PropertySource として読み取って使用できるようにすることができます。パラメーターストア構成を使用すると、AWS パラメーターストア [Amazon] でこのメカニズムを使用できます。

spring-cloud-starter-aws-parameter-store-config スターターモジュールへの依存関係を追加するだけで、サポートがアクティブになります。このサポートは、Spring Cloud Config サーバーまたは Consul の Key-Value ストアで提供されるサポートと似ています。構成パラメーターは、すべてのサービス間または特定のサービスで共有するように定義でき、プロファイル固有にすることができます。暗号化された値は、取得時に復号化されます。

すべての構成パラメーターは、共通のパスプレフィックスから取得されます。デフォルトは /config です。そこから、共有パラメーターはデフォルトで application に設定されたパスから取得され、サービス固有のパラメーターはデフォルトで構成済みの spring.application.name に設定されたパスを使用します。ドットとスラッシュの両方を使用して、構成キーの名前を指定できます。アクティブ化されたプロファイルの名前は、デフォルトでアンダースコアになっている区切り文字を使用してパスに追加されます。

つまり、my-service と呼ばれるサービスの場合、モジュールはデフォルトで次のパラメーターを見つけて使用します。

パラメーターキー Spring プロパティ 説明

/config/application/cloud.aws.stack.name

cloud.aws.stack.name

構成サポートが有効になっているすべてのサービスで共有されます。サービス固有またはプロファイル固有のプロパティで上書きできます。

/config/application_production/cloud.aws.stack.name

cloud.aws.stack.name

構成サポートが有効になっていて、production Spring プロファイルがアクティブになっているすべてのサービスによって共有されます。サービス固有のプロパティでオーバーライドできます。

/config/my-service/cloud/aws/stack/auto

cloud.aws.stack.auto

my-service サービスに固有です。キーパスのスラッシュがドットに置き換えられていることに注意してください。

/config/my-service_production/cloud/aws/stack/auto

cloud.aws.stack.auto

production Spring プロファイルがアクティブ化されたときの my-service サービスに固有です。

このモジュールは、たとえば次のようなパラメーター値として使用される完全な構成ファイルをサポートしていないことに注意してください。Spring Cloud Consul の機能: AWS パラメーター値は 4096 文字に制限されているため、個々の Spring プロパティの構成のみをサポートしています。

Spring Cloud bootstrap.properties または bootstrap.yml ファイルで次の設定を構成できます(緩和されたプロパティバインディングが適用されるため、この正確な構文を使用する必要はありません)。

プロパティ デフォルト 説明

aws.paramstore.prefix

/config

パラメーターストアからロードされたすべてのプロパティの最初のレベルを示すプレフィックス。値は、スラッシュで始まり、その後に 1 つ以上の有効なパスセグメントが続くか、空である必要があります。

aws.paramstore.defaultContext

application

すべてのサービスで共有されるプロパティを定義するコンテキストの名前

aws.paramstore.profileSeparator

_

追加されたプロファイルをコンテキスト名から分離する文字列。英数字の横には、ドット、ダッシュ、スラッシュ、円記号、下線のみを含めることができます。

aws.paramstore.failFast

true

パラメーターの取得中にエラーが発生した場合に、アプリケーションの起動に失敗するかどうかを示します。

aws.paramstore.name

spring.application.name の構成値

この特定のサービスを検索するためのプロパティのパスを作成するときに使用する名前。

aws.paramstore.enabled

true

自動構成がクラスパス上にある場合でも、パラメーターストア構成のサポートを無効にするために使用できます。

aws.paramstore.region

eu-central-1

リージョン AWSSimpleSystemsManagementClients を構成するために使用できます。

アプリケーションの起動時に AWS パラメーターストアから取得されるプロパティを確認するには、io.awspring.cloud.paramstore.AwsParamStorePropertySource クラスで DEBUG ロギングをオンにします。

logging.level.io.awspring.cloud.paramstore.AwsParamStorePropertySource=debug

spring-cloud 2020.0.0 (別名 Ilford)では、ブートストラップフェーズはデフォルトで有効ではなくなりました。それを有効にするには、追加の依存関係が必要です。

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bootstrap</artifactId>
  <version>{spring-cloud-version}</version>
</dependency>

ただし、spring-cloud-aws 2.3 から開始すると、デフォルトの aws パラメーターストアキーをインポートできます

プロパティ 説明

spring.config.import=aws-parameterstore:

各アクティブプロファイルの spring.application.name プロパティ値に基づいてパラメーターをインポートする

spring.config.import=aws-parameterstore:config-key;other-config-key

個々のキーによるパラメーターのインポート

spring.config.import=optional:aws-parameterstore:config-key;other-config-key

optional では、指定したパラメーターのパラメーターが見つからなくてもアプリケーションが起動します。

Spring Boot 2.4 はファイルのロード方法を変更しました。これは、spring-cloud-aws のプロファイルのロードも変更されたことを意味します。ファイル固有のロードに関する Spring Boot リファレンスドキュメントへのリンク: リファレンスドキュメント公式の詳細: Spring ブログ (英語)

3.3. IAM パーミッション

Spring Cloud AWS には、次の IAM 権限が必要です。

特定のパスからパラメーターを取得する

ssm:GetParametersByPath

パラメーターストアへのアクセスを許可するサンプル IAM ポリシー:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ssm:GetParametersByPath",
            "Resource": "yourArn"
        }
    ]
}

3.4. Spring Cloud アプリケーションを AWSSecretsManager と統合する

Spring Cloud は、一元化された構成のサポートを提供します。これは、アプリケーションの起動時に通常の Spring PropertySource として読み取って使用できるようにすることができます。シークレットマネージャーの構成では、AWS シークレットマネージャー [Amazon] でこのメカニズムを使用できます。

spring-cloud-starter-aws-secrets-manager-config スターターモジュールへの依存関係を追加するだけで、サポートがアクティブになります。このサポートは、Spring Cloud Config サーバーまたは Consul の Key-Value ストアで提供されるサポートと似ています。構成パラメーターは、すべてのサービス間または特定のサービスで共有するように定義でき、プロファイル固有にすることができます。

すべての構成パラメーターは、共通のパスプレフィックスから取得されます。デフォルトは /secret です。そこから、共有パラメーターはデフォルトで application に設定されたパスから取得され、サービス固有のパラメーターはデフォルトで構成済みの spring.application.name に設定されたパスを使用します。ドットとスラッシュの両方を使用して、構成キーの名前を指定できます。アクティブ化されたプロファイルの名前は、デフォルトでアンダースコアになっている区切り文字を使用してパスに追加されます。

つまり、my-service と呼ばれるサービスの場合、モジュールはデフォルトで次のパラメーターを見つけて使用します。

パラメーターキー 説明

/secret/application

構成サポートが有効になっているすべてのサービスで共有されます。サービス固有またはプロファイル固有のプロパティで上書きできます。

/secret/application_production

構成サポートが有効になっていて、production Spring プロファイルがアクティブになっているすべてのサービスによって共有されます。サービス固有のプロパティでオーバーライドできます。

/secret/my-service

my-service サービスに固有です。

/secret/my-service_production

production Spring プロファイルがアクティブ化されたときの my-service サービスに固有です。

Spring Cloud bootstrap.properties または bootstrap.yml ファイルで次の設定を構成できます(緩和されたプロパティバインディングが適用されるため、この正確な構文を使用する必要はありません)。

プロパティ デフォルト 説明

aws.secretsmanager.prefix

/secret

シークレットマネージャーからロードされたすべてのプロパティの最初のレベルを示すプレフィックス。値は、スラッシュで始まり、その後に 1 つ以上の有効なパスセグメントが続くか、空である必要があります。

aws.secretsmanager.defaultContext

application

すべてのサービスで共有されるプロパティを定義するコンテキストの名前

aws.secretsmanager.profileSeparator

_

追加されたプロファイルをコンテキスト名から分離する文字列。英数字の横には、ドット、ダッシュ、スラッシュ、円記号、下線のみを含めることができます。

aws.secretsmanager.failFast

true

シークレットの取得中にエラーが発生した場合に、アプリケーションの起動に失敗するかどうかを示します。

aws.secretsmanager.name

spring.application.name の構成値

この特定のサービスを検索するためのプロパティのパスを作成するときに使用する名前。

aws.secretsmanager.enabled

true

自動構成がクラスパス上にある場合でも、SecretsManager 構成のサポートを無効にするために使用できます。

aws.secretsmanager.region

eu-central-1

AWSSecretsManagerClient のリージョンを設定するために使用できます。

spring-cloud 2020.0.0 (別名 Ilford)では、ブートストラップフェーズはデフォルトで有効ではなくなりました。それを有効にするには、追加の依存関係が必要です。

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bootstrap</artifactId>
  <version>{spring-cloud-version}</version>
</dependency>

ただし、spring-cloud-aws 2.3 から開始すると、デフォルトの awssecretsmanager キーをインポートできます

プロパティ 説明

spring.config.import=aws-secretsmanager:

各アクティブプロファイルの spring.application.name プロパティ値に基づいてパラメーターをインポートする

spring.config.import=aws-secretsmanager:secret-key;other-secret-key

個々のキーによるシークレットのインポート

spring.config.import=optional:aws-secretsmanager:secret-key;other-secret-key

optional を使用すると、指定したシークレットのシークレットが見つからなくてもアプリケーションが起動します。

Spring Boot 2.4 はファイルのロード方法を変更しました。これは、spring-cloud-aws のプロファイルのロードも変更されたことを意味します。ファイル固有のロードに関する Spring Boot リファレンスドキュメントへのリンク: リファレンスドキュメント公式 Spring ブログ (英語) の詳細を読む

3.5. IAM パーミッション

Spring Cloud AWS には、次の IAM 権限が必要です。

秘密の価値を得る:

secretsmanager:GetSecretValue

シークレットマネージャーへのアクセスを許可するサンプル IAM ポリシー:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "yourArn"
        }
    ]
}

4. クラウド環境の管理

管理コンソールを使用して手動で環境を管理することは拡張性がなく、インフラストラクチャの複雑さが増すにつれてエラーが発生しやすくなる可能性があります。Amazon Web サービスは、スタック構成テンプレートを定義し、サービスを使用してインフラストラクチャ全体をブートストラップできる CloudFormation [Amazon] サービスを提供します。複数のスタックを並行して使用できるようにするために、スタック内の各リソースは、任意に生成された名前を含む一意の物理名を受け取ります。スタックリソースと統一された方法で対話するために、Spring Cloud AWS を使用すると、開発者はランダムな物理名ではなく論理名を使用できます。

次の図は、一般的なスタック構成を示しています。

CloudFormation overview

テンプレートファイルは、すべてのスタックリソースを論理名で記述します。CloudFormation サービスは、スタックテンプレートファイルを解析し、物理名を使用してすべてのリソースを作成します。アプリケーションは、テンプレートで定義された論理名で、スタックで構成されたすべてのリソースを使用できます。Spring Cloud AWS は、すべての論理名をアプリケーション開発者のそれぞれの物理名に解決します。

4.1. 依存関係

Spring Cloud AWS で CloudFormation サポートを有効にするには、ContextStackAutoConfiguration をトリガーする次の依存関係を追加する必要があります。

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-cloudformation</artifactId>
</dependency>

4.2. 自動 CloudFormation 構成

アプリケーションがスタック内で実行されている場合(基盤となる EC2 インスタンスがスタック内でブートストラップされているため)、Spring Cloud AWS は自動的にスタックを検出し、スタックからすべてのリソースを解決します。アプリケーション開発者は、スタックテンプレートのすべての論理名を使用して、サービスと対話できます。以下の例では、データベースリソースは CloudFormation テンプレートを使用して構成され、データベースインスタンスの論理名を定義しています。

"applicationDatabase": {
  "Type": "AWS::RDS::DBInstance",
  "Properties": {
    "AllocatedStorage": "5",
    "DBInstanceClass": "db.t1.micro",
    "DBName": "test"
    ...
  ]
 }
}

次に、データソースが作成され、データベースサービス名として物理名(ir142c39k6o5irj など)を受け取ります。アプリケーション開発者は、論理名(この場合は applicationDatabase)を使用してデータベースと対話できます。以下の例は、要素 aws-context:stack-configuration によって定義され、特定のスタックを自動的に解決するスタック構成を示しています。data-source エレメントは、db-instance-identifier 属性の論理名を使用してデータベースを操作します。

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aws-context="http://www.springframework.org/schema/cloud/aws/context"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/cloud/aws/context
       http://www.springframework.org/schema/cloud/aws/context/spring-cloud-aws-context.xsd">

  <aws-context:context-credentials>
    ...
  </aws-context:context-credentials>

  <aws-context:context-region .. />

  <aws-context:stack-configuration/>

  <jdbc:data-source db-instance-identifier="applicationDatabase" ... />
</beans>

Amazon RDS の構成とセットアップの詳細については、このドキュメントのそれぞれの章を参照してください。

4.3. 手動 CloudFormation 構成

アプリケーションがスタック構成された EC2 インスタンス内で実行されていない場合は、スタック構成を手動で構成する必要があります。構成は、実行時にそれぞれのスタック構成情報をすべて解決するために使用される追加の要素属性 stack-name で構成されます。

<beans ....>
    ...
  <aws-context:stack-configuration stack-name="myStackName" />
    ...
</beans>

4.4. Java 構成クラスを使用した CloudFormation 構成

Spring Cloud AWS は、Java クラス内の CloudFormation サポートの構成もサポートし、アプリケーション構成内での XML の使用を回避します。Spring Cloud AWS は、自動および手動のスタック構成を可能にするアノテーション og.springframework.cloud.aws.context.config.annotation.EnableStackConfiguration を提供します。次の例は、明示的なスタック名(ここでは manualStackName)を使用して CloudFormation サポートを構成する構成クラスを示しています。

@Configuration
@EnableStackConfiguration(stackName = "manualStackName")
class ApplicationConfiguration {
}

自動スタック名を有効にする必要がある場合は、stackName 属性を定義しないでください。

4.5. Spring Boot の CloudFormation 構成

Spring Cloud AWS は、Spring Boot 構成内の CloudFormation サポートの構成もサポートします。手動および自動スタック構成は、以下の表で説明されているプロパティを使用して定義できます。

プロパティ 説明

cloud.aws.stack.name

myStackName

リソースの取得に使用される手動で構成されたスタック名の名前。

cloud.aws.stack.auto

true

アプリケーションの自動スタック名検出を有効にします。

4.6. 手動の名前解決

Spring Cloud AWS は、CloudFormation スタックを使用して、論理名を使用してすべてのリソースを内部的に解決します。状況によっては、アプリケーションコード内の物理名を解決する必要がある場合があります。Spring Cloud AWS は、論理名に基づいて物理スタック名を解決するための事前構成済みサービスを提供します。サンプルは、手動のスタックリソース解決を示しています。

@Service
public class ApplicationService {

 private final ResourceIdResolver resourceIdResolver;

 @Autowired
 public ApplicationService(ResourceIdResolver resourceIdResolver) {
    this.resourceIdResolver = resourceIdResolver;
 }

 public void handleApplicationLogic() {
    String physicalBucketName =
        this.resourceIdResolver.resolveToPhysicalResourceId("someLogicalName");
 }
}

4.7. スタックタグ

Amazon EC2 インスタンスと同様に、CloudFormation は、スタック固有の構成情報を構成してアプリケーション内で受信するために使用できるスタック固有のタグも提供します。これは、たとえば、ステージ固有の構成プロパティ(DEV、INT、PRD など)にすることができます。

<beans ....>
    ...
    <aws-context:stack-configuration user-tags-map="stackTags"/>
    ...
</beans>

その後、アプリケーションは #{stackTags.key1} のような式でスタックタグにアクセスできます。

4.8. カスタム CloudFormation クライアントの使用

EC2 構成セットアップと同様に、aws-context:stack-configuration 要素は特別なセットアップでカスタム CloudFormation クライアントをサポートします。クライアント自体は、例に示すように amazon-cloud-formation 属性を使用して構成できます。

<beans>
    <aws-context:stack-configuration amazon-cloud-formation=""/>

    <bean class="com.amazonaws.services.cloudformation.AmazonCloudFormationClient">
    </bean>
</beans>

5. メッセージング

Spring Cloud AWS は、Amazon SQS Amazon SNS の統合を提供し、SQS または SNS を介したメッセージの発行と消費を簡素化します。SQS は Spring 4.0 で導入されたメッセージング API に完全に依存していますが、プッシュ通知では受信部分を異なる方法で処理する必要があるため、SNS は部分的にしか実装していません。

5.1. メッセージングの構成

メッセージングサポートを使用および構成する前に、アプリケーションはそれぞれのモジュールの依存関係を Maven 構成に含める必要があります。Spring Cloud AWS メッセージングのサポートは、モジュールをモジュール化して使用できるようにするための個別のモジュールとして提供されます。

5.1.1. Maven 依存関係の構成

Spring Cloud AWS メッセージングモジュールはスタンドアロンモジュールとして提供され、次の依存関係宣言を使用してインポートできます。

<dependency>
    <groupId>io.awspring.cloud</groupId>
    <artifactId>spring-cloud-aws-messaging</artifactId>
    <version>{spring-cloud-version}</version>
</dependency>

5.2. SQS サポート

Amazon SQS は、キューとのポイントツーポイント通信を提供する Amazon Web Service プラットフォーム上のホスト型メッセージングサービスです。JMS または他のメッセージサービスと比較して、Amazon SQS には、考慮すべきいくつかの機能と制限があります。

  • Amazon SQS は String ペイロードのみを許可するため、Object はすべて文字列表現に変換する必要があります。Spring Cloud AWS は、Java オブジェクトを JSON に変換することにより、Amazon SQS メッセージを含む Java オブジェクトを転送するための専用サポートを備えています。

  • Amazon SQS はトランザクションをサポートしていないため、メッセージが 2 回取得される可能性があります。アプリケーションは、メッセージを 2 回受信できるように、べき等の方法で作成する必要があります。

  • Amazon SQS の最大メッセージサイズはメッセージあたり 256kb であるため、より大きなメッセージは送信されません。

5.2.1. メッセージを送る

QueueMessagingTemplate には、メッセージを送信するための多くの便利なメソッドが含まれています。QueueMessageChannel オブジェクトを使用して宛先を指定する send メソッドと、SQSAPI に対して解決される文字列を使用して宛先を指定する send メソッドがあります。宛先引数をとらない send メソッドは、デフォルトの宛先を使用します。

import com.amazonaws.services.sqs.AmazonSQSAsync;
import org.springframework.beans.factory.annotation.Autowired;
import io.awspring.cloud.messaging.core.QueueMessagingTemplate;
import org.springframework.messaging.support.MessageBuilder;

public class SqsQueueSender {

    private final QueueMessagingTemplate queueMessagingTemplate;

    @Autowired
    public SqsQueueSender(AmazonSQSAsync amazonSQSAsync) {
        this.queueMessagingTemplate = new QueueMessagingTemplate(amazonSQSAsync);
    }

    public void send(String message) {
        this.queueMessagingTemplate.send("physicalQueueName", MessageBuilder.withPayload(message).build());
    }
}

この例では、MessageBuilder クラスを使用して、文字列ペイロードを含むメッセージを作成します。QueueMessagingTemplate は、AmazonSQSAsync クライアントへの参照を渡すことによって構築されます。send メソッドの宛先は、AWS で定義されたキュー名と一致する必要がある文字列値です。この値は、Amazon SQS クライアントによって実行時に解決されます。オプションで、ResourceIdResolver 実装を QueueMessagingTemplate コンストラクターに渡して、CloudFormation スタック内で実行するときに論理名でリソースを解決できます(リソース名解決の詳細については、クラウド環境の管理を参照してください)。

メッセージング名前空間を使用すると、QueueMessagingTemplate を XML 構成ファイルで定義できます。

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aws-context="http://www.springframework.org/schema/cloud/aws/context"
    xmlns:aws-messaging="http://www.springframework.org/schema/cloud/aws/messaging"
    xmlns="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/cloud/aws/context
        http://www.springframework.org/schema/cloud/aws/context/spring-cloud-aws-context.xsd
        http://www.springframework.org/schema/cloud/aws/messaging
        http://www.springframework.org/schema/cloud/aws/messaging/spring-cloud-aws-messaging">

    <aws-context:context-credentials>
        <aws-context:instance-profile-credentials />
    </aws-context:context-credentials>

    <aws-messaging:queue-messaging-template id="queueMessagingTemplate" />

</beans>

この例では、メッセージング名前空間ハンドラーが新しい QueueMessagingTemplate を作成します。AmazonSQSAsync クライアントは自動的に作成され、提供された資格情報に基づいてテンプレートのコンストラクターに渡されます。アプリケーションが構成済みの CloudFormation スタック内で実行される場合、ResourceIdResolver がコンストラクターに渡されます(リソースの名前解決の詳細については、クラウド環境の管理を参照してください)。

メッセージコンバーターの使用

ドメインモデルオブジェクトの送信を容易にするために、QueueMessagingTemplate には、メッセージのデータコンテンツの引数として Java オブジェクトを受け取るさまざまな send メソッドがあります。QueueMessagingTemplate のオーバーロードされたメソッド convertAndSend() および receiveAndConvert() は、変換プロセスを MessageConverter インターフェースのインスタンスに委譲します。このインターフェースは、Java オブジェクトと SQS メッセージの間で変換するための単純な契約を定義します。デフォルトの実装 SimpleMessageConverter は、ターゲット型と一致する限り、メッセージペイロードを単純にアンラップします。コンバーターを使用することにより、ユーザーとアプリケーションコードは、SQS を介して送受信されるビジネスオブジェクトに焦点を当てることができ、SQS メッセージとしてどのように表現されるかについての詳細を気にする必要はありません。

SQS は String ペイロードのみを送信できるため、デフォルトのコンバーター SimpleMessageConverter は String ペイロードの送信にのみ使用する必要があります。より複雑なオブジェクトの場合は、メッセージング名前空間ハンドラーによって作成されたもののようなカスタムコンバーターを使用する必要があります。

XML メッセージング名前空間を使用して QueueMessagingTemplate を作成することをお勧めします。これにより、Jackson がクラスパス上にあるときにオブジェクトを JSON に変換するより洗練された MessageConverter が設定されます。

<aws-messaging:queue-messaging-template id="queueMessagingTemplate" />
this.queueMessagingTemplate.convertAndSend("queueName", new Person("John, "Doe"));

この例では、メッセージング名前空間を使用して QueueMessagingTemplate が作成されます。convertAndSend メソッドは、構成された MessageConverter を使用してペイロード Person を変換し、メッセージを送信します。

5.2.2. メッセージを受信する

SQS メッセージを受信するには、QueueMessagingTemplate の receive メソッドを使用する方法と、アノテーション駆動型リスナーエンドポイントを使用する方法の 2 つがあります。後者は、メッセージを受信するためのはるかに便利な方法です。

Person person = this.queueMessagingTemplate.receiveAndConvert("queueName", Person.class);

この例では、QueueMessagingTemplate は SQS キューから 1 つのメッセージを取得し、それを引数として渡されたターゲットクラスに変換します。

5.2.3. アノテーションドリブンリスナーエンドポイント

アノテーション駆動型リスナーエンドポイントは、SQS メッセージをリッスンするための最も簡単な方法です。メソッドに MessageMapping でアノテーションを付けるだけで、QueueMessageHandler はメッセージをアノテーション付きのメソッドにルーティングします。

<aws-messaging:annotation-driven-queue-listener />
@SqsListener("queueName")
public void queueListener(Person person) {
    // ...
}

この例では、MessageMapping アノテーションに渡された SQS queueName をポーリングするキューリスナーコンテナーが開始されます。受信メッセージはターゲット型に変換されてから、アノテーション付きメソッド queueListener が呼び出されます。

ペイロードに加えて、ヘッダーは @Header または @Headers アノテーションを使用してリスナーメソッドに挿入できます。@Header は特定のヘッダー値を挿入するために使用され、@Headers はすべてのヘッダーを含む Map<String, String> を挿入します。

SQS メッセージで送信される標準のメッセージ属性 [Amazon] のみが完全にサポートされています。カスタムメッセージ属性は、カスタム型 ラベル (型名の '.' 以降のすべて) が属性キーに存在しないかのように処理されます。これは変換中に暗黙的に省略されますが、元のメッセージが 'sourceData' ヘッダーに存在する限り、引き続きアクセスできます。

提供されている引数リゾルバーに加えて、aws-messaging:argument-resolvers 属性を使用してカスタムリゾルバーを aws-messaging:annotation-driven-queue-listener 要素に登録できます(以下の例を参照)。

<aws-messaging:annotation-driven-queue-listener>
    <aws-messaging:argument-resolvers>
        <bean class="org.custom.CustomArgumentResolver" />
    </aws-messaging:argument-resolvers>
</aws-messaging:annotation-driven-queue-listener>

デフォルトでは、SimpleMessageListenerContainer は、コアおよび最大プールサイズの計算値を使用して ThreadPoolTaskExecutor を作成します。コアプールサイズはキュー数の 2 倍に設定され、最大プールサイズは、キュー数に maxNumberOfMessages フィールドの値を掛けることによって取得されます。これらのデフォルト値がアプリケーションのニーズを満たさない場合は、task-executor 属性を使用してカスタムタスクエグゼキュータを設定できます(以下の例を参照)。

<aws-messaging:annotation-driven-queue-listener task-executor="simpleTaskExecutor" />

5.2.4. FIFO キューのサポート

Spring Cloud AWS が SQS との通信にデフォルトで使用する AmazonSQSBufferedAsyncClient は、FIFO キューと互換性がありません。Spring Cloud SQS で FIFO キューを使用するには、デフォルトの SQS クライアント Bean を AmazonSQSBufferedAsyncClient に基づかないカスタムクライアントで上書きすることをお勧めします。例:

import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.services.sqs.AmazonSQSAsync;
import com.amazonaws.services.sqs.AmazonSQSAsyncClientBuilder;
import io.awspring.cloud.core.region.RegionProvider;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    AmazonSQSAsync amazonSQS(AWSCredentialsProvider awsCredentialsProvider, RegionProvider regionProvider,
            ClientConfiguration clientConfiguration) {
        return AmazonSQSAsyncClientBuilder.standard().withCredentials(awsCredentialsProvider)
                .withClientConfiguration(clientConfiguration).withRegion(regionProvider.getRegion().getName()).build();
    }
}
削除ポリシー

SQS 統合は、メッセージの処理時に使用される削除ポリシーをサポートします。正常に削除されなかった SQS メッセージはエラーとしてログに記録されることに注意してください。

ALWAYS

成功(例外がスローされない)または失敗した場合は、常にメッセージを削除します (例外がスローされました)

NEVER

このポリシーメソッドを使用する場合、リスニングはメッセージの削除に注意する必要があります。

NO_REDRIVE

リドライブポリシーが定義されていない場合、メッセージを削除します

ON_SUCCESS

リスナーメソッドによって正常に実行された場合にのみメッセージを削除します (例外はスローされません)

DEFAULT

変更されていない場合のデフォルトは NO_REDRIVE に設定されています。

削除ポリシーは @SqsListener 内で指定できます。ポリシーが @SqsListener で明示的に使用されている場合、グローバル削除ポリシーよりも優先されます。

@SqsListener(value = "queueName", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)

すべての @SqsListener で使用されるグローバル削除ポリシーは、次のプロパティを使用して設定できます。

cloud.aws.sqs.handler.default-deletion-policy=ON_SUCCESS
メッセージ返信

メッセージリスナーメソッドに @SendTo アノテーションを付けて、戻り値を別のチャネルに送信できます。SendToHandlerMethodReturnValueHandler は、aws-messaging:annotation-driven-queue-listener 要素に設定された定義済みのメッセージングテンプレートを使用して、戻り値を送信します。メッセージングテンプレートは、DestinationResolvingMessageSendingOperations インターフェースを実装する必要があります。

<aws-messaging:annotation-driven-queue-listener send-to-message-template="queueMessagingTemplate"/>
@SqsListener("treeQueue")
@SendTo("leafsQueue")
public List<Leaf> extractLeafs(Tree tree) {
    // ...
}

この例では、extractLeafs メソッドは treeQueue からのメッセージを受信し、leafsQueue に送信される Leaf の List を返します。aws-messaging:annotation-driven-queue-listener XML 要素には、メッセージリスナーメソッドの戻り値を送信するために使用されるメッセージングテンプレートとして QueueMessagingTemplate を指定する属性 send-to-message-template があることに注意してください。

例外の処理

@SqsListener アノテーション付きメソッド内でスローされた例外は、@MessageExceptionHandler アノテーション付きメソッドで処理できます。

import io.awspring.cloud.messaging.listener.annotation.SqsListener;
import org.springframework.messaging.handler.annotation.MessageExceptionHandler;
import org.springframework.stereotype.Component;

@Component
public class MyMessageHandler {

    @SqsListener("queueName")
    void handle(String message) {
        ...
        throw new MyException("something went wrong");
    }

    @MessageExceptionHandler(MyException.class)
    void handleException(MyException e) {
        ...
    }
}

5.2.5. SimpleMessageListenerContainerFactory

SimpleMessageListenerContainer は、型 SimpleMessageListenerContainerFactory の Bean を作成することにより、Java で構成することもできます。

@Bean
public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory(AmazonSQSAsync amazonSqs) {
    SimpleMessageListenerContainerFactory factory = new SimpleMessageListenerContainerFactory();
    factory.setAmazonSqs(amazonSqs);
    factory.setAutoStartup(false);
    factory.setMaxNumberOfMessages(5);
    // ...

    return factory;
}

5.2.6. Amazon SQS を使用した AWS イベントメッセージの消費

AWS で生成されたイベントメッセージを SQS メッセージリスナーで受信することもできます。AWS メッセージには mime-type ヘッダーが含まれていないため、適切な mime 型のないメッセージも解析するには、Jackson メッセージコンバーターを strictContentTypeMatch プロパティ false で設定する必要があります。

次のコードは、QueueMessageHandlerFactory を使用したメッセージコンバーターの構成と MappingJackson2MessageConverter の再構成を示しています。

@Bean
public QueueMessageHandlerFactory queueMessageHandlerFactory() {
    QueueMessageHandlerFactory factory = new QueueMessageHandlerFactory();
    MappingJackson2MessageConverter messageConverter = new MappingJackson2MessageConverter();

    //set strict content type match to false
    messageConverter.setStrictContentTypeMatch(false);
    factory.setArgumentResolvers(Collections.<HandlerMethodArgumentResolver>singletonList(new PayloadArgumentResolver(messageConverter)));
    return factory;
}

上記の設定では、以下に示す @SqsListener アノテーション付きメソッド内で S3 バケットのイベント通知(およびエラスティックトランスコーダーメッセージなどの他のイベント通知)を受信することができます。

@SqsListener("testQueue")
public void receive(S3EventNotification s3EventNotificationRecord) {
    S3EventNotification.S3Entity s3Entity = s3EventNotificationRecord.getRecords().get(0).getS3();
}

5.3. IAM パーミッション

Spring Cloud AWS には、次の IAM 権限が必要です。

キューにメッセージを送信する

sqs:SendMessage

キューからメッセージを受信する

sqs:ReceiveMessage

キューからメッセージを削除する

sqs:DeleteMessage

sqsListener を SimpleMessageListenerContainerFactory と一緒に使用するには、以下も追加する必要があります。

sqs:GetQueueAttributes

ARN の代わりに Sqs 名で SqsListener を使用するには、次のものが必要です。

sqs:GetQueueUrl

SQS へのアクセスを許可するサンプル IAM ポリシー:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sqs:DeleteMessage",
                "sqs:ReceiveMessage",
                "sqs:SendMessage",
                "sqs:GetQueueAttributes",
                "sqs:GetQueueUrl"
            ],
            "Resource": "yourARN"
        }

5.4. SNS サポート

Amazon SNS は、クライアントが特定のトピックに通知を発行できるようにするパブリッシュ / サブスクライブメッセージングシステムです。他の関心のあるクライアントは、HTTP/HTTPS、メール、Amazon SQS キューなどのさまざまなプロトコルを使用してサブスクライブしてメッセージを受信する場合があります。

次の図は、Amazon SNS アーキテクチャの典型的な例を示しています。

SNS Overview

Spring Cloud AWS は、NotificationMessagingTemplate で通知を送信し、Spring Web MVC @Controller ベースのプログラミングモデルを使用して HTTP/HTTPS エンドポイントで通知を受信するためのサポートを提供することにより、Amazon SNS をサポートします。Amazon SQS ベースのサブスクリプションは、Spring Cloud AWS メッセージングモジュールによって提供されるアノテーション駆動型メッセージサポートとともに使用できます。

5.4.1. メッセージを送る

NotificationMessagingTemplate には、通知を送信するための 2 つの便利なメソッドが含まれています。1 つ目は、SNSAPI に対して解決される String を使用して宛先を指定します。2 つ目は、宛先引数を受け取らず、デフォルトの宛先を使用します。MessageSendingOperations で使用できる通常の送信メソッドはすべて実装されていますが、件名をヘッダーとして渡す必要があるため、通知の送信にはあまり便利ではありません。

現在、NotificationMessagingTemplate を使用して送信できるのは String ペイロードのみです。これは、SNSAPI で予期される型であるためです。

import com.amazonaws.services.sns.AmazonSNS;
import org.springframework.beans.factory.annotation.Autowired;
import io.awspring.cloud.messaging.core.NotificationMessagingTemplate;

public class SnsNotificationSender {

    private final NotificationMessagingTemplate notificationMessagingTemplate;

    @Autowired
    public SnsNotificationSender(AmazonSNS amazonSns) {
        this.notificationMessagingTemplate = new NotificationMessagingTemplate(amazonSns);
    }

    public void send(String subject, String message) {
        this.notificationMessagingTemplate.sendNotification("physicalTopicName", message, subject);
    }
}

この例では、AmazonSNS クライアントを引数として渡すことにより、新しい NotificationMessagingTemplate を作成します。send メソッドでは、便利な sendNotification メソッドを使用して、subject を含む message を SNS トピックに送信します。sendNotification メソッドの宛先は、AWS で定義されたトピック名と一致する必要がある文字列値です。この値は、Amazon SNS クライアントによって実行時に解決されます。オプションで、ResourceIdResolver 実装を NotificationMessagingTemplate コンストラクターに渡して、CloudFormation スタック内で実行するときに論理名でリソースを解決できます。(リソース名解決の詳細については、クラウド環境の管理を参照してください。)

XML メッセージング名前空間を使用して NotificationMessagingTemplate を作成することをお勧めします。これにより、SNS クライアントがデフォルトのコンバーターをセットアップするように自動的に構成されます。

<aws-messaging:notification-messaging-template id="notificationMessagingTemplate" />

5.4.2. アノテーション駆動型 HTTP 通知エンドポイント

SNS は複数のエンドポイント型(SQS、メール、HTTP、HTTPS)をサポートし、Spring Cloud AWS は HTTP(S) エンドポイントのサポートを提供します。SNS は、HTTP トピックリスナーエンドポイントに 3 種類のリクエストを送信し、それぞれにアノテーションが提供されます。

  • サブスクリプションリクエスト→ @NotificationSubscriptionMapping

  • 通知リクエスト→ @NotificationMessageMapping

  • 退会依頼→ @NotificationUnsubscribeMapping

HTTP エンドポイントは Spring MVC コントローラーに基づいています。Spring Cloud AWS は、通知リクエストからメッセージと件名を抽出するために、いくつかのカスタム引数リゾルバーを追加しました。

@Controller
@RequestMapping("/topicName")
public class NotificationTestController {

    @NotificationSubscriptionMapping
    public void handleSubscriptionMessage(NotificationStatus status) throws IOException {
        //We subscribe to start receive the message
        status.confirmSubscription();
    }

    @NotificationMessageMapping
    public void handleNotificationMessage(@NotificationSubject String subject, @NotificationMessage String message) {
        // ...
    }

    @NotificationUnsubscribeConfirmationMapping
    public void handleUnsubscribeMessage(NotificationStatus status) {
        //e.g. the client has been unsubscribed and we want to "re-subscribe"
        status.confirmSubscription();
    }
}

現在、メソッドレベルでマッピング URL を定義することはできないため、RequestMapping は型レベルで実行する必要があり、エンドポイントのフルパスを含める必要があります。

この例では、上記の 3 つのリクエストを処理する 3 つのメソッドを持つ新しい Spring MVC コントローラーを作成します。handleNotificationMessage メソッドの引数を解決するには、カスタム引数リゾルバーを登録する必要があります。XML 構成を以下に示します。

<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <ref bean="notificationResolver" />
    </mvc:argument-resolvers>
</mvc:annotation-driven>

<aws-messaging:notification-argument-resolver id="notificationResolver" />

aws-messaging:notification-argument-resolver エレメントは、3 つの引数リゾルバー NotificationStatusHandlerMethodArgumentResolverNotificationMessageHandlerMethodArgumentResolverNotificationSubjectHandlerMethodArgumentResolver を登録します。

5.5. CloudFormation の使用

Amazon SQS キューと SNS トピックは、スタック内で設定して、アプリケーションで使用できます。Spring Cloud AWS は、物理名への解決を伴う論理名によるスタック構成キューおよびトピックのルックアップもサポートします。以下の例は、CloudFormation テンプレート内の SNS トピックと SQS キュー設定を示しています。

"LogicalQueueName": {
    "Type": "AWS::SQS::Queue",
    "Properties": {
    }
},
"LogicalTopicName": {
    "Type": "AWS::SNS::Topic",
    "Properties": {
    }
}

論理名 LogicalQueueName および LogicalTopicName は、以下に示すように、構成およびアプリケーションで使用できます。

<aws-messaging:queue-messaging-template default-destination="LogicalQueueName" />

<aws-messaging:notification-messaging-template default-destination="LogicalTopicName" />
@SqsListener("LogicalQueueName")
public void receiveQueueMessages(Person person) {
    // Logical names can also be used with messaging templates
    this.notificationMessagingTemplate.sendNotification("anotherLogicalTopicName", "Message", "Subject");
}

上記の例のように論理名を使用すると、アプリケーション内で構成やコードを変更することなく、さまざまな環境でスタックを作成できます。

5.6. IAM パーミッション

Spring Cloud AWS には、次の IAM 権限が必要です。

トピックに通知を公開するには

sns:Publish

通知を公開するには、次も必要になります

sns:ListTopics

アノテーション駆動型 HTTP 通知エンドポイントを使用するには

sns:ConfirmSubscription

SNS へのアクセスを許可するサンプル IAM ポリシー:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sns:Publish",
                "sns:ConfirmSubscription"
            ],
            "Resource": "yourArn"
        },
        {
            "Effect": "Allow",
            "Action": "sns:ListTopics",
            "Resource": "*"
        }
    ]
}

6. キャッシング

クラウド環境でのキャッシュは、アプリケーションがレイテンシーを削減し、データベースのラウンドトリップを節約できます。データベースのラウンドトリップを減らすと、データベースインスタンスの要件を大幅に減らすことができます。Spring Framework は、バージョン 3.1 以降、宣言型トランザクションに類似したアプリケーションで宣言型キャッシュを可能にする統合キャッシュ抽象化を提供します。

Spring Cloud AWS は、Amazon ElastiCache サービスを Spring 統合キャッシュ抽象化に統合し、memcached および Redis プロトコルに基づくキャッシュマネージャーを提供します。Spring Cloud AWS のキャッシュサポートは、ElastiCache に独自の memcached 実装を提供し、Redis キャッシュに Spring Data Redis を使用します。

6.1. Redis キャッシュの依存関係の構成

Spring Cloud AWS は、memcached キャッシュの独自の実装を提供するため、他の依存関係は必要ありません。Redis の場合、Spring Cloud AWS は Spring Data Redis に依存して、キャッシュをサポートし、複数の Redis ドライバーを使用できるようにします。Spring Cloud AWS は、Spring Data Redis がサポートするすべての Redis ドライバー(現在は Jedis、JRedis、SRP、Lettuce)をサポートし、Jedis は ElastiCache に対するテストに内部的に使用されます。ジェダイを使用した Redis の依存関係の定義を例に示します。

<dependencies>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>${spring-data-redis.version}</version>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.6.1</version>
    </dependency>
</dependencies>

Spring Cloud AWS は Redis ドライバーを自動的に検出し、そのうちの 1 つを自動的に使用します。

6.2. XML を使用したキャッシュの構成

Spring Cloud AWS のキャッシュサポートはコンテキストモジュールに存在するため、コンテキストモジュールがプロジェクトにすでにインポートされている場合に使用できます。キャッシュ統合は、Amazon ElastiCache サービスでホストされるキャッシュクラスターを構成するための独自の名前空間を提供します。次の例には、キャッシュクラスターの構成と、宣言型のアノテーションベースのキャッシュを有効にする Spring 構成が含まれています。

<beans xmlns:aws-cache="http://www.springframework.org/schema/cloud/aws/cache"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/cloud/aws/cache
        http://www.springframework.org/schema/cloud/aws/cache/spring-cloud-aws-cache.xsd
        http://www.springframework.org/schema/cache
        https://www.springframework.org/schema/cache/spring-cache.xsd">

    <aws-context:context-credentials>
        ...
        </aws-context:context-credentials>

    <aws-cache:cache-manager>
        <aws-cache:cache-cluster name="CacheCluster" />
    </aws-cache:cache-manager>

    <cache:annotation-driven />
</beans>

上記の構成は、ElasticCache クラスター [Amazon] を表す CacheCluster という名前の 1 つのキャッシュを持つ cache-manager を構成します。

6.2.1. キャッシュの混合

アプリケーションでは、1 つの主要キャッシュクラスターによって維持される複数のキャッシュが必要になる場合があります。Spring Cloud AWS キャッシングのサポートにより、1 つのキャッシュマネージャー内で複数のキャッシュを定義したり、キャッシュマネージャー内で外部的に定義されたキャッシュを使用したりすることができます。

以下の例は、cache-ref エレメント(ローカルキャッシュの場合もあります)を含む事前構成済みキャッシュと ElastiCache キャッシュクラスターの cache-cluster 構成を含む構成例を示しています。

<beans ...>
    <aws-cache:cache-manager id="cacheManager">
        <aws-cache:cache-ref ref="memcached" />
        <aws-cache:cache-cluster name="SimpleCache"/>
    </aws-cache:cache-manager>
</beans>

6.2.2. 有効期限の定義

Spring キャッシュ境界は、有効期限の構成をサポートしておらず、有効期限をサポートするためにキャッシュの実装に任されています。Spring Cloud AWS キャッシュ構成は、キャッシュごとの有効期限設定をサポートします。有効期限は memcached サービスに渡されます。

cache-cluster 要素は、有効期限を秒単位で定義する有効期限属性を受け入れます。構成された値がないということは、有効期限が無限であることを意味します。

<beans>
    <aws-cache:cache-manager>
        <aws-cache:cache-cluster expiration="10000" name="CacheCluster" />
    </aws-cache:cache-manager>
</beans>

6.3. Java 構成を使用したキャッシュの構成

Spring Cloud AWS は、Java 構成クラスを使用したキャッシュ構成もサポートします。どの Configuration クラスでも、Spring Cloud AWS によって提供される io.awspring.cloud.cache.config.annotation.EnableElastiCache アノテーションを使用してキャッシュを構成できます。次の例は、2 つのキャッシュクラスターの構成を示しています。

2.3.0 以降、@EnableElastiCache アノテーションは非推奨になりました。代わりに Spring Boot 自動構成を使用することをお勧めします。
@EnableElastiCache({@CacheClusterConfig(name = "firstCache"), @CacheClusterConfig(name = "secondCache")})
public class ApplicationConfiguration {
}
value 属性を空のままにすると、CloudFormation スタック内のすべてのキャッシュ(使用可能な場合)が自動的に構成されます。

6.3.1. キャッシュの有効期限の構成

Java 構成では、キャッシュの有効期限を構成することもできます。これは、以下の例に示すように、defaultExpiration 属性を使用してすべてのキャッシュに対して実行できます。

@EnableElastiCache(defaultExpiration = 23)
public class ApplicationConfiguration {
}

有効期限は、以下に示すように @CacheClusterConfig アノテーションの有効期限属性を使用してキャッシュレベルで定義できます(値として秒を使用)。

@EnableElastiCache({@CacheClusterConfig(name = "firstCache", expiration = 23), @CacheClusterConfig(name = "secondCache", expiration = 42)})
public class ApplicationConfiguration {
}

6.4. Spring Boot でのキャッシュの構成

キャッシュは、明示的な構成プロパティなしで Spring Boot で自動的に構成されます。

6.5. キャッシュの使用

キャッシュの構成に基づいて、開発者はメソッドにアノテーションを付けて、メソッドの戻り値にキャッシュを使用できます。次の例には、戻り値をキャッシュする必要があるサービスのキャッシュ宣言が含まれています

@Service
public class ExpensiveService {

    @Cacheable("CacheCluster")
    public String calculateExpensiveValue(String key) {
        ...
    }
}

6.6. Memcached クライアントの実装

Java で利用できるさまざまな memcached クライアント実装がありますが、最も有名なものは Spymemcached [GitHub] (英語) XMemcached [GitHub] (英語) です。Amazon AWS は動的構成をサポートし、Spymemcached に基づく拡張 memcached クライアントを提供して、中央構成エンドポイントに基づく新しいノードの自動検出をサポート [Amazon] します。

Spring Cloud AWS は Amazon ElastiCache クライアントの実装に依存しているため、それに依存しています。

6.7. CloudFormation の使用

Amazon ElastiCache クラスターは、スタック内で構成して、アプリケーションで使用することもできます。Spring Cloud AWS は、物理名への解決を伴う論理名によるスタック構成キャッシュクラスターのルックアップもサポートします。以下の例は、CloudFormation テンプレート内のキャッシュクラスター構成を示しています。

"CacheCluster": {
    "Type": "AWS::ElastiCache::CacheCluster",
    "Properties": {
        "AutoMinorVersionUpgrade": "true",
        "Engine": "memcached",
        "CacheNodeType": "cache.t2.micro",
        "CacheSubnetGroupName" : "sample",
        "NumCacheNodes": "1",
        "VpcSecurityGroupIds": ["sample1"]
    }
}

キャッシュクラスターは、以下に示すように、アプリケーション構成内で CacheCluster という名前で使用できます。

<beans...>
    <aws-cache:cache-manager>
        <aws-cache:cache-cluster name="CacheCluster" expiration="15"/>
    </aws-cache:cache-manager>
<beans>

上記の構成を使用すると、アプリケーション内で構成を変更することなく、アプリケーションをさまざまな環境に複数のスタックでデプロイできます。

6.8. IAM パーミッション

Spring Cloud AWS には、次の IAM 権限が必要です。

ElastiCache に構成するには、以下が必要です。

elasticache:DescribeCacheClusters

ElastiCache へのアクセスを許可するサンプル IAM ポリシー:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "elasticache:DescribeCacheClusters",
            "Resource": "yourArn"
        }
    ]
}

7. JDBC を使用したデータアクセス

Spring は、JdbcTemplate や専用 ORM(JPA、Hibernate サポート)などの JDBC 上に構築されたデータアクセステクノロジーを幅広くサポートしています。Spring Cloud AWS を使用すると、アプリケーション開発者は、選択した JDBC テクノロジーを再利用し、宣言型構成で Amazon リレーショナルデータベースサービス にアクセスできます。JDBC データアクセスのために Spring Cloud AWS によって提供される主なサポートは次のとおりです。

  • Amazon RDS データベースインスタンスに基づく自動データソース構成とセットアップ。

  • Amazon RDS データベースインスタンスの自動リードレプリカ検出と設定。

  • 再試行 - データセンター内のマルチ AZ フェイルオーバー中の例外を処理するためのサポート。

7.1. データソースの構成

データベースサポートを使用および構成する前に、アプリケーションはそれぞれのモジュール依存関係を Maven 構成に含める必要があります。Spring Cloud AWS JDBC サポートは、モジュールのモジュール化された使用を可能にする別個のモジュールとして提供されます。

7.1.1. Maven 依存関係の構成

Spring Cloud AWS JDBC モジュールはスタンドアロンモジュールとして提供され、次の依存関係宣言を使用してインポートできます。

<dependency>
    <groupId>io.awspring.cloud</groupId>
    <artifactId>spring-cloud-aws-jdbc</artifactId>
    <version>{spring-cloud-version}</version>
</dependency>

7.1.2. 基本的なデータソース構成

データソース構成には、Spring Cloud AWS が Amazon RDS サービスを使用してデータベースメタデータ情報を取得できるようにするために、少なくともセキュリティと領域の構成が必要です。Spring Cloud AWS は、次の例に示すように、最小限の属性でデータソースを構成するための追加の jdbc 固有の名前空間を提供します。

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jdbc="http://www.springframework.org/schema/cloud/aws/jdbc"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/cloud/aws/jdbc
       http://www.springframework.org/schema/cloud/aws/jdbc/spring-cloud-aws-jdbc.xsd">

 <aws-context:context-credentials>
  ...
 </aws-context:context-credentials>

 <aws-context:context-region region="..."/>

<jdbc:data-source
         db-instance-identifier="myRdsDatabase"
         password="${rdsPassword}">
</jdbc:data-source>
</beans>

最小構成パラメーターは、データソースの一意の id であり、有効な Amazon RDS データベースインスタンスを指す有効な db-instance-identifier 属性です。マスターユーザーのマスターユーザーパスワード。使用する別のユーザーがいる場合(推奨)、username 属性を設定できます。

この構成では、Spring Cloud AWS は必要なすべてのメタデータをフェッチし、デフォルトのプロパティで TomcatJDBC プール [Apache] (英語) を作成します。データソースは、以下に示すように、後で任意の Spring Bean に挿入できます。

@Service
public class SimpleDatabaseService implements DatabaseService {

 private final JdbcTemplate jdbcTemplate;

 @Autowired
 public SimpleDatabaseService(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
 }
}

データソースインジェクションポイントを @Qualifier アノテーションで修飾して、1 つのアプリケーションコンテキスト内で複数のデータソース構成を許可し、それでもオートワイヤーを使用することができます。

7.1.3. データソースプールの構成

Spring Cloud AWS は、デフォルトのプロパティを使用して新しい TomcatJDBC プールを作成します。多くの場合、これらのデフォルトプロパティは、プールサイズやその他の設定に関するアプリケーションの要件を満たしていません。データソース構成は、ネストされた XML 要素を使用したすべての有効なプールプロパティの構成をサポートします。次の例は、カスタムプールプロパティを使用したデータソースの再構成を示しています。

<beans ..>

 <aws-context:context-credentials>
  ...
 </aws-context:context-credentials>

 <aws-context:context-region region="..."/>

 <jdbc:data-source
         db-instance-identifier="myRdsDatabase"
         password="${rdsPassword}">
         <jdbc:pool-attributes initialSize="1" " maxActive="200" minIdle="10"
                testOnBorrow="true" validationQuery="SELECT 1" />
 </jdbc:data-source>

</beans>

すべての構成属性とその値の完全なリストは、こちらから [Apache] (英語) 入手できます。

7.2. Java 構成を使用したデータソースの構成

Spring Cloud AWS は、@Configuration クラス内のデータソースの構成もサポートします。io.awspring.cloud.jdbc.config.annotation.EnableRdsInstance アノテーションを使用して、1 つのデータソースを構成できます。複数のものを使用して、複数のデータソースを構成できます。各アノテーションは、正確に 1 つのデータソース Bean を生成します。

2.3.0 以降、@EnableRdsInstance アノテーションは非推奨になりました。代わりに、構成 Spring Boot 自動構成を使用することをお勧めします。

以下のクラスは、構成クラス内のデータソース構成を示しています

@Configuration
@EnableRdsInstance(dbInstanceIdentifier = "test",password = "secret", readReplicaSupport = true)
public class ApplicationConfiguration {
}
構成属性は、XML 要素で同じです。必要な属性は、XML 構成でも同じです。(dbInstanceIdentifier および password 属性)

7.2.1. Java ベースのデータソースプール構成

プール構成をカスタム値でオーバーライドすることもできます。Spring Cloud AWS は、カスタムプール属性を含む可能性のある io.awspring.cloud.jdbc.datasource.DataSourceFactory を作成する io.awspring.cloud.jdbc.config.annotation.RdsInstanceConfigurer を提供します。次の例は、検証クエリと初期サイズをオーバーライドする 1 つのコンフィギュレーターの実装を示しています。

@Configuration
@EnableRdsInstance(dbInstanceIdentifier = "test",password = "secret")
public class ApplicationConfiguration {

    @Bean
    public RdsInstanceConfigurer instanceConfigurer() {
        return new RdsInstanceConfigurer() {
            @Override
            public DataSourceFactory getDataSourceFactory() {
                TomcatJdbcDataSourceFactory dataSourceFactory = new TomcatJdbcDataSourceFactory();
                dataSourceFactory.setInitialSize(10);
                dataSourceFactory.setValidationQuery("SELECT 1 FROM DUAL");
                return dataSourceFactory;
            }
        };
    }
}
このクラスは、io.awspring.cloud.jdbc.config.annotation.RdsInstanceConfigurer 型の匿名クラスを返します。これは、もちろんスタンドアロンクラスの場合もあります。

7.3. Spring Boot でのデータソースの構成

データソースは、Spring Boot 構成ファイルを使用して構成することもできます。1 つのアプリケーション内のデータソースの動的な数のため、Spring Boot プロパティはデータソースごとに構成する必要があります。

データソース構成は、一般プロパティ名 cloud.aws.rds.instances と、特定の各データソースのサブプロパティに続く複数のデータソースの [index] 逆参照で構成されます。次の表に、データソースのすべてのプロパティの概要を示します。

プロパティ 説明

cloud.aws.rds.instances[0].dbInstanceIdentifier

test

db インスタンスの識別子

cloud.aws.rds.instances[0].password

verySecret

db インスタンステストのパスワード

cloud.aws.rds.instances[0].username

admin

db インスタンステストのユーザー名 (オプション)

cloud.aws.rds.instances[0].readReplicaSupport

true

データソースにリードレプリカを使用する必要がある場合 (下記を参照)

cloud.aws.rds.instances[0].databaseName

fooDb

rds のデフォルトのデータベース名を使用しない場合のカスタムデータベース名

7.4. リードレプリカ構成

Amazon RDS を使用すると、MySQL、MariaDB、Oracle、PostgreSQL、Microsoft SQL Server リードレプリカ [Amazon] インスタンスを使用して、1 つのマスターデータベースにデータを保持しながら、読み取りデータアクセスを 1 つ以上のリードレプリカスレーブにオフロードすることで、データベースの全体的なスループットを向上させることができます。

Spring Cloud AWS は、Spring 読み取り専用トランザクションと組み合わせた読み取りレプリカの使用をサポートします。リードレプリカのサポートが有効になっている場合、書き込み操作にマスターデータベースを使用している間、読み取り専用トランザクションはすべてリードレプリカインスタンスにルーティングされます。

リードレプリカインスタンスを使用しても、データベースアクセスの厳密な ACID [Wikipedia] (英語) セマンティクスが保証されるわけではないため、注意して使用する必要があります。これは、リードレプリカが遅れている可能性があり、書き込みが読み取りトランザクションにすぐに表示されない可能性があるためです。read-replica インスタンスは、あまり頻繁に変更されないデータを読み取り、アプリケーションで古いデータを処理できるトランザクションにのみ使用することをお勧めします。

リードレプリカのサポートは、データソース構成の read-replica 属性を使用して有効にできます。

<beans ..>
 <jdbc:data-source db-instance-identifier="RdsSingleMicroInstance"
    password="${rdsPassword}" read-replica-support="true">

 </jdbc:data-source>
</beans>

Spring Cloud AWS は、マスターデータベース用に作成されたすべてのリードレプリカを検索し、読み取り専用トランザクションを使用可能なリードレプリカの 1 つにルーティングします。リードレプリカを使用するビジネスサービスは、例に示すように実装できます。

@Service
public class SimpleDatabaseService {

    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public SimpleDatabaseService(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Transactional(readOnly = true)
    public Person loadAll() {
        // read data on the read replica
    }

    @Transactional
    public void updatePerson(Person person) {
        // write data into database
    }
}

7.5. フェイルオーバーのサポート

Amazon RDS は、プライマリインスタンスの停止または障害のために 1 つのアベイラビリティーゾーンが使用できない場合に、マルチ AZ [Amazon] フェイルオーバーをサポートします。レプリケーションは同期的であり(リードレプリカと比較して)、継続的なサービスを提供します。Spring Cloud AWS は、マルチ AZ フェイルオーバー中に失敗したトランザクションを回復するための再試行メカニズムを備えたマルチ AZ フェイルオーバーをサポートします。

ほとんどの場合、ユーザーインタラクション内で長く頻繁に再試行するのではなく、ユーザーに直接フィードバックを提供することをお勧めします。フェイルオーバーのサポートは、主にバッチアプリケーションまたはサービス呼び出しの応答性が重要ではないアプリケーションに役立ちます。

Spring Cloud AWS JDBC モジュールは、インターセプターでサービスを装飾するために使用できる再試行インターセプターを提供します。マルチ AZ フェイルオーバーが原因で一時的なエラーが発生した場合、インターセプターはデータベース操作を再試行します。マルチ AZ フェイルオーバーは通常、数秒しか続かないため、ビジネストランザクションの再試行は成功する可能性があります。

インターセプターは、通常の Bean として構成し、ポイントカット式で使用して、インターセプターでそれぞれのメソッド呼び出しを装飾できます。インターセプターには、Amazon RDS サービスから現在のステータス(一時的なフェイルオーバーまたは永続的なエラーの場合)を取得するように構成されたデータベースが必要です。

インターセプターの構成は、Spring Cloud AWS jdbc 名前空間のカスタム要素を使用して実行でき、次のように構成されます。

<beans ..>
    <jdbc:retry-interceptor id="myInterceptor"
        db-instance-identifier="myRdsDatabase"
        max-number-of-retries="10" />
</beans>

インターセプター自体を任意の Spring アドバイス構成とともに使用して、それぞれのサービスをラップできます。前の章で示したサービスのポイントカットは、次のように定義できます。

<beans ..>
 <aop:config>
  <aop:advisor advice-ref="myInterceptor" pointcut="bean(simpleDatabaseService)" order="1" />
 </aop:config>
</beans>

トランザクション全体が確実に再実行されるように、インターセプターがトランザクションインターセプターの外部で呼び出されることが重要です。トランザクションインターセプター内でインターセプターを構成すると、切断された接続がリフレッシュされないため、永続的なエラーが発生します。

上記の構成をトランザクション構成と組み合わせると、サービスの次のプロキシ構成が生成されます。

Retry interceptor

7.6. CloudFormation サポート

Spring Cloud AWS は、CloudFormation で構成されたデータベースインスタンスをサポートします。Spring Cloud AWS は、データベース構成内の論理名を使用して、生成された物理リソース名を使用して具象データベースを検索できます。データベース構成は、次の例のようなテンプレート定義を使用して CloudFormation で簡単に構成できます。

"myRdsDatabase": {
    "Type": "AWS::RDS::DBInstance",
    "Properties": {
     "AllocatedStorage": "5",
     "DBInstanceClass": "db.t1.micro",
     "DBName": "test",
     "Engine": "mysql",
     "MasterUsername": "admin",
     "MasterUserPassword": {"Ref":"RdsPassword"},
     ...
    }
 },
 "readReplicaDatabase": {
    "Type": "AWS::RDS::DBInstance",
    "Properties": {
     "AllocatedStorage" : "5",
     "SourceDBInstanceIdentifier": {
        "Ref": "myRdsDatabase"
     },
     "DBInstanceClass": "db.t1.micro"
    }
 }
}

その後、テンプレートに設定された名前を使用してデータベースを構成できます。また、read-replica を有効にして、アプリケーションで構成済みの read-replica データベースを使用することもできます。構成済みデータベースを使用するための構成の概要を以下に示します。

<beans>
 <aws-context:stack-configuration/>

 <jdbc:data-source db-instance-identifier="myRdsDatabase" password="${rdsPassword}" read-replica-support="true"/>
</beans>

7.7. データベースタグ

Amazon RDS インスタンスは、RDS データベース固有のタグを使用して構成することもでき、ユーザーはデータベースを使用してデータベース固有の構成メタデータを構成できます。データベースインスタンス固有のタグは、data-source 要素の user-tags-map 属性を使用して構成できます。以下の例のように、タグのサポートを構成します。

<jdbc:data-source
    db-instance-identifier="myRdsDatabase"
    password="${rdsPassword}" user-tags-map="dbTags" />

これにより、開発者は、以下のクラスに示すような式を使用して、コード内のプロパティにアクセスできます。

public class SampleService {

    @Value("#{dbTags['aws:cloudformation:aws:cloudformation:stack-name']}")
    private String stackName;
}

データベースタグ aws:cloudformation:aws:cloudformation:stack-name は、データベースが CloudFormation を使用して構成されている場合に作成されるデフォルトのタグです。

7.8. IAM パーミッション

Spring Cloud AWS には、次の IAM 権限が必要です。

データベースインスタンスを説明する

rds:DescribeDBInstances

RDS へのアクセスを許可するサンプル IAM ポリシー:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "rds:DescribeDBInstances",
            "Resource": "db-arn"
        },
}

8. メールの送信

Spring には、Java メール API [Oracle] (英語) に基づいてメールを送信するための組み込みサポートがあり、Java Mail API の使用中に静的メソッド呼び出しを回避して、アプリケーションのテスト容易性をサポートします。Spring Cloud AWS は、Spring メール抽象化の実装として Amazon SES をサポートします。

その結果、Spring Cloud AWS ユーザーは、Amazon SES サービスの Spring Cloud AWS 実装を使用するか、SMTP 経由で Amazon SES にメールを送信する標準の JavaMailAPI ベースの実装を使用するかを決定できます。

主にパフォーマンス上の理由から、SMTP の代わりに Spring Cloud AWS 実装を使用することをお勧めします。Spring Cloud AWS は 1 つの API 呼び出しを使用してメールメッセージを送信しますが、SMTP プロトコルは、メールを送信するまで複数のリクエスト(EHLO、MAIL FROM、RCPT TO、DATA、QUIT)を行います。

8.1. メール送信者の設定

Spring Cloud AWS は、使用するクライアントの Spring org.springframework.mail.MailSender 実装を構成するための XML 要素を提供します。デフォルトのメール送信者は、Java Mail に依存せずに機能し、添付ファイルなしのメッセージを単純なメールメッセージとして送信できます。必要な要素を含む構成は次のようになります。

<beans xmlns:aws-mail="http://www.springframework.org/schema/cloud/aws/mail"
   xsi:schemaLocation="http://www.springframework.org/schema/cloud/aws/mail
      http://www.springframework.org/schema/cloud/aws/mail/spring-cloud-aws-mail.xsd">

    <aws-context:context-credentials>
      ..
    </aws-context:context-credentials>

    <aws-context:context-region region="eu-west-1" />

    <aws-mail:mail-sender id="testSender" />

</beans>

8.2. 簡単なメールの送信

アプリケーション開発者は、MailSender をアプリケーションコードに挿入して、単純なテキストベースのメールメッセージを直接送信できます。以下のサンプルは、簡単なメールメッセージの作成を示しています。

public class MailSendingService {

    private MailSender mailSender;

    @Autowired
    public MailSendingService(MailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void sendMailMessage() {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setFrom("foo@bar.com");
        simpleMailMessage.setTo("bar@baz.com");
        simpleMailMessage.setSubject("test subject");
        simpleMailMessage.setText("test content");
        this.mailSender.send(simpleMailMessage);
    }
}

8.3. 添付を送付

メールで添付ファイルを送信するには、MIME メッセージを作成して送信する必要があります。MIME メッセージを作成するには、Java Mail の依存関係が必要であり、クラスパスに含める必要があります。Spring Cloud AWS は依存関係を検出し、MIME メッセージを作成および構築して送信できるようにする org.springframework.mail.javamail.JavaMailSender 実装を作成します。Java Mail API の依存関係構成は、以下に示す構成の唯一の変更です。

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mailapi</artifactId>
    <version>1.4.1</version>
    <exclusions>
        <!-- exclusion because we are running on Java 1.7 that includes the activation API by default-->
        <exclusion>
            <artifactId>activation</artifactId>
            <groupId>javax.activation</groupId>
        </exclusion>
    </exclusions>
</dependency>

Java Mail API への依存関係はありますが、メールメッセージの送信に使用される Amazon SESAPI は引き続き存在します。Amazon AWS 側には SMTP セットアップ [Amazon] は必要ありません。

メールを送信するには、以下の例に示すように、アプリケーション開発者が JavaMailSender を使用してメールを送信する必要があります。

public class MailSendingService {

    private JavaMailSender mailSender;

    @Autowired
    public MailSendingService(JavaMailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void sendMailMessage() {
        this.mailSender.send(new MimeMessagePreparator() {

            @Override
            public void prepare(MimeMessage mimeMessage) throws Exception {
                MimeMessageHelper helper =
                    new MimeMessageHelper(mimeMessage, true, "UTF-8");
                helper.addTo("foo@bar.com");
                helper.setFrom("bar@baz.com");
                helper.addAttachment("test.txt", ...);
                helper.setSubject("test subject with attachment");
                helper.setText("mime body", false);
            }
        });
    }
}

8.4. リージョンの構成

Amazon SES は、Amazon Web Services クラウドのすべてのリージョン [Amazon] で使用できるわけではありません。メールサービスをサポートしていないリージョンでホストおよび操作されているアプリケーションは、メールサービスの使用中にエラーを生成します。メール送信者の構成では、リージョンをオーバーライドする必要があります。以下の例は、クライアントが有効なリージョン(EU-WEST-1)を使用するようにオーバーライドされる、SES サービスを提供しないリージョン(EU-CENTRAL-1)の一般的な組み合わせを示しています。

<beans ...>

 <aws-context:context-region region="eu-central-1" />
 <aws-mail:mail-sender id="testSender" region="eu-west-1"/>

</beans>

2.3 以降、spring-boot を使用している場合、既存の自動構成は、SES クライアントの領域を設定するための特定の構成プロパティを提供します。

cloud.aws.mail.region=eu-west-1

また、新しいスターター spring-cloud-starter-aws-ses があり、特定の構成プロパティを提供します。

spring.cloud.aws.ses.region=eu-west-1

8.5. メールの認証

Amazon SES メールサービスへのスパム攻撃を回避するために、本番アクセスのないアプリケーションは、各メール受信者を確認する [Amazon] 必要があります。そうしないと、メール送信者は com.amazonaws.services.simpleemail.model.MessageRejectedException をスローします。

本番アクセス [Amazon] をリクエストすることができ、メールアドレス検証の必要性を無効にします。

8.6. IAM パーミッション

Spring Cloud AWS には、次の IAM 権限が必要です。

添付ファイルなしでメールを送信する

ses:SendEmail

添付ファイル付きのメールを送信する

ses:SendRawEmail

SES へのアクセスを許可するサンプル IAM ポリシー:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Resource": "arn:aws:ses:your:arn"
        }
    ]
}

9. リソース処理

Spring Framework は、ファイルシステム、サーブレットコンテキスト、クラスパスからファイルをロードするための org.springframework.core.io.ResourceLoader 抽象化を提供します。Spring Cloud AWS は、リソースローダーと s3 プロトコルを使用してリソースをロードおよび書き込みするための Amazon S3 サービスのサポートを追加します。

リソースローダーはコンテキストモジュールの一部であるため、リソース処理サポートを使用するために追加の依存関係は必要ありません。

9.1. Spring Boot を使用したリソースローダーの構成

spring-cloud-starter-aws が依存関係として追加されると、リソースローダーはデフォルトで有効になります。

9.2. XML を使用したリソースローダーの構成

Spring Cloud AWS は、XML 名前空間要素を使用した明示的な構成に遭遇しない限り、デフォルトのリソースローダーを変更しません。構成は、以下に示すアプリケーションコンテキスト全体の 1 つの要素で構成されます。

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aws-context="http://www.springframework.org/schema/cloud/aws/context"
       xsi:schemaLocation="http://www.springframework.org/schema/cloud/aws/context
       http://www.springframework.org/schema/cloud/aws/context/spring-cloud-aws-context.xsd">

    <aws-context:context-credentials>
            ...
        </aws-context:context-credentials>

    <aws-context:context-resource-loader/>
</beans>

9.3. ファイルのダウンロード

ファイルのダウンロードは、s3 プロトコルを使用して Amazon S3 バケットとそのバケット内のオブジェクトを参照することで実行できます。典型的なパターンは s3://<bucket>/<object> です。ここで、bucket はグローバルで一意のバケット名であり、object はバケット内の有効なオブジェクト名です。オブジェクト名は、バケットのルートフォルダー内のファイル、またはバケット内のディレクトリ内のネストされたファイルにすることができます。

次の例は、リソースローダーを使用してさまざまなリソースをロードする方法を示しています。

public class SimpleResourceLoadingBean {

    @Autowired
    private ResourceLoader resourceLoader;

    public void resourceLoadingMethod() throws IOException {
        Resource resource = this.resourceLoader.getResource("s3://myBucket/rootFile.log");
        Resource secondResource = this.resourceLoader.getResource("s3://myBucket/rootFolder/subFile");

        InputStream inputStream = resource.getInputStream();
        //read file
    }
}

9.4. ファイルのアップロード

Spring Framework 3.1 以降、リソースローダーを使用して、org.springframework.core.io.ResourceLoader インターフェースの特殊化である org.springframework.core.io.WritableResource インターフェースを使用してファイルをアップロードすることもできます。クライアントは、WritableResource インターフェースを使用してファイルをアップロードできます。次の例は、リソースローダーを使用したリソースのアップロードを示しています。

public class SimpleResourceLoadingBean {

    @Autowired
    private ResourceLoader resourceLoader;

    public void writeResource() throws IOException {
        Resource resource = this.resourceLoader.getResource("s3://myBucket/rootFile.log");
        WritableResource writableResource = (WritableResource) resource;
        try (OutputStream outputStream = writableResource.getOutputStream()) {
            outputStream.write("test".getBytes());
        }
    }
}

9.4.1. マルチパートファイルのアップロード

Amazon S3 はマルチパートアップロード をサポートしており、アップロード中の一般的なスループットを向上させます。Spring Cloud AWS は、デフォルトでは 1 つのスレッドのみを使用してファイルをアップロードするため、並列アップロードのサポートを提供しません。ユーザーは、リソースローダー用にカスタム org.springframework.core.task.TaskExecutor を構成できます。リソースローダーは、複数のスレッドを同時にキューに入れて、並列マルチパートアップロードを使用します。

10 スレッドでアップロードするリソースローダーの構成は次のようになります

<beans ...>
  <aws-context:context-resource-loader task-executor="executor" />
  <task:executor id="executor" pool-size="10" queue-capacity="0" rejection-policy="CALLER_RUNS" />
</beans>

Spring Cloud AWS は、スレッドごとに最大 5 MB(最小)のメモリを消費します。各並列スレッドはヒープ内で 5 MB のメモリフットプリントを被り、スレッドサイズが 10 の場合、最大 50MB のヒープスペースを消費します。Spring Cloud AWS はできるだけ早くメモリを解放します。また、上記の例は、キューに入れられたリクエストもメモリを消費するため、queue-capacity が構成されていないことを示しています。

9.4.2. TransferManager でアップロード

Amazon SDK は、ファイルのアップロードに役立つ高レベルの抽象化も提供します。また、マルチパート機能を使用する複数のスレッドも提供します。com.amazonaws.services.s3.transfer.TransferManager は、アプリケーションコードで簡単に作成でき、Spring Cloud AWS リソースローダー構成ですでに作成されている事前構成済みの com.amazonaws.services.s3.AmazonS3 クライアントを挿入できます。

この例は、アプリケーション内で transferManager を使用して、ハードドライブからファイルをアップロードする方法を示しています。

public class SimpleResourceUploadingBean {

    @Autowired
    private AmazonS3 amazonS3;

    public void withTransferManager() {
        TransferManager transferManager = TransferManagerBuilder.standard()
                                                                .withS3Client(this.amazonS3)
                                                                .build();
        transferManager.upload("myBucket","filename",new File("someFile"));
    }
}

9.5. リソースの検索

Spring リソースローダーは、Ant スタイルのパス仕様に基づくリソースの収集もサポートしています。Spring Cloud AWS は、バケット内、さらにはバケット全体でリソースを解決するために同じサポートを提供します。s3 バケットを検索するには、実際のリソースローダーを Spring Cloud AWS でラップする必要があります。非 s3 バケットの場合、リソースローダーは元のリソースローダーにフォールバックします。次の例は、さまざまなパターンを使用したリソース解決を示しています。

public class SimpleResourceLoadingBean {

    private ResourcePatternResolver resourcePatternResolver;

    @Autowired
    public void setupResolver(ApplicationContext applicationContext, AmazonS3 amazonS3){
        this.resourcePatternResolver = new PathMatchingSimpleStorageResourcePatternResolver(amazonS3, applicationContext);
    }

    public void resolveAndLoad() throws IOException {
        Resource[] allTxtFilesInFolder =  this.resourcePatternResolver.getResources("s3://bucket/name/*.txt");
        Resource[] allTxtFilesInBucket =  this.resourcePatternResolver.getResources("s3://bucket/**/*.txt");
        Resource[] allTxtFilesGlobally =  this.resourcePatternResolver.getResources("s3://**/*.txt");
    }
}

ユーザーが所有するバケットの数によっては、すべてのバケット全体でリソースを解決するのに非常に時間がかかる場合があります。

9.6. CloudFormation の使用

CloudFormation では、スタックの作成中にバケットを作成することもできます。これらのバケットには通常、バケット名として使用する必要のある生成された名前があります。アプリケーション開発者が構成内で静的な名前を定義できるようにするために、Spring Cloud AWS は生成されたバケット名を解決するためのサポートを提供します。アプリケーション開発者は、io.awspring.cloud.core.env.ResourceIdResolver インターフェースを使用して、論理名に基づいて生成された物理名を解決できます。

次の例は、CloudFormation スタックテンプレート内のバケット定義を示しています。バケットは、integrationteststack-sampleBucket-23qysofs62tc2 のような名前で作成されます

{
    "Resources": {
        "sampleBucket": {
            "Type": "AWS::S3::Bucket"
        }
    }
}

次の例に示すように、アプリケーション開発者はその名前を解決し、それを使用してリソースをロードできます。

public class SimpleResourceLoadingBean {

    private final ResourceLoader loader;
    private final ResourceIdResolver idResolver;

    @Autowired
    public SimpleResourceLoadingBean(ResourceLoader loader, ResourceIdResolver idResolver) {
        this.loader = loader;
        this.idResolver = idResolver;
    }

    public void resolveAndLoad() {
        String sampleBucketName = this.idResolver.
            resolveToPhysicalResourceId("sampleBucket");
        Resource resource = this.loader.
            getResource("s3://" + sampleBucketName + "/test");
    }
}

9.7. IAM パーミッション

赤 Spring Cloud AWS には次の IAM 権限が必要です。

ファイルのダウンロード

s3:GetObject

ファイルの検索

s3:ListObjects

ファイルのアップロード

s3:PutObject

spring-cloud-aws-demo バケットへのアクセスを許可するサンプル IAM ポリシー:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::spring-cloud-aws-demo"
        },
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::spring-cloud-aws-demo/*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::spring-cloud-aws-demo/*"
        }
    ]
}

10. CloudWatch メトリクス

Spring Cloud AWS は、Micrometer CloudWatch 統合のための Spring Boot 自動構成を提供します。メトリクスを CloudWatch に送信するには、micrometer-registry-cloudwatch モジュールに依存関係を追加します。

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-cloudwatch</artifactId>
</dependency>

さらに、CloudWatch 統合には、management.metrics.export.cloudwatch.namespace 構成プロパティに指定された値が必要です。

CloudWatch 統合を構成するには、次の構成プロパティを使用できます。

プロパティ default 説明

management.metrics.export.cloudwatch.namespace

メトリクスを CloudWatch に送信するときに使用される名前空間。このプロパティは必須であり、null であってはなりません。

management.metrics.export.cloudwatch.enabled

true

CloudWatch 統合を有効にする必要がある場合。このプロパティは、ローカル開発プロファイルの場合、false に設定する必要があります。

management.metrics.export.cloudwatch.region

CloudWatch 統合の特定の領域。

management.metrics.export.cloudwatch.step

1m

メトリクスが CloudWatch に送信される間隔。デフォルトは 1 分です。

11. Cognito を使用した OAuth2

Spring Cloud AWS Cognito 統合は、OAuth2 統合のために Spring Security によって使用される DelegatingOAuth2TokenValidator と NimbusJwtDecoder を自動構成します。

Cognito 統合を構成するには、次の構成プロパティを使用できます。

プロパティ default 説明

spring.cloud.aws.security.cognito.app-client-id

AWS Cognito に対して API 呼び出しを行うには、アプリクライアント ID が必要です

spring.cloud.aws.security.cognito.user-pool-id

AWSCognito のユーザープールの ID

spring.cloud.aws.security.algorithm

RS256

JWTDecoder が使用するアルゴリズムを指定します

spring.cloud.aws.security.region

ユーザープールが配置されている領域

spring.cloud.aws.security.enable

true

Cognito 統合を有効にします

12. 構成プロパティ

Spring Cloud AWS に関連するすべての構成プロパティのリストを表示するには、付録ページを確認してください。