GeekFactory

int128.hatenablog.com

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/configsso_role_name を指定します。これはログイン時に選択したロール名になります。
  • --region: ~/.aws/configsso_region を指定します。これはAWS SSOを有効にしたリージョンになります。
  • --account-id: ~/.aws/configsso_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

本稿の内容がAWS SSOやSTSの仕組みを理解する上で助けになれば幸いです。