SQSからメッセージを読み取るSpring Bootアプリケーションを書いています。環境変数AWS_ACCESS_KEY_ID
およびAWS_SECRET_ACCESS_KEY
を使用してアプリケーションを実行できます。ただし、application.properties
のようなファイルを介してこの構成を渡す方が簡単だと思いました。これを達成する方法は?
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
例外が発生します。
アプリケーションがAWSの外部で実行されている場合、AWSStaticCredentialsProvider
とawsAccessKeyId
および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));
}
プロパティファイルの使用は避け、クレデンシャルプロバイダーチェーンを使用する AWSドキュメント
プロパティファイルは環境変数でオーバーライドすることもできますが、常にそうする必要がある場合は、なぜプロパティファイルでそれを記述する必要があるのでしょうか。また、私はコード(プロパティファイル)でキーをコミットしないようにしたいと思います
さらに、CI/CDを見ると、Spring Boot Environment(特にクラウド上)の環境変数を設定するだけでも意味があり、簡単です。 docker envを使用する場合は、さらに簡単かつクリーンになります。
管理する方法はいくつかあります。
(ローカルまたはLinuxマシンで)aws configureを構成できます。これはシークレットキーとアクセスキーを必要とするため、デフォルトの構成ではこれらをAPIで渡す必要はありません。システムパスからシークレットケットなどを選択するため、接続を作成できます。 。
AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();
AWS EC2を使用している場合は、ec2インスタンスを作成するときに、SQSへのアクセス許可を持つロールを割り当ててください。そうすれば、そのマシンで設定する必要すらありません。
アクセスキーとシークレットキーをapplication/properties
で定義し、@Value
でsqsクラスに読み込むことができます。
classpath
にaws.keys
を作成し、ファイルからプロパティを読み込むことができます。
もちろん、Constant class
で定数として定義することもできます。
Spring Cloud AWSとSpring Bootを使用する場合、一部のAWSクライアント(SQSやSNSなど)とEC2メタデータを自動構成で設定できます。ローカルテストでは、アプリケーションプロパティで設定された静的プロバイダーを使用できます。
具体的には、cloud.aws.credentials.accessKey
やcloud.aws.region.static
などのプロパティを設定できます。
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();
春のブートアプリケーションでは、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>