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

2021.02.24

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"

方法5. aws2-wrapを使う

aws sso loginをするところまでは方法4と同じです。その後以下のようにaws2-wrapコマンドのあとにterraformのコマンドを書きます。

$ aws2-wrap --profile my-dev-profile terraform apply

参考情報