しおしお

IntelliJ IDEAのことなんかを書いてます

Spring Cloud AWSのSecrets Manager機能を試してみた

昔自分で作った、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という名前で以下のシークレットを作成します。

f:id:sioiri:20190209064644p:plain

アプリケーションを実行する

作成したシークレットが、設定されアプリケーションで参照できていることが確認できます。

curl http://localhost:8080/hello
secretId: application_hoge

アプリケーション毎にシークレットを作成する

application.propertiesspring.application.nameを設定し、アプリケーションごとにシークレットを用意できます。 下のようにアプリケーション名をsiosioとした場合は、シークレット名を/secret/siosioとして作成します。

spring.application.name=siosio

確認用に以下のシークレットを作成します。

f:id:sioiri:20190209065439p:plain

アプリケーションを実行する

/secret/siosioのシークレットの値を参照できていることが確認できます。

curl http://localhost:8080/hello
secretId: siosio_hoge

プロファイル毎にシークレットを作成する

シークレット名の最後に_プロファイル名を付加すると、プロファイル専用のシークレットを用意できます。 例えば、prod専用のシークレットの場合/secret/siosio_prodのように作成します。

確認用に以下のシークレットを作成します。

f:id:sioiri:20190209070023p:plain

アプリケーションを実行する

指定したプロファイル用のシークレットの値を参照できていることが確認できます。

curl http://localhost:8080/hello
secretId: prod_hoge

シークレットの参照順

シークレットは以下の順で参照されます。

  1. プロファイルに対応するシークレット
  2. アプリケーション名に対応するシークレット
  3. 共通(/secret/application)のシークレット

おわり。

*1:ドキュメント→Spring Cloud AWS

*2:application.propertiesにcloud.aws.stack.auto=falseでもOKだと思います