5.1. AWS向け開発プロジェクトの作成


本ガイドラインでは、AWS向け開発プロジェクトを作成する方法について説明する。 ここでは、AWSの各機能を利用する上での共通的な設定のみ説明し、AWSの各機能毎の独自の設定については記述しない。

AWSの各機能を利用する際の機能毎の設定については、 AWS連携 を参照されたい。


5.1.1. 開発プロジェクトの作成

本ガイドラインでは、オンライン版クラウド拡張開発プロジェクトに対してクラウドベンダとしてAWSを利用する場合の設定を追加する。

ベースとなる開発プロジェクトの作成は オンライン版クラウド拡張開発プロジェクトの作成 を参照されたい。

5.1.2. 開発プロジェクトのカスタマイズ

開発プロジェクトの作成 で作成したプロジェクトをAWS向けにカスタマイズする。 AWS利用する場合、AWSの機能毎にカスタマイズが必要な箇所がいくつか存在するが、ここではAWSを利用する際の共通的な設定のみ説明する。

カスタマイズが必要な箇所を以下に示す。

5.1.2.1. 依存ライブラリの追加

  • project/xxx-domain/pom.xml
<dependencies>
    <!--(1)-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-aws</artifactId>
    </dependency>
<dependencies>
項番 説明
(1)
spring-cloud-starter-awsの依存関係を追加する。 これにより、Spring Cloud for Amazon Web Servicesに関連する依存関係が解決される。

Tip

spring-cloud-starter-awsを追加すると、ページアクセスの統計情報をメトリクスのデータとして、Spring Cloud AWSがCloudWatchに自動で送信する。 この情報が不要な場合、spring.metrics.export.enabled=falseのプロパティを設定することで送信を止めることができる。

5.1.2.2. スタックの自動検出の無効化

アプリケーションを起動するためには、スタックの自動検出を無効化する必要がある。 事象についての詳細は アプリケーションを起動するとAmazonServiceExceptionが発生する を参照されたい。

スタックの自動検出を無効にする設定例を以下に示す。

  • application.yml

    cloud:
      aws:
        stack:
          auto: false
    

5.1.2.3. Auto-Configurationの無効化

Amazon Elastic Compute Cloud(以後、EC2)上でアプリケーションを起動するためには、ElastiCacheAutoConfigurationをAuto-configurationから除外する必要がある。 事象についての詳細は Amazon EC2上でElastiCache Redis使用時の注意 を参照されたい。

ElastiCacheAutoConfigurationを無効にする設定例を以下に示す。

  • Bootstrap.java

    @EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class,
                                          JmxAutoConfiguration.class, WebMvcAutoConfiguration.class,
                                          ElastiCacheAutoConfiguration.class }) //(1)
    public class Bootstrap extends SpringBootServletInitializer {
      // omitted
    }
    
    項番 説明
    (1)
    @EnableAutoConfigurationアノテーションの属性excludeに、ElastiCacheAutoConfiguration.classを指定することで、ElastiCacheの自動設定を除外する。

5.1.3. AWS向けプロジェクトで考慮すべき点・制約事項

5.1.3.1. AWS認証情報(Credentials)の管理

AWS リソースへのアクセスを必要とする場合、AWS認証情報(Credentials)がアプリケーションに設定されている必要がある。 セキュリティの観点から、アクセスキーを直接コードに埋め込むことは推奨されていない。 AWSの公式ドキュメントでは、下記のどちらかにアクセスキーを配置することが推奨されている。

  • AWS 認証情報ファイル
  • 環境変数

詳細は IAM ユーザのアクセスキーを適切に管理する を参照されたい。

Note

Spring Cloud AWSではcom.amazonaws.auth.DefaultAWSCredentialsProviderChainを利用して AWS認証情報をアプリケーションに設定する。特定のクライアントが指定されていない場合、下記のAWS認証情報が利用される。

  • 環境変数AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY
  • システムプロパティaws.accessKeyIdaws.secretKey
  • ユーザのAWS 認証情報ファイル
  • AWSインスタンスプロファイルの認証情報

詳細はSpring Cloud AWSの公式リファレンス SDK credentials configuration を参照されたい。

Warning

Spring Boot使用時はデフォルトの設定の状態では環境変数に設定したAWS認証情報は利用できない。 これはAuto-configurationによってcom.amazonaws.auth.DefaultAWSCredentialsProviderChainが利用されなくなるためである。

環境変数からAWS認証情報を取得するためには下記設定を行う必要がある。

  1. cloud.aws.credentials.instanceProfile=false
  2. cloud.aws.credentials.profileName=(空)
  • application.ymlの設定例

    cloud:
      aws:
        credentials:
          instanceProfile: false
          profileName:
    

Tip

開発者のPCなどのEC2インスタンス以外の環境で、Spring Cloud AWSを利用したAWSリソースへのアクセスを行うアプリケーションを実行する場合、AWS認証情報(Credentials)の取得に長時間を要する。 これは、認証情報取得の際に実行されるAWSCredentialsProviderのうちの一つであるInstanceProfileCredentialsProviderが認証情報を取得できずにリトライを繰り返すためである。

認証情報の取得はAWSリソースへのアクセスが発生する都度行われるため、アプリケーションのレスポンスが著しく低下する。 そのため、EC2インスタンス以外の環境ではInstanceProfileCredentialsProviderを無効にしておくことが望ましい。

InstanceProfileCredentialsProvidercloud.aws.credentials.instanceProfile=falseプロパティを設定しておくことで無効化できる。

  • application.ymlの設定例

    cloud:
      aws:
        credentials:
          instanceProfile: false
    

5.1.3.2. Amazon S3のアクセス許可設定

Amazon Simple Storage Service(以降、S3)に 個人情報などの機密性の高い情報を含むファイルのアップロードを行う場合、 S3バケットに対するアクセス許可を適切に付与する必要がある。

本ガイドラインでは下記の章でS3を使用する。これらの機能を使用する場合、アクセス許可の設定が必要なことに注意されたい。

アクセス許可を付与する際には、

  1. アプリケーションが行うバケットアクセスに必要なアクセス許可
  2. メンテナンスなどの運用上必要なアクセス許可

のみを付与するものとし、不要なアクセス許可を付与しないこと。

バケットポリシーを使用して、アプリケーションが使用するIAMユーザに対してアクセス許可を付与する場合以下のようになる。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1478067513034",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::XXXXXXXXXXXX:user/appuser"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::myBucket/*",
                "arn:aws:s3:::myBucket"
            ]
        }
    ]
}

上記例は、appuserに対して、myBucket配下のファイル(オブジェクト)の参照・更新・削除を行うアクセス許可を付与している。 S3 Management ConsoleもしくはAWS CLIから設定することでアクセス許可を付与することができる。

アクセス許可の詳細については、Amazon Simple Storage Service ドキュメント 開発者ガイド Amazon S3 リソースへのアクセス許可の管理 を参照されたい。

5.1.3.3. アプリケーションを起動するとAmazonServiceExceptionが発生する

アプリケーションを起動しようとすると、 Caused by: com.amazonaws.AmazonServiceException: Stack for i-xxxxx does not exist...が発生する。 Spring Cloud AWSのAuto-configurationであるContextStackAutoConfigurationによって、 アプリケーションのスタック名自動検出が有効になり、AWS CloudFormationのスタックが見つからない場合、 AmazonServiceExceptionが発生しアプリケーションが起動しない。

cloud.aws.stack.auto = falseを設定し、スタックの自動検出を無効化することで回避することができる。

設定例は スタックの自動検出の無効化 を参照されたい。

5.1.3.4. Amazon EC2上でElastiCache Redis使用時の注意

EC2上でアプリケーションを起動しようとすると、Spring Boot: java.lang.IllegalArgumentException: Cannot find cache named 'xxx' for CacheableOperationが発生する。 Spring Cloud AWSのAuto-configurationであるElastiCacheAutoConfigurationによって、ElastiCacheの自動設定が有効になり、AWS ElastiCacheにcache namedの設定がされていない場合、IllegalArgumentExceptionが発生しアプリケーションが起動しない。 そのため、ElastiCacheAutoConfigurationの自動設定を除外する。

設定例は Auto-Configurationの無効化 を参照されたい。