web-dev-qa-db-ja.com

Spring BootアプリケーションでAWS SDKを初期化する方法は?

SQSからメッセージを読み取るSpring Bootアプリケーションを書いています。環境変数AWS_ACCESS_KEY_IDおよびAWS_SECRET_ACCESS_KEYを使用してアプリケーションを実行できます。ただし、application.propertiesのようなファイルを介してこの構成を渡す方が簡単だと思いました。これを達成する方法は?

5
Adi

EC2(主に非開発環境)でサービスを実行している場合は、AWS_ACCESS_KEY_IDのためにAWS_SECRET_ACCESS_KEYおよびEC2ContainerCredentialsProviderWrapperを構成する必要はありません。資格情報はから自動的にフェッチされます。 AWSコンテナ。

    @Profile({"non-prod", "prod"})
    @Bean("AWSCredentialsProvider")
    public AWSCredentialsProvider amazonAWSCredentialsProvider() {
        return new EC2ContainerCredentialsProviderWrapper();
    }

注:下記のAWSCredentialsProviderChainのいずれかを使用する場合は、AWSCredentialsProviderではなくAWSStaticCredentialsProviderを使用してください。そうしないと、com.amazonaws.AmazonServiceException: The security token included in the request is expired例外が発生します。

  • デフォルトAWSCredentialsProviderChain
  • EnvironmentVariableCredentialsProvider
  • SystemPropertiesCredentialsProvider
  • ProfileCredentialsProvider
  • EC2ContainerCredentialsProviderWrapper

アプリケーションがAWSの外部で実行されている場合、AWSStaticCredentialsProviderawsAccessKeyIdおよびawsSecretAccessKeyのハードコード値を使用できます。

aws.awsAccessKeyId:AWS_ACCESS_KEY_ID
aws.awsSecretAccessKey:AWS_SECRET_ACCESS_KEY
    @Value("${aws.awsAccessKeyId:}")
    private String awsAccessKeyId;

    @Value("${aws.awsSecretAccessKey:}")
    private String awsSecretAccessKey;

    @Profile({"dev", "test"})
    @Bean("AWSCredentialsProvider")
    public AWSStaticCredentialsProvider amazonAWSCredentialsProviderDevelopment() {
        return new AWSStaticCredentialsProvider(new BasicAWSCredentials(
                awsAccessKeyId, awsSecretAccessKey));
    }
2

プロパティファイルの使用は避け、クレデンシャルプロバイダーチェーンを使用する AWSドキュメント

プロパティファイルは環境変数でオーバーライドすることもできますが、常にそうする必要がある場合は、なぜプロパティファイルでそれを記述する必要があるのでしょうか。また、私はコード(プロパティファイル)でキーをコミットしないようにしたいと思います

さらに、CI/CDを見ると、Spring Boot Environment(特にクラウド上)の環境変数を設定するだけでも意味があり、簡単です。 docker envを使用する場合は、さらに簡単かつクリーンになります。

1
Kru

管理する方法はいくつかあります。

  1. (ローカルまたはLinuxマシンで)aws configureを構成できます。これはシークレットキーとアクセスキーを必要とするため、デフォルトの構成ではこれらをAPIで渡す必要はありません。システムパスからシークレットケットなどを選択するため、接続を作成できます。 。

    AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();
    

aws cliの設定方法

  1. AWS EC2を使用している場合は、ec2インスタンスを作成するときに、SQSへのアクセス許可を持つロールを割り当ててください。そうすれば、そのマシンで設定する必要すらありません。

  2. アクセスキーとシークレットキーをapplication/propertiesで定義し、@Valueでsqsクラスに読み込むことができます。

  3. classpathaws.keysを作成し、ファイルからプロパティを読み込むことができます。

  4. もちろん、Constant classで定数として定義することもできます。

1
kj007

Spring Cloud AWSとSpring Bootを使用する場合、一部のAWSクライアント(SQSやSNSなど)とEC2メタデータを自動構成で設定できます。ローカルテストでは、アプリケーションプロパティで設定された静的プロバイダーを使用できます。

ドキュメント: https://cloud.spring.io/spring-cloud-static/spring-cloud-aws/2.0.1.RELEASE/single/spring-cloud-aws.html#_spring_boot_auto_configuration

具体的には、cloud.aws.credentials.accessKeycloud.aws.region.staticなどのプロパティを設定できます。

0
David

Aws sdk 2.0の変更点は次のとおりです。

    AwsBasicCredentials awsCreds = AwsBasicCredentials.create(this.accessKey, this.secretKey);

    S3Client client = S3Client.builder().region(Region.AP_SOUTH_1)
            .credentialsProvider(StaticCredentialsProvider.create(awsCreds))
            .build();
0
Rajesh

春のブートアプリケーションでは、application.ymlアノテーションを使用して@valueファイルに記述されているプロパティにアクセスできます。次のようなサービスを作成できます。

@Service
public class AmazonClient {  
    private AmazonSQS sqsClient;

    @Value("${amazonProperties.accessKey}")
    private String accessKey;
    @Value("${amazonProperties.secretKey}")
    private String secretKey;

    @PostConstruct
    private void initializeAmazon() {
        BasicAWSCredentials awsCredentials = new BasicAWSCredentials(this.accessKey, this.secretKey);
        this.sqsClient = AmazonSQSClientBuilder
                .standard()
                .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
                .build();

    }
}

application.ymlファイル:

amazonProperties:
   accessKey: <your_access_key>
   secretKey: <your_secret_key>
0
fatCop