ちょっと話題の記事

AWS CLIで使える認証情報とオプションの設定方法まとめ

2016.02.10

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

西澤です。AWS CLIで複数環境を操作していると、今使っている認証情報が一体何だったのかわからなくなってしまうことはないでしょうか?当たり前のように使いこなしている方も多いのかもしれませんが、情報整理も兼ねて、AWS CLIで利用できる認証情報と一般オプションの設定方法について整理してみたいと思います。

AWS CLIで利用する認証情報とオプション

今回話題にするのは、AWS CLIで利用する認証情報の設定方法がメインです。具体的には、下記の3つです。

  • 認証情報の要素
    • access_key
    • secret_key
    • token(一時認証を利用の場合のみ)

合わせて関連する下記の一般オプションも、同時に確認することが可能です。

  • 一般オプションの要素
    • profile
    • region
    • output

これら合計6つの要素の設定方法とその確認方法を以下にまとめていきたいと思います。

AWS CLIの設定方法とその優先順位

AWS CLIで利用することのできる認証設定についてですが、ドキュメントが分散していたり、英語だったりで、整理できるまでに時間がかかりました。まとめると以下の優先順位で動作します。

  1. コマンドラインオプション
  2. 環境変数
  3. credentialsファイル
  4. configファイル
  5. インスタンスプロファイル

よく読めば下記の公式ドキュメントにもきちんと記載されています。

1. コマンドラインオプション

下記コマンドラインオプションは、他の全ての設定をOverride可能で、最優先で動作します。ただし、設定可能なオプションは下記の一般オプション要素のみで、認証情報の要素をコマンドラインから指定することはできません。

  • --profile
  • --region
  • --output

(利用例)

$ aws ec2 describe-availability-zones --region us-west-2 --output table
---------------------------------------------
|         DescribeAvailabilityZones         |
+-------------------------------------------+
||            AvailabilityZones            ||
|+------------+-------------+--------------+|
|| RegionName |    State    |  ZoneName    ||
|+------------+-------------+--------------+|
||  us-west-2 |  available  |  us-west-2a  ||
|+------------+-------------+--------------+|
||            AvailabilityZones            ||
|+------------+-------------+--------------+|
|| RegionName |    State    |  ZoneName    ||
|+------------+-------------+--------------+|
||  us-west-2 |  available  |  us-west-2b  ||
|+------------+-------------+--------------+|
||            AvailabilityZones            ||
|+------------+-------------+--------------+|
|| RegionName |    State    |  ZoneName    ||
|+------------+-------------+--------------+|
||  us-west-2 |  available  |  us-west-2c  ||
|+------------+-------------+--------------+|

2. 環境変数

一時的に利用する場合には、環境変数をexportで指定する方法が最も容易かと思います。これ以降の項目で設定済の情報を無視して、試すこともできますので、検証や確認用途でも有用だと思います。

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_SESSION_TOKEN
  • AWS_DEFAULT_PROFILE
  • AWS_DEFAULT_REGION
  • AWS_DEFAULT_OUTPUT

(利用例)

$ export AWS_ACCESS_KEY_ID=AKIAXXXXXXXXXXXXXXXX
$ export AWS_SECRET_ACCESS_KEY=5my9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ export AWS_DEFAULT_REGION=ap-northeast-1
$ export AWS_DEFAULT_OUTPUT=text
$ aws ec2 describe-availability-zones
AVAILABILITYZONES   ap-northeast-1  available   ap-northeast-1a
AVAILABILITYZONES   ap-northeast-1  available   ap-northeast-1c

上記の6つの環境変数に加えて、この後の項目でご説明するcredentailsファイルやconfigファイルのパスを、デフォルトパス(後述)から変更できる環境変数も用意されています。credentialsファイルの環境変数によるパス変更は、v1.7.45から可能となりましたが、残念ながら公式ドキュメントにもほとんど反映されていないようです。

  • AWS_SHARED_CREDENTIALS_FILE
  • AWS_CONFIG_FILE

これらの環境変数については、この後、それぞれの項目でも簡単に触れたいと思います。

3. credentialsファイル

aws configureで初期設定を行った際、v1.5.0からcredentialsファイルとconfigファイルで役割を分けて保存されるようになりました。aws configureから設定する場合には意識する必要がありませんが、こちらの設定ファイルにはお作法として認証情報の要素を記載するようにしましょう。

  • ~/.aws/credentials
    • aws configureでは、認証情報の要素が保存される
      • aws_access_key_id
      • aws_secret_access_key
      • aws_session_token(一時認証をする場合のみ、手動で追加)
    • profileは、[プロファイル名]の宣言で指定
    • 環境変数:AWS_SHARED_CREDENTIALS_FILEで上記設定ファイルパスをOverride可能
    • 全般オプションの要素も設定すること自体は可能

(利用例)

$ export AWS_SHARED_CREDENTIALS_FILE=~/.aws/credentials.tmp
$ cat ~/.aws/credentials.tmp
[testprof]
aws_access_key_id = AKIAXXXXXXXXXXXXXXXX
aws_secret_access_key = 5my9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ aws ec2 describe-availability-zones --profile testprof --region ap-northeast-2
{
    "AvailabilityZones": [
        {
            "State": "available",
            "RegionName": "ap-northeast-2",
            "Messages": [],
            "ZoneName": "ap-northeast-2a"
        },
        {
            "State": "available",
            "RegionName": "ap-northeast-2",
            "Messages": [],
            "ZoneName": "ap-northeast-2c"
        }
    ]
}

4. configファイル

参照される優先順位としては、credentialsファイルの次となります。前述の通り、credentialsファイルには認証情報を、configファイルには全般オプション(region/output)を指定するようにしましょう。

  • ~/.aws/config
    • aws configureでは、全般オプションの要素が保存される
      • region
      • output
    • profileは、[profile プロファイル名]の宣言で指定
    • 環境変数:AWS_CONFIG_FILEで上記設定ファイルパスをOverride可能
    • 認証情報の要素も設定すること自体は可能

(利用例)

$ export AWS_CONFIG_FILE=~/.aws/config.tmp
$ cat ~/.aws/config.tmp
[profile testprof]
region = ap-southeast-1
output = text
$ aws ec2 describe-availability-zones --profile testprof
AVAILABILITYZONES   ap-southeast-1  available   ap-southeast-1a
AVAILABILITYZONES   ap-southeast-1  available   ap-southeast-1b

5. インスタンスプロファイル

こちらはAWS CLI実行環境がEC2インスタンスの場合限定となりますが、EC2起動時に割り当てたIAMロール(インスタンスプロファイル)の権限を利用する方式です。この場合は、環境変数またはconfigファイルにリージョン指定だけしておけば、認証情報の管理をすることなく利用可能です。access_keyやsecret_keyを管理する必要がありませんので、この利用方式がベストプラクティスとして推奨されています。

利用している認証情報の確認手順

これまでに整理した5つの設定方法から利用することができる為、今まさに使っている認証情報は一体どこからやってきたものなのか、わからなくなってしまう場合があります。その時にとても便利なコマンドがaws configure listコマンドです。

利用しているprofileやregionの情報も確認できますが、ここでは認証情報の確認に注目して、コマンド結果例とともにご紹介します。

環境変数を参照している場合

Type欄に"env"と表示されます。

$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************IK5Q              env    
secret_key     ****************nA0/              env    
    region                <not set>             None    None

credentialsファイルまたはconfigファイルを参照している場合

Type欄に"shared-credentials-file"と表示されます。

$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************IK5Q shared-credentials-file    
secret_key     ****************nA0/ shared-credentials-file    
    region                <not set>             None    None

インスタンスプロファイルを参照している場合

Type欄に"iam-role"と表示されます。

$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************6A3Q         iam-role    
secret_key     ****************YFRw         iam-role    
    region                <not set>             None    None

まとめ

環境変数や設定ファイルを利用してAWS CLIの認証情報や一般オプションをいざ設定しようとする際に、毎度まとまった情報が見つからず苦労してきたのですが、ようやく整理することができました。AWS CLI利用の際に活用していただけると嬉しいです。