AWS Secrets Manager | シークレットをローテーション、管理、取得 | アマゾン ウェブ サービス (AWS)に保存した値を、アプリケーションの設定値として使えるようにしてみた。
例えば、 @Valueを使って、Secrets Managerの値を設定したりできる感じ
作ったもの
EnvironmentPostProcessorの実装クラスを作って、Secrets Managerの値を最も優先して使えるようにしています。*1
使ってみる
spring-cloud-aws-secrets-managerは公開していないので、git cloneしてMavenローカルリポジトリにインストールしてからDependenciesに追加してあげます。
Gradleの場合は、こんな感じになります。
runtime 'com.github.siosio:spring-cloud-aws-secrets-manager:1.0.0'
Secrets Managerに値を登録する。今回は動いていることを確認しやすくするためにspring.datasource.urlにでたらめな値を設定してみてます。
アプリケーションを実行する前にAWSの認証情報を設定してあげます。環境変数の場合はこんな感じになります。
export AWS_ACCESS_KEY_ID=your_access_key_id export AWS_SECRET_ACCESS_KEY=your_secret_access_key
実行すると、こんな感じにjdbcUrlがダメだよとエラーになるので、Secrets Managerの値を参照して動いているのがわかります。
Dependencies追加するだけで、Secrets Managerの値がさくっと使えるのはちょっと便利かもしれない。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is java.lang.RuntimeException: Driver org.h2.Driver claims to not accept jdbcUrl, (๑•̀ㅂ•́)و✧
残念なところ
Spring Cloud for Amazon Web Servicesとセットで使うことができないです。
spring cloud awsの最新版(2.0.0.RC1)が依存しているAWS SDKのバージョンがSecrets Manager SDKのバージョンよりだいぶ古いのが原因です。
おわり。
*1:73. Spring Boot Applicationを参考に作りました