AWS SSOでサードパーティツールを実行する
AWS SSOを利用すると、IAM Access KeyやIAM Secret Access Keyの代わりにブラウザベースの認証を利用してAWS APIにアクセスできます。一方で、AWS SSOに対応しているものはAWS CLI v2ぐらいしかなく、Terraformなどのサードパーティツールはそのままでは使えません。そのため、AWS SSOでサードパーティツールを利用するためのヘルパーツールがいくつか公開されています。例えば aws2-wrap などがあります。
本稿では、AWS SSOやSTSの仕組みを理解するため、手動でShort-term credentialsを取得してサードパーティツールを実行する方法を紹介します。
AWS SSOはすでに設定済みである前提とします。参考までに、AWS SSOの設定例として公式ブログにある How to use G Suite as an external identity provider for AWS SSO を挙げておきます。
Short-term credentialsの取得
SSOセッションが切れている場合は再ログインします。例えば、G Suiteと連携している場合はブラウザでGoogleのログイン画面が表示されます。
% aws s3 ls The SSO session associated with this profile has expired or is otherwise invalid. To refresh this SSO session run aws sso login with the corresponding profile. % aws sso login Attempting to automatically open the SSO authorization page in your default browser. If the browser does not open or you wish to use a different device to authorize this request, open the following URL: https://device.sso.ap-northeast-1.amazonaws.com/ ...
まず ~/.aws/config
の内容を確認します。ここにはAWS SSOでログインするための設定が格納されています。
[profile example] sso_start_url = https://d-********.awsapps.com/start sso_region = ap-northeast-1 sso_account_id = ******** sso_role_name = PowerUserAccess
~/.aws/sso/cache
にあるキャッシュファイルの内容を確認します。ここにはSSOログイン時に取得したアクセストークンが格納されています。
{"startUrl": "https://d-********.awsapps.com/start", "region": "ap-northeast-1", "accessToken": "ey********", "expiresAt": "2020-09-09T22:43:10UTC"}
必要な情報が揃ったら get-role-credentials
コマンドを実行します。以下の引数が必要です。
- --role-name:
~/.aws/config
のsso_role_name
を指定します。これはログイン時に選択したロール名になります。 - --region:
~/.aws/config
のsso_region
を指定します。これはAWS SSOを有効にしたリージョンになります。 - --account-id:
~/.aws/config
のsso_account_id
を指定します。これはログイン先のAWSアカウントになります。 - --access-token:
~/.aws/sso/cache
にあるキャッシュファイルからaccessToken
の値を指定します。
get-role-credentials
コマンドを実行すると、以下のような出力が得られます。
% aws sso get-role-credentials --role-name PowerUserAccess --region ap-northeast-1 --account-id ******** --access-token "ey********" { "roleCredentials": { "accessKeyId": "********", "secretAccessKey": "********", "sessionToken": "********", "expiration": 1599667863000 } }
上記で表示されている情報が Short-term credentials になります。
環境変数の設定とコマンドの実行
前項のコマンドで取得した情報を以下の環境変数に設定します。
% export AWS_ACCESS_KEY_ID=******** % export AWS_SECRET_ACCESS_KEY=******** % export AWS_SESSION_TOKEN=********
環境変数を設定した状態でTerraformを実行してみましょう。AWS APIの呼び出しに成功するはずです。
% terraform apply