TerraformをAWS SSOのユーザーの権限で実行する

2021.02.24

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

AWS SSO(Single Sign-On)のユーザー(厳密にいうと、そのユーザーが引き受ける各アカウント上のロール)の権限でTerraformを使いたい場合どうやるのか、調べた結果をまとめます。

方法1. 環境変数にアクセスキーをセットする

まずは、SSOポータルに表示されるこれを使う方法です。コピーしてターミナルに貼り付けて実行するだけです。 sso-option1

今回は、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を作成しそこにアクセスキーをセットする

sso-option2

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引数を追加します。

方法1とのコードの差分

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 次はSSOポータルに表示されるOption3です。この各値をコピーして、AWS providerのブロックに書くことができます。

方法1とのコードの差分

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ポータルが立ち上がります。画面に沿ってログイン処理をしましょう。

sign-in-to-aws-cli

sign-in-succeed

コンソールに戻ってくるとSuccessully logged into Start URL: (SSOポータルURL)と追記されてコマンド終了します。ここまで来るとSSOのユーザー(が引き受ける各アカウント上のロール)の権限が使えるので、方法2と同様 profile引数を書いてTerraformを実行しましょう。

方法1とのコードの差分

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

参考情報