📖
TerraformをAssumeRoleした状態で実行する
はじめに
スイッチロール先の権限でTerraformを実行することもあると思います。
今回はそれを試してみました。
この構成のメリット
- Terraformが使用するIAM Userで必要な権限は
"Action": "sts:AssumeRole"
のみ- 万が一流出しても最小限の被害ですむ
- スイッチロール先のAWSクレデンシャルが不要
イメージ図
下で記載している、AssumeRoleのチュートリアルにある図を参考にしています。
公式ドキュメント
AssumeRoleの書き方について
AssumeRoleのチュートリアル
検証
今回は実際にAWSリソースは作成せず、data.aws_caller_identity.current
でAssumeRoleしたIAMロールの情報を出力することにします。
現在のアカウント情報を確認する
検証に使うファイルは以下となります。
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.9.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
data "aws_caller_identity" "current" {}
apply後、data.aws_caller_identity.current
を出力します。
AssumeRoleしていないので、IAM Userの情報が出力されるはずです。
$ echo "data.aws_caller_identity.current" | terraform console
{
"account_id" = "<AccountID>"
"arn" = "arn:aws:iam::<AccountID>:user/<User>"
"id" = "<AccountID>:"
"user_id" = "<User>"
}
AssumeRole設定追加
AssumeRoleの設定をtfファイルに加えます。
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.9.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
+ assume_role {
+ role_arn = "<Switch先RoleArn>"
+ }
}
data "aws_caller_identity" "current" {}
確認
先程と同様にecho "data.aws_caller_identity.current" | terraform console
を実行し、スイッチ先のアカウント情報が出力されればOKです。
$ echo "data.aws_caller_identity.current" | terraform console
{
"account_id" = "<スイッチ先AccountID>"
"arn" = "arn:aws:sts::<AccountID>:assumed-role/<AssumeRoleしたIAMロール>/aws-go-sdk-xxxxxxxxxxxx"
"id" = "<AccountID>:"
"user_id" = "略"
}
参考
Discussion