こんにちは、エキサイト株式会社の平石です。
今回は、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を簡単に切り替える方法をご紹介しました。
では、また次回。