AWSのクレデンシャルを記載するファイルの種類

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。望月です。
以前IAM Roleについてブログを書きましたが、今日はその続きです。「AWSのクレデンシャル情報をどこに書くべきか」という話を少し残しておきます。

AWSのクレデンシャル情報を記載する場所

AWSのAPI操作のために必要なアクセスキーとシークレットキーをクレデンシャル情報と呼びます。全てのAPIリクエストに対してクレデンシャル情報を渡してあげないといけません。
AWS CLIでは、コマンド実行毎にクレデンシャル情報を記載する煩雑さを避けるため、~/.aws/configに記載されたクレデンシャル情報を使えるようになっています。 *1このファイルはini形式のファイルになっており、以下のような文法で記載されます。

[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
region=us-east-1

[profile test-user]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
region=us-west-2

クレデンシャル情報や、APIコール先のリージョンなどをこのファイルで一括指定することができます。
ここで重要なのは以下の3点です。

  • 複数のクレデンシャル情報を記載できる
  • コマンド実行時に何も指定しなかった場合、defaultプロファイルのクレデンシャル情報が使われる。
  • defaultプロファイルのみ、セクション名に「profile」のprefixが不要

上記の例で、

aws ec2 describe-instances

を実行するとdefaultプロファイルが利用され、

aws ec2 describe-instances --profile test-user

を利用すると、test-userのプロファイル情報が利用されることになります。
ここまでは、AWS CLIを少し使ったことが有る方ならよく知っている情報だと思います。

他の言語のSDKから利用したい

さて、このファイルに記載されたクレデンシャル情報を他の言語から利用したくなったとしましょう。例えばRubyで書かれたスクリプトからクレデンシャル情報を取得したい場合です。

以前書いたブログで触れましたが、AWS SDK for RubyにはAWS::Core::CredentialProviders::SharedCredentialFileProviderというクラスが存在します。
このクラスはShared Credential Fileに書かれたクレデンシャル情報を取得するためのものです。Shared Credential Fileというのは~/.aws/credentialsファイルのことで、各種SDKで共通で利用できるクレデンシャル情報を記載したファイルです。
このファイルの書式は以下のようなものです。

[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[test-user]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY

気づいたかもしれませんが、Shared Credential Fileには、「profile」をprefixに記載してはいけません。
どうやら、~/.aws/configにはAWS CLI独自の情報を記載し、~/.aws/credentialsには、各言語SDKで共通利用されるクレデンシャル情報を記載するのが望ましいようです。

どう使い分ければよいかまではまだ調べられていないのですが、少しハマったのでメモとして残しておきます。

参考資料

脚注

  1. 環境変数AWS_CONFIG_FILEで任意のファイルを指定することも出来ます