TerraformをAWS SSOのユーザーの権限で実行する
AWS SSO(Single Sign-On)のユーザー(厳密にいうと、そのユーザーが引き受ける各アカウント上のロール)の権限でTerraformを使いたい場合どうやるのか、調べた結果をまとめます。
方法1. 環境変数にアクセスキーをセットする
まずは、SSOポータルに表示されるこれを使う方法です。コピーしてターミナルに貼り付けて実行するだけです。
今回は、S3バケットを一つ作るだけのコードを用意しています。
terraform { required_version = "= 0.14.7" required_providers { aws = { source = "hashicorp/aws" version = "3.29.1" } } } provider "aws" { region = "ap-northeast-1" } resource "aws_s3_bucket" "test" { bucket_prefix = "ssotest-" }
この環境変数にアクセスキーをセットする方法だと、コード側には特に変更を加える必要がありません。
方法2. profileを作成しそこにアクセスキーをセットする
2つ目の方法は、同じくSSOポータルに表示されるこれです。クレデンシャルファイル内に新しいprofileを作成しそこにアクセスキーを書き、そのprofileをterraform実行時に使います。
$ cat <<EoF >> ~/.aws/credentials > [123456789012_AdministratorAccess] > aws_access_key_id=ASIA4QG4IVOUQ7SZOE22 > aws_secret_access_key=VIxWWUWfvmuLY4G+TeVcdSMQf2g1xXsLyKEDug2g > aws_session_token=IQoJb3JpZ2luX2VjEN7//////////wEaDmFwLW5vcnRoZWFzdC0xIkgwRgIhAMMgwsriNqNjKS8wcXEAqq4pEw2hRml3f591ctlXefjVAiEAxf4matMTBiKK3qCq6zINJHl6Nvr7xg2uNbudrX7Pc5oqhAMI6P//////////ARAAGgw4NTk0NTU0MDA4NzMiDGDxS97YjjBJ/l9egSrYAvj4hpQAABVuuIublSpvi2aFYBZzxk0VaBpwAbZCf3ONlwHV5PzWIjeOEIzSh9ufCN2LnPjEaDAgwcjIesXPHh6iIHDFyw4QEFF1gM5xxTgK0qDOynbK6u4/zPg2QN0F6O4Jqs9v1+k7Pxw/ynXGztEe0DUlHpEHIDCM9aTdYQ9p/yIQn9u8WRe+9oSpkZQiuXkUIc5AiB80S6hWxftbNW8KossvOMuSYGEuH7d8HHq1h9brGLHsUUxEXLmdSE3CXcZkwPEdg4ovoh6LcciM!\[\[(.+)\]\]SV9LdpMSjyfUm9MQ3Pz3+sxNQ7gajvg9zALplUeev+XWsvjyEsrgtkh/LP/7zKFQHYb/kQkKSRXKkpSC5WqjmmwODB0dpeWXMYCIxCnc/18tp8rj2ufU79sakc/b0fgdB7CcgeMASG+XeQHhs7ilaj6qCBS4E3GbFnauDGxV4h+okEYiWG/u+DHuMNvF0oEGOqUB/rC1m2BVtV59mMAq6qS4R2JBQpoSVzvyox+f7dB9PeEHHxSsCScBYd+1m6vP07/SyQo5XZC0kXUqn0QGmTThzNdCdF2bQCkppfKQwYfZw00qPgNaS3XFjFKpn4qnA37MQ0Ha/9Wc2gTDBTsv3TSbv5tlKrNMFk4TiDMcLvni+lQjAT7os3OVu8uJcjg/LSmt4kzLolbI1OhCxFNzgwsWWdxyH2KO > EoF
AWS providerのブロックにprofile引数を追加します。
provider "aws" { region = "ap-northeast-1" + profile = "123456789012_AdministratorAccess" }
方法3. AWS_PROFILE環境変数をセットする
方法2の派生です。クレデンシャルファイル内に新しいprofileを作成しそこにアクセスキーを書くところまでは同じです。この方法ではterraformのコードは変更せず、代わりにAWS_PROFILE環境変数をセットすることで、使うprofileを設定します。
$ export AWS_PROFILE="123456789012_AdministratorAccess"
方法4. AWS providerのブロックにアクセスキーを記載する
次はSSOポータルに表示されるOption3です。この各値をコピーして、AWS providerのブロックに書くことができます。
provider "aws" { region = "ap-northeast-1" + access_key = "ASIA4QG4IVOUQ7SZOE22" + secret_key = "VIxWWUWfvmuLY4G+TeVcdSMQf2g1xXsLyKEDug2g" + token = "IQoJb3JpZ2luX2VjEN7//////////wEaDmFwLW5vcnRoZWFzdC0xIkgwRgIhAMMgwsriNqNjKS8wcXEAqq4pEw2hRml3f591ctlXefjVAiEAxf4matMTBiKK3qCq6zINJHl6Nvr7xg2uNbudrX7Pc5oqhAMI6P//////////ARAAGgw4NTk0NTU0MDA4NzMiDGDxS97YjjBJ/l9egSrYAvj4hpQAABVuuIublSpvi2aFYBZzxk0VaBpwAbZCf3ONlwHV5PzWIjeOEIzSh9ufCN2LnPjEaDAgwcjIesXPHh6iIHDFyw4QEFF1gM5xxTgK0qDOynbK6u4/zPg2QN0F6O4Jqs9v1+k7Pxw/ynXGztEe0DUlHpEHIDCM9aTdYQ9p/yIQn9u8WRe+9oSpkZQiuXkUIc5AiB80S6hWxftbNW8KossvOMuSYGEuH7d8HHq1h9brGLHsUUxEXLmdSE3CXcZkwPEdg4ovoh6LcciMSV9LdpMSjyfUm9MQ3Pz3+sxNQ7gajvg9zALplUeev+XWsvjyEsrgtkh/LP/7zKFQHYb/kQkKSRXKkpSC5WqjmmwODB0dpeWXMYCIxCnc/18tp8rj2ufU79sakc/b0fgdB7CcgeMASG+XeQHhs7ilaj6qCBS4E3GbFnauDGxV4h+okEYiWG/u+DHuMNvF0oEGOqUB/rC1m2BVtV59mMAq6qS4R2JBQpoSVzvyox+f7dB9PeEHHxSsCScBYd+1m6vP07/SyQo5XZC0kXUqn0QGmTThzNdCdF2bQCkppfKQwYfZw00qPgNaS3XFjFKpn4qnA37MQ0Ha/9Wc2gTDBTsv3TSbv5tlKrNMFk4TiDMcLvni+lQjAT7os3OVu8uJcjg/LSmt4kzLolbI1OhCxFNzgwsWWdxyH2KO" }
方法4.aws sso login
コマンドを使う
AWS CLI v2より、AWS SSOのユーザー(厳密にいうと、そのユーザーが引き受ける各アカウント上のロール)の権限でCLIを使うためのコマンドが追加されました。TerraformでもAWS Provider version 3.26よりこの機能がサポートされています。
この機能を使うためには、まずはSSO用のprofileを作成する必要があります。以下の様な形式のprofileを~/.aws/config
に記載します。
[profile my-dev-profile] sso_start_url = https://my-sso-portal.awsapps.com/start sso_region = us-east-1 sso_account_id = 123456789011 sso_role_name = readOnly region = us-west-2 output = json
もちろん手書きで上記を手書きしてもよいですが、aws configure sso
というコマンドを使うと質問に応えていくだけで上記profileができあがるので楽ちんです。
続いて、このprofileの一時認証情報を取得します。aws sso login
というコマンドを使います。
$ aws sso login --profile my-dev-profile 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/ Then enter the code: CJGF-GKBZ
すると、ブラウザが開いて、profileに記載していたSSOポータルが立ち上がります。画面に沿ってログイン処理をしましょう。
コンソールに戻ってくるとSuccessully logged into Start URL: (SSOポータルURL)
と追記されてコマンド終了します。ここまで来るとSSOのユーザー(が引き受ける各アカウント上のロール)の権限が使えるので、方法2と同様 profile引数を書いてTerraformを実行しましょう。
provider "aws" { region = "ap-northeast-1" + profile = "my-dev-profile" }
もしくは方法3のようにAWS_PROFILE環境変数を使う方法も使えます。
$ export AWS_PROFILE="my-dev-profile"
2021/08/23追記
こちらの方法については以下エントリで別途詳細にまとめましたので、あわせてご確認いただければと思います。
方法5. aws2-wrapを使う
aws sso login
をするところまでは方法4と同じです。その後以下のようにaws2-wrap
コマンドのあとにterraformのコマンドを書きます。
$ aws2-wrap --profile my-dev-profile terraform apply
参考情報
- Support AWS CLI v2 AWS Single Sign-On · Issue #10851 · hashicorp/terraform-provider-aws
- AWS SSOプロファイルでもTerraformやSAM-CLIを実行する方法 - 解決策: aws2-wrapツールを使う | Qiita
- Docs overview | hashicorp/aws | Terraform Registry
- AWS CLI を設定する環境変数 - AWS Command Line Interface
- AWS シングルサインオン を使用するための AWS CLI の設定 - AWS Command Line Interface