Terraform設定手順(IAM Identity Centerを利用)

AWSIaC

IAMユーザーとIAM Identity Centerユーザーとでは、Terraformの設定が異なる。
IAM Identity CenterユーザーでTerraformが使えるところまでの設定を行う。

0. 現状

terraform planコマンド実行時に、ExpiredTokenエラーが出る

% t plan

Planning failed. Terraform encountered an error while generating this plan.


 Error: Retrieving AWS account details: validating provider credentials: retrieving caller identity from STS: operation error STS: GetCallerIdentity, https response error StatusCode: 403, RequestID: 4ef0e1b2-c5f4-4e6d-902e-ac9493df32f1, api error ExpiredToken: The security token included in the request is expired
 
   with provider["registry.terraform.io/hashicorp/aws"],
   on main.tf line 1, in provider "aws":
    1: provider "aws" {
 

% 



1. 修正

1-1. AWS CLI 設定ファイルの編集

~/.aws/config ファイルを開き、以下の設定を追記

[sso-session tf-sso]
sso_region = us-east-1
sso_start_url = https://************.awsapps.com/start/#

[profile tf-sso_profile]
sso_session = tf-sso
sso_account_id = *************
sso_role_name = AdministratorAccessCode language: JavaScript (javascript)

1-2. SSO ログイン

AWS CLIで、設定済みのプロファイル(例:tf-sso)でSSOログインを行う。

Amazon Web Services (AWS)
Then enter the code: QJZV-ZFTT" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button">
% aws sso login --sso-session tf-sso
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.us-east-1.amazonaws.com/

Then enter the code:

QJZV-ZFTT

コマンドを実行するとブラウザが自動的に開くのでログインを完了させる。

ログインが成功すると、CLIに認証情報がキャッシュされる

1-3. プロファイルの環境変数設定

環境変数を設定して、Terraformで指定したプロファイルの認証情報を使用する(ユーザーtf-test-userのプロファイルを使用)

% export AWS_PROFILE="tf-sso_profile"



1-4. Terraform 実行

terraform planコマンドを実行して、AWSプロバイダーへの認証が通ることを確認する。

% terraform init
% terraform plan



参考サイト

MFA認証が有効な環境でAssume RoleしてTerraform実行する方法をまとめてみた[AWS] | DevelopersIO



Tips

~/.aws/config と ~/.aws/credentials ファイルの違いまとめ

ファイル名主な用途主な内容
~/.aws/config設定ファイルリージョン、出力形式、プロファイル設定
~/.aws/credentials認証情報アクセスキー ID とシークレットキー

Terraform の provider "aws" ブロック内で指定する profile の値でプロファイルを設定する。
SSOを使う場合は、 ~/.aws/credentials の設定は不要

背景: ~/.aws/credentials の役割

通常、AWS CLIは以下の認証情報を利用してAWSにアクセスする:

  • aws_access_key_id: アクセスキーID
  • aws_secret_access_key: シークレットアクセスキー
  • (オプション)aws_session_token: 一時的なセッショントークン

これらの認証情報を ~/.aws/credentials に保存することで、CLIツールがそれを参照して認証する。

SSOの場合の違い

SSOを利用する場合は、アクセスキーやシークレットキーを使用しません。代わりに、AWS IAM Identity Centerで設定されたSSO認証情報を使ってセッションを確立します。この仕組みには以下の特徴があります:

SSOログインで取得される一時認証情報は、自動的にAWS CLIのキャッシュフォルダに保存されます。

アクセスキー不要

AWS CLIは、ブラウザを通じてAWS IAM Identity Centerで認証します。認証後、AWS CLIはローカルに一時的な認証情報(キャッシュ)を保存します。

認証情報の管理が簡単

アクセスキーやシークレットキーをローカルに保存しないため、セキュリティリスクが低減します。IAM Identity Centerでユーザー管理やロール付与を行うため、個別のアクセスキー発行が不要です。

~/.aws/config に設定がまとめられる

SSOを利用する場合、必要な情報は ~/.aws/config に記述します。

参考:

Terraform AWS Provider: How to Use & Examples
What is Terraform AWS provider? Learn how to authenticate using parameters in the provider configuration options and usi...


~/.aws/config ファイルの記述形式(SSOの場合)

[sso-session tf-sso]
sso_region = us-east-1
sso_start_url = https://************.awsapps.com/start/#

[profile tf-sso_profile]
sso_session = tf-sso
sso_account_id = *************
sso_role_name = AdministratorAccessCode language: JavaScript (javascript)
1. [sso-session tf-sso]

このセクションはSSO(シングルサインオン)セッションの情報を定義します。

設定項目説明
sso-sessionセッションの名前。プロファイルでこの名前を参照します。
sso_regionAWS Identity Center(SSO)が設定されているリージョン。
sso_start_urlAWS Identity Center(SSO)のスタートURL(組織固有)。ブラウザログインの入口となります。

2. [profile tf-sso_profile]

このセクションはAWS CLIで使用するプロファイルを定義します。

設定項目説明
profileプロファイル名。この名前でAWS CLIからプロファイルを指定します。
sso_session使用するSSOセッションの名前([sso-session tf-sso] の名前を指定)。
sso_account_idアクセスするAWSアカウントのID。
sso_role_nameAWS Identity Centerで割り当てられたロール名(例: AdministratorAccess)。