SpringBootのローカル環境でSSOしているプロファイルでAWS Parameter Storeから値を取得する方法

エキサイト株式会社メディア事業部エンジニアの佐々木です。タイトルがわかりにくいですが、SpringBootのローカル開発環境でもAWS PamareterStoreにある値を使用したいのでご紹介します。通常はAWS ParameterStoreのパッケージを入れるだけで、すぐできるのですが弊事業部はAWS SSOを全面的に採用しています。($HOME/.aws配下に設定を書かないです)このAWS SSOの場合の設定が割となかったので書きます。

前提

$ java --version
openjdk 21.0.3 2024-04-16 LTS
OpenJDK Runtime Environment Corretto-21.0.3.9.1 (build 21.0.3+9-LTS)
OpenJDK 64-Bit Server VM Corretto-21.0.3.9.1 (build 21.0.3+9-LTS, mixed mode, sharing)

$ ./gradlew --version

------------------------------------------------------------
Gradle 8.5
------------------------------------------------------------

Build time:   2023-11-29 14:08:57 UTC
Revision:     28aca86a7180baa17117e0e5ba01d8ea9feca598

Kotlin:       1.9.20
Groovy:       3.0.17
Ant:          Apache Ant(TM) version 1.10.13 compiled on January 4 2023
JVM:          21.0.3 (Amazon.com Inc. 21.0.3+9-LTS)
OS:           Mac OS X 14.4.1 aarch64

$./gradlew bootRun
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.5)

AWSの設定

AWS ParameterStore を下記のような設定にします。

key: /config/sample/techblog.demo
value: デモです

依存関係の設定

build.gradleに下記を書きます。

dependencies {
....
        implementation platform("io.awspring.cloud:spring-cloud-aws-dependencies:3.1.0")
        implementation platform("software.amazon.awssdk:bom:2.26.7")
        developmentOnly "software.amazon.awssdk:sso"
        developmentOnly "software.amazon.awssdk:ssooidc"
        implementation "io.awspring.cloud:spring-cloud-aws-starter-parameter-store"
....
}

記述量が多いですが、spring-cloud-aws-dependenciesAWSがSpringBoot用に提供してくれているライブラリを統合管理してくれています。あとは必要なものだけ追加するような感じです。AWS SSO を使用している場合に必要なのは、下記の2つです。

developmentOnly "software.amazon.awssdk:sso"
developmentOnly "software.amazon.awssdk:ssooidc"

Application.ymlの設定

application.ymlの設定にて、ParameterStoreの読み込み指定を行います。

spring:
  config:
    import: aws-parameterstore:/config/sample

aws-parameterstore という接頭辞で起動時にParamterStoreからパラメータを読み出してくれます。

コード例

application.ymlの設定で、SpringBootの起動時にParameterStoreからの読み込みはできるようになりました。これを下記のようなコードでJavaConfigにマッピングを行います。

    @ConfigurationProperties("config.sample")
    public record S3ConfigProperties(TechBlog techblog) {
        record TechBlog(String demo) {}
    }

最近は、record の対応が進んで、application.ymlからのプロパティの読み込みもイミュータブルで読み込めるようになりました。

起動します

SpringBootを起動する前に、aws sso login コマンドを実行してログインする必要があります。

aws sso login --profile ${sample-app} 

これでログインしたあとにSpringBootを起動するとデータが取得できています。

ログインしない場合

aws sso login でログインせずにSprginBootを実行すると下記のようなエラーがでます。

Config data resource '[ParameterStoreConfigDataResource@77795936 context = '/config/sample', optional = false]' via location 'aws-parameterstore:/config/sample' does not exist

まとめ

セキュリティの重要性が高まっている昨今、ローカルでもAWSパラメータストアが使いたいケースはあるかと思います。この設定をしておくと、AWSの他のサービスへの接続もライブラリが提供されている範囲内でローカル環境から接続できるので便利です。ぜひ使ってみてください。

さいごに

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。

募集職種一覧はこちらになります!(カジュアルからもOK) www.wantedly.com