SpringBootでAWSのCredentialsを簡単に切り替える

こんにちは、エキサイト株式会社の平石です。

今回は、SpringBootでローカル環境からAWSサービスにアクセスする際にCredentialsを簡単に切り替える方法をご紹介します。

はじめに

Spring Bootでローカル環境からAWSサービスにアクセスすることは度々あるかと思います。

S3からファイルを読み込む、パラメータストアから機密性の高いデータを取得するなどなど.....。

このような場面で、AWSサービスにアクセスする際にはアクセスキーを利用することが多いでしょう。
アクセスキーをローカルのcredentailsファイルに保存しておき、その情報をSpring Bootに読み込ませます。
アクセスキーが一つしかない場合には、デフォルトに設定しておけば自動で読み取ってくれます。

しかし、一つのPCから複数のAWSアカウントを利用している場合や、権限ごとにIAMユーザーを切り替えている場合には、credentialsファイルに複数の設定やアクセスキーが必要になります。
その際に、利用場面ごとに使用するcredentialsを指定するにはどうすればよいのでしょうか。

私も、業務でプロジェクトごとに自動で認証情報を切り替える必要があったため、備忘録も兼ねて記事として残そうと思います。

準備

まずは、IAMユーザーのアクセスキーを生成し~/.aws/credentialsファイルと~/.aws/configファイルに認証情報と設定を記述します。

直接記述しても良いですが、AWS CLIの以下のコマンドを実行してプロンプトに沿って入力していくと楽です。
sample-profile1の部分はご自身が設定したいプロファイル名に変更してください。)

aws configure --profile sample-profile1

すると、~/.aws/credentialsファイルと~/.aws/configに以下のように設定されます。

[profile sample-profile1]
region = ap-northeast-1
output = json

[profile sample-profile2]
region = ap-northeast-1
output = json
[sample-profile1]
aws_access_key_id = {access_key1} # 設定した内容が記述されている
aws_secret_access_key = {secret_access_key1}

[sample-profile2]
aws_access_key_id = {access_key2}
aws_secret_access_key = {secret_access_key2}

次に、Java側でAWSを利用するための依存関係を追加します。
Gradleを利用する場合には、build.gradleに利用するSpringBootの依存関係に加えて以下のような依存関係を追加します。
バージョンは適宜変更してください。

dependencies {
    implementation platform("io.awspring.cloud:spring-cloud-aws-dependencies:3.1.0")
    implementation "io.awspring.cloud:spring-cloud-aws-starter-parameter-store"
}

今回は、"io.awspring.cloud:spring-cloud-aws-starter-parameter-store"を追加していますが、Starter Dependencyの一覧を参考にご自身が利用されるサービスに対応した依存関係を追加してください。

認証情報の設定

デフォルトでは、~/.aws/configファイルと~/.aws/crendentialsファイルで[profile default]と指定したプロファイルの認証情報を使って、AWSサービスにアクセスしにいきます。

[profile default]
region = ap-northeast-1
output = json
[default]
aws_access_key_id = {access_key_default} 
aws_secret_access_key = {secret_access_key_default}

したがって、別のアクセスキーを使いたい場合には、defaultのプロファイルを毎回切り替える必要があり面倒です。

そのような場面に対処するために、「~/.aws/crendentialsに記述したプロファイルの中の、どのプロファイルを利用するか」を指定するための設定が用意されています。

application.ymlなどの設定ファイルに以下の設定を追加します。

spring:
  cloud:
    aws:
      credentials:
        profile:
          name: sample-profile1  # aws configure コマンドの --profile オプションで指定した名前
          path: ~/.aws/credentials  # デフォルト値が`~/.aws/credentials`なので、変更していない場合は記述しなくてよい

このようにすれば、例えば同じGradleプロジェクト内の異なるサブプロジェクトで、別の認証情報を利用することも可能です。
そのサブプロジェクトの設定ファイルで利用するプロファイルをsample-profile2にすれば良いのです。

credentialsファイルのパスを変更している場合は、spring.cloud.aws.credentials.profile.pathにそのパスを記述すれば、そのファイルを読みにいくようになります。

なお、バージョン管理せずに完全にローカルだけで利用するのであれば、アクセスキーとシークレットアクセスキーを直接指定することもできるようです。

spring:
  cloud:
    aws:
      credentials:
        access-key: {access_key1}
        secret-key: {secret_access_key1}

あまり使う場面は思いつきませんが、一時的なテストの時には便利だったりするのでしょうか。

終わりに

今回は、SpringBootでAWSのCredentialsを簡単に切り替える方法をご紹介しました。

では、また次回。

参考文献