Featured image of post AWS CLIの設定方法

AWS CLIの設定方法

目次

概要

  • 最近はSSOを使う事が多いが、AWS CLIの設定も時々行う
  • そのため、AWS CLIの設定の備忘録を残す

前提

  • 前提としてAWS CLI v2がインストールされているとする
    • v2以降でないとSSOが未対応のため
1
2
$ aws --version
aws-cli/2.0.59 Python/3.7.4 Darwin/18.7.0 exe/x86_64

方法

アクセスキーでの設定方法

2つのユーザータイプ

AWSには次の2つのユーザータイプがある。
それぞれのタイプによってフローが若干異なる。

  • ルートユーザ
    • メールアドレスとパスワードでログインする
  • IAMユーザー
    • アカウントIDとAWS環境から作成したIAMユーザの情報でログインする

ルートユーザーとIAMユーザー

ルートユーザーの場合

まずはメニューからセキュリティ認証情報に進む。

メニュー

その後アクセスキー作成を押下する。

IAM管理画面

IAMユーザーの場合

IAM > ユーザー > セキュリティ認証情報 からでアクセスキーを作成に遷移する。

IAM > ユーザー > セキュリティ認証情報

アクセスキーの作成(共通)

  • アクセスキーの作成からはルートユーザーとIAMユーザーで共通のフロー
  • 次のフローに従う
  • 最終的にクレデンシャルのCSVをダウンロードする

AWS CLIとプロファイル

  • 前提としてAWS CLIはProfileという概念を持つ。
  • 複数環境を分けられるように、Profileという名前でAWSクレデンシャルを管理する。
  • グローバル(デフォルト)のProfileはdefaultとなる。

AWS CLIとアクセスキーの紐づけ

プロファイルの設定

デフォルトの場合は以下のコマンドを使う。

1
2
3
4
5
6
$ aws configure

AWS Access Key ID [None]: xxxx
AWS Secret Access Key [None]: xxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json

プロファイル名を指定して設定する場合は以下を使う。

1
$ aws configure --profile xxx-dev

プロファイルの確認

現在使用中のプロファイルの確認は次を使う。

1
2
3
4
5
6
$ aws configure list
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************O6MQ shared-credentials-file
secret_key     ****************QyHl shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config

プロファイル名を指定する場合は次となる。

1
2
$ aws configure list --profile xxx-dev
...

設定されているプロファイル名一覧を取る場合は以下を使う。

1
2
3
$ aws configure list-profiles
xxx-dev
default

プロファイルの編集

プロファイルを編集する場合は、次のファイルに格納されているため、直接編集する。

1
$ vim ~/.aws/credentials

設定ファイルの中身は次のような形になる。

1
2
3
4
5
6
7
$ cat ~/.aws/credentials 
[default]
aws_access_key_id = AAAAAAAAAAAAAAAAAAAA
aws_secret_access_key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
[prod]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

Profileを指定してAWS CLIを使う

次のようにコマンドに対して--profile xxx逐次設定する。
なお、デフォルトはdefaultプロファイルが利用される。

1
$ aws s3 ls --profile xxx-dev

もしくは、環境変数から設定する。
環境変数に指定した場合は--profileの指定は不要になる。

1
export AWS_DEFAULT_PROFILE=xxx-dev

環境変数から設定する場合

環境変数からAWS CLIの認証情報の設定をする場合は、次のような変数を環境変数としてexportする。

1
2
3
export AWS_ACCESS_KEY_ID=xxx
export AWS_SECRET_ACCESS_KEY=xxx
export AWS_DEFAULT_REGION=ap-northeast-1

MFAの場合

MFAの場合はSTSを利用する。

1
$ aws sts get-session-token --serial-number xxx --token-code xxx --profile xxx

なお、オプションは次となる。

  • --serial-number
    • IAM > ユーザー > 認証情報 > MFAデバイスの割り当て > ARNを設定する
  • --token-code
    • MFAの認証コード
  • --profile
    • AWSアカウントのプロフィール名

IAM

上記コマンドを実行すると、次が返る。

1
2
3
4
5
6
7
8
{
    "Credentials": {
        "AccessKeyId": "*****",
        "SecretAccessKey": "*****",
        "SessionToken": "*****",
        "Expiration": "2022-10-19T19:38:53+00:00"
    }
}

このレスポンスをベースにcredentialを更新する。

1
2
3
4
5
6
$ vim .aws/credentials

[xxx]
aws_access_key_id = AccessKeyId
aws_secret_access_key = SecretAccessKey
aws_session_token = SessionToken

つまり、逐次作業用のcredentialを取ってくる必要があるという事。

SSOでの設定方法

SSOの初回セットアップ

  • 次のコマンドでAWS SSOの初期設定をする
  • なお、RegionはIAM Identity Centerを設置したRegionを指定する
  • invalid_grant invalid grant provided aws ssoのエラーの場合は、大体Regionの設定ミス
  • profile名は新たに設定するモノであり、<env>-<role>がおすすめ
  • RoleはPowerUserAdministrationAccessなど
1
2
3
4
5
6
$ aws configure sso --profile xxx-admin --no-browser
SSO start URL [None]: [https://xxx.awsapps.com/start](https://xxx.awsapps.com/start) 
SSO Region [None]: us-east-1
SSO registration scopes [sso:account:access]:
Browser will not be automatically opened.
Please visit the following URL:
  • ここで複数のAWSアカウントや複数のRoleがある時はインタラクティブに聞かれる
  • しかし、2回目以降はAWSアカウントやRoleは聞かれない
    • 最初にセットしたものが自動的に選択される
  • 故にProfileで設定する名前は<env>-<role>などがベター
  • ブラウザを開いてSSOのCLIでの利用許可を求められるので、ログインして「Allow」を押下する
1
2
3
4
5
6
7
There are 5 AWS accounts available to you.
Using the account ID xxxxxxx 
The only role available to you is: AdministratorAccess
Using the role name "AdministratorAccess"
CLI default client Region [ap-northeast-1]:
CLI default output format [json]:
CLI profile name [AdministratorAccess-xxxxx]: xxx-admin

これにて最初のセットアップは完了。

SSOの設定の確認

下記コマンドでバケット一覧が取得できればOK。
これでS3への画像アップロード機能などがローカルサーバーでも動くはず。

1
2
3
$ aws s3 ls --profile xxx-admin
2022-05-26 19:43:35 xxx-dev
2022-05-26 19:44:19 xxx-web-stg

SSOの設定の意味

  • ~/.aws/config は下記のようになってる
  • これはつまり、新しいprofile xxx-adminが作られて、それがssoのログインと紐づいたという意味
  • もちろん、この時にxxx-admin用のアクセストークンなどのクレデンシャルを設置する必要はない
  • あくまでブラウザでSSOでログインしたのがAWS_ACCESS_KEYAWS_ACCESS_SECRETの取得に相当する
1
2
3
4
5
6
7
 [profile xxx-admin]
 sso_start_url =https://xxx.awsapps.com/start
 sso_region = ap-northeast-1
 sso_account_id = xxxxxx
 sso_role_name = AdministratorAccess
 region = ap-northeast-1
 output = json

SSOでログイン(2回目以降)

次のコマンドで、2回目以降のSSOによるアクセスキーの有効化を行う。
このprofileは先ほどaws configure ssoで新たに作ったprofileを指定する。

1
$ aws sso login --profile xxx-admin

その他

~/.aws/config~/.aws/credentialsの違い

次の違いがある。

  • ~/.aws/credentials
    • AWSの認証情報(アクセスキーなど)を格納するために使用される
  • ~/.aws/config:
    • AWS CLIの設定を格納するために使用される
    • また、~/.aws/credentials で定義されているプロファイルに追加の設定情報を提供するためにも使われる
      • 上記STSの例がまさにそれ

AWS_PROFILEAWS_DEFAULT_PROFILEの違い

次の違いがある。

  • AWS_PROFILE
    • これは最も一般的に使用される環境変数で、AWS CLIまたはSDKで使用するプロファイルを指定する
    • ~/.aws/credentials または ~/.aws/config ファイル内の特定のプロファイルを選択するために使われる
  • AWS_DEFAULT_PROFILE
    • これは主に後方互換性のために存在する環境変数で、AWS_PROFILEと同じように機能する
    • 以前のバージョンのAWS CLIではAWS_DEFAULT_PROFILEが使われていたが、現在ではAWS_PROFILEが推奨されている

なお、AWS_PROFILEAWS_DEFAULT_PROFILEの両方がある場合はAWS_DEFAULT_PROFILEが勝つ。

AWSの環境変数の管理方法

AWSの環境変数は、次の管理がおすすめ

  • まず、githubのリポジトリは、GHQで自動的にフォルダを管理する
  • organizationレベルで.envrcファイルを設置し、direnvで自動的に読み込む
  • レポジトリ単位で.envファイルを設置し、docker-composeで自動的に読み込む

参考文献

Built with Hugo
テーマ StackJimmy によって設計されています。