AWS Access Portal 経由で Terraform を実行するための接続フロー
目的
AWS Access Portal / IAM Identity Center 経由で取得した認証情報を使い、ローカル環境から Terraform を実行できるようにする。
この手順では、長期の Access Key / Secret Access Key を直接発行せず、AWS CLI の SSO プロファイルを利用する。
前提
- AWS Access Portal にログインできること
- Terraform を実行する対象の AWS アカウントが Access Portal に表示されていること
- Terraform 実行に必要な Permission Set / Role が割り当てられていること
- ローカルに AWS CLI v2 がインストールされていること
- ローカルに Terraform がインストールされていること
1. AWS CLI の確認
aws --version
AWS CLI v2 が入っていることを確認する。
例:
aws-cli/2.x.x Python/3.x.x Linux/x86_64
2. SSO プロファイルの作成
AWS Access Portal 経由で利用するための SSO プロファイルを作成する。
aws configure sso
入力例:
SSO session name: pj-name
SSO start URL: https://xxxxxxxx.awsapps.com/start
SSO region: ap-northeast-1
AWS account: 対象のAWSアカウント
AWS role: Terraform用のPermission Set / Role
CLI default client Region: ap-northeast-1
CLI default output format: json
CLI profile name: pj-name
この手順により、~/.aws/config に SSO 用の profile が作成される。
3. SSO ログイン
作成した profile を使ってログインする。
aws sso login --profile pj-name
ブラウザが開き、AWS Access Portal の認証画面が表示される。
認証が完了すると、ローカルに一時的な認証情報がキャッシュされる。
4. AWS 接続確認
以下のコマンドで、AWS CLI が対象アカウントへ接続できることを確認する。
aws sts get-caller-identity --profile pj-name
正常な場合、以下のような情報が返る。
{
"UserId": "...",
"Account": "123456789012",
"Arn": "arn:aws:sts::123456789012:assumed-role/..."
}
この確認が通れば、AWS CLI 側の認証は成功している。
5. Terraform で profile を使う
Terraform コマンド実行時にも、同じ profile を明示する。
AWS_PROFILE=pj-name terraform init
AWS_PROFILE=pj-name terraform validate
AWS_PROFILE=pj-name terraform plan
毎回 AWS_PROFILE=pj-name を付けるのが面倒な場合は、現在のシェルで環境変数として設定する。
export AWS_PROFILE=pj-name
設定後は、以下のように profile 指定なしで実行できる。
aws sts get-caller-identity
terraform init
terraform validate
terraform plan
確認:
echo $AWS_PROFILE
以下のように表示されれば OK。
pj-name
6. Terraform 初期化
Terraform の対象ディレクトリへ移動する。
例:
cd ~/infra-aws/terraform/
初期化する。
terraform init
正常な場合:
Terraform has been successfully initialized!
と表示される。
7. Terraform plan の実行
terraform plan
8. plan 結果で確認するポイント
terraform plan の結果では、以下の行を必ず確認する。
Plan: X to add, Y to change, Z to destroy.
確認ポイント:
-
to add: 新規作成されるリソース数 -
to change: 変更されるリソース数 -
to destroy: 削除されるリソース数
特に to destroy が 0 以外の場合は要注意。
既存リソースが削除される可能性があるため、内容を確認してから進める。
例:比較的安全
Plan: 5 to add, 2 to change, 0 to destroy.
例:要確認
Plan: 1 to add, 3 to change, 2 to destroy.
9. plan を保存して apply する場合
確認した plan と同じ内容を apply したい場合は、plan をファイルに保存する。
terraform plan -out=tfplan
問題なければ apply する。
terraform apply tfplan
-out を付けずに terraform plan した場合、次に terraform apply を実行した時点で再度 plan が作られるため、完全に同じ内容が適用される保証はない。
10. よくあるエラー
No valid credential sources found
エラー例:
Error: No valid credential sources found
Error: failed to refresh cached credentials, no EC2 IMDS role found
原因:
Terraform 実行時に AWS profile が指定されていない。
例:
AWS_PROFILE=pj-name terraform init
terraform plan
この場合、init だけ profile 付きで実行され、plan では profile が指定されていない。
対応:
AWS_PROFILE=pj-name terraform plan
または:
export AWS_PROFILE=pj-name
terraform plan
SSO セッション切れ
SSO の一時認証情報が期限切れになると、Terraform や AWS CLI の実行に失敗する。
対応:
aws sso login --profile pj-name
再ログイン後、再度 Terraform を実行する。
Deprecated attribute / Argument is deprecated
警告例:
Warning: Deprecated attribute
Warning: Argument is deprecated
意味:
現在の Terraform AWS Provider では古い書き方になっている設定がある。
これは直ちに plan 失敗の原因ではないが、今後の provider 更新で問題になる可能性があるため、別途修正対象とする。
11. 今回確認できたこと
今回の環境では、以下まで確認済み。
aws sts get-caller-identity --profile pj-name
が成功。
その後、以下も成功。
AWS_PROFILE=pj-name terraform init
AWS_PROFILE=pj-name terraform plan
つまり、AWS Access Portal / IAM Identity Center 経由で Terraform から AWS へ接続するフローは成立している。
12. 基本コマンドまとめ
毎回 profile を付ける場合:
aws sso login --profile pj-name
aws sts get-caller-identity --profile pj-name
AWS_PROFILE=pj-name terraform init
AWS_PROFILE=pj-name terraform validate
AWS_PROFILE=pj-name terraform plan
AWS_PROFILE=pj-name terraform plan -out=tfplan
AWS_PROFILE=pj-name terraform apply tfplan
シェルに profile を設定する場合:
export AWS_PROFILE=pj-name
aws sso login
aws sts get-caller-identity
terraform init
terraform validate
terraform plan
terraform plan -out=tfplan
terraform apply tfplan
補足
Terraform 用途では、長期の Access Key / Secret Access Key を発行しなくても、AWS Access Portal / IAM Identity Center の SSO 認証で実行できる。
長期アクセスキーは漏洩時のリスクが高いため、基本的には SSO 経由の一時認証情報を利用する方が安全。