昔自分で作った、AWS Secrets Managerの値をSpring Bootでいい感じに使えるようにした - しおしおと同じようにAWSのSecrets Managerの値をSpringの設定値として使えるやつがSpring Cloud AWSに追加されていたので試してみました。*1
ライブラリの追加
build.gradle
を以下のようにしています。
CloudFormation
は使っていないので、CloudFormation関連のBeanが作成されないようにaws-java-sdk-cloudformation
は除外しています。*2
ext { set('springCloudVersion', 'Greenwich.RELEASE') } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } configurations { implementation { exclude group: 'com.amazonaws', module: 'aws-java-sdk-cloudformation' } } dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" implementation "org.jetbrains.kotlin:kotlin-reflect" implementation 'com.fasterxml.jackson.module:jackson-module-kotlin' implementation 'org.springframework.cloud:spring-cloud-starter-aws' implementation 'org.springframework.cloud:spring-cloud-starter-aws-secrets-manager-config' }
確認用のクラス
PropsコンポーネントのsecretId
プロパティにSecrets Managerのhoge.secretId
の値が設定されるようにしています。
RestControllerでは、確認用に設定されている値を返しています。
@RestController class HelloController( private val props: Props ) { @GetMapping("/hello") fun hello(): Mono<String> { return Mono.just("secretId: ${props.secretId}") } } @Component @ConfigurationProperties(prefix = "hoge") class Props { lateinit var secretId: String }
シークレットを作成する
デフォルトでは、 /secret/application
とうい名前のシークレットから値を取得するようなので、/secret/appliction
という名前で以下のシークレットを作成します。
アプリケーションを実行する
作成したシークレットが、設定されアプリケーションで参照できていることが確認できます。
curl http://localhost:8080/hello secretId: application_hoge
アプリケーション毎にシークレットを作成する
application.properties
にspring.application.name
を設定し、アプリケーションごとにシークレットを用意できます。
下のようにアプリケーション名をsiosio
とした場合は、シークレット名を/secret/siosio
として作成します。
spring.application.name=siosio
確認用に以下のシークレットを作成します。
アプリケーションを実行する
/secret/siosio
のシークレットの値を参照できていることが確認できます。
curl http://localhost:8080/hello secretId: siosio_hoge
プロファイル毎にシークレットを作成する
シークレット名の最後に_プロファイル名
を付加すると、プロファイル専用のシークレットを用意できます。
例えば、prod
専用のシークレットの場合/secret/siosio_prod
のように作成します。
確認用に以下のシークレットを作成します。
アプリケーションを実行する
指定したプロファイル用のシークレットの値を参照できていることが確認できます。
curl http://localhost:8080/hello secretId: prod_hoge
シークレットの参照順
シークレットは以下の順で参照されます。
- プロファイルに対応するシークレット
- アプリケーション名に対応するシークレット
- 共通(/secret/application)のシークレット
おわり。
*1:ドキュメント→Spring Cloud AWS
*2:application.propertiesにcloud.aws.stack.auto=falseでもOKだと思います