AWSクレデンシャル情報取得のベストプラクティス(AWS SDK for Go)


はじめに

ECS(Fargate)でAWS SDK for Goを使ってAWSサービスを操作した際に、最初は勢いで作ったものの本当にこれでいいんだっけ?とモヤモヤしたことがあったので、クレデンシャル情報取得の優先順位とベストプラクティスについてまとめます。

結論

いきなりですが、下記がベストプラクティスとされる優先順位です。
詳細について後述します。

1. ECSでアプリを実行している場合、タスクロール
2. EC2でアプリを実行している場合、EC2のIAMロール
3. 認証情報ファイル
4. 環境変数

Sessionの生成

まず、AWSサービスを使うためのsessionを生成します。
今回はリージョンのみ指定しています。

sess, err := session.NewSession(&aws.Config{
        Region: aws.String("ap-northeast-1")},
)

クレデンシャル情報取得の優先順位

上記のようにクレデンシャル情報の指定がない場合、以下の優先順位で認証情報を取得します。

1. 環境変数
2. 認証情報ファイル
3. EC2でアプリを実行している場合、EC2のIAMロール
4. ECSでアプリを実行している場合、タスクロール

それぞれの取得方法についての詳細です。

1.環境変数から認証情報を取得

開発作業中にローカル環境(macを想定)やAWS上のEC2インスタンスなどでまずはどの環境でもサクッと動かしたい時に有用です。

$ export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
$ export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

2.認証情報ファイル

credentialsのことです。AWS CLIや他の言語のAWS SDKで利用されるもの同じです。
aws configureコマンドで作成するとデフォルトで ~/.aws/credentials に作成されます。
クレデンシャル情報について何も指定しない場合は [default] の情報を取得します。

[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

3.EC2 IAMロール

IAMロールを利用することで、EC2インスタンスの一時的なセキュリティ認証情報でAWSサービスの呼び出しを行うことができます。
クレデンシャル情報をさらすことも、手元でファイルを保管することなく、EC2インスタンスへのクレデンシャル情報の配布および管理を安全に行うことができます。

4.ECS タスクロール

タスクロールを利用することで、ECSタスク上で動作するアプリが一時的なセキュリティ認証情報でAWSサービスの呼び出しを行うことができます。
EC2 IAMロールと同様にクレデンシャル情報を安全に配布・管理できます。
また、 タスクの実行IAMロール という似たような名前のロールがありますが、こちらは タスクがECRからのコンテナイメージのプルや、コンテナログをCloudWatchに発行を行うために必要なもの です。タスクロールとは異なります。

[まとめ]クレデンシャル情報取得のベストプラクティス

環境変数にクレデンシャル情報を設定してしまえばローカル環境でもAWS上の環境でも動作はしますが、アクセスキーやシークレットアクセスキーが流出するリスクがあります。
認証情報ファイルも同様です。

最終的にAWS上の環境にデプロイするのであればIAMロール or タスクロールがベストプラクティスです。
以下、ベストプラクティスとされる優先順位です。

1. ECSでアプリを実行している場合、タスクロール
2. EC2でアプリを実行している場合、EC2のIAMロール
3. 認証情報ファイル
4. 環境変数

参考