Terraform を実行する際に、踏み台となる AWS アカウントから AssumeRole で別の AWS アカウントに Terraform を実行するために必要な設定メモ。
設定
AWS 関連の設定
踏み台となる AWS アカウント(アカウントID: 987654321098
)に作成した IAM ユーザーを作成しておき、クレデンシャルの設定をする。
スイッチ先の AWS アカウント(アカウントID: 123456789012
)用の profile の設定はなくて良い。
~/.aws/config
[default] region = ap-northeast-1 output = json [profile test] region = ap-northeast-1 output = json #role_arn=arn:aws:iam::123456789012:role/switch-role-admin #source_profile=default
~/.aws/credentials
[default] aws_access_key_id = ************ aws_secret_access_key = ************************
また、Terraform を Apply とかしたいスイッチ先の AWS アカウント(アカウントID: 123456789012
)に IAM Role を作成して利用可能にしておく。
ここではスイッチ先の AWS アカウント(アカウントID: 123456789012)に arn:aws:iam::123456789012:role/switch-role-admin
を作成しておき、踏み台となる AWS アカウント(アカウントID: 987654321098
)に作成した IAM ユーザーから利用可能にしておく。
Terraform の設定
適当に以下のようなファイルを作成する。 backend と provider で Assume Role の設定が必要となる。
provider.tf
provider "aws" { region = var.aws_provider_configs["region"] shared_credentials_file = var.aws_provider_configs["shared_credentials_file"] assume_role { role_arn = "arn:aws:iam::123456789012:role/switch-role-admin" }
- variables.tf
variable "aws_configs" { type = map(string) }
terraform.tfvars
aws_configs = { region = "ap-northeast-1" shared_credentials_file = "$HOME/.aws/credentials" }
backend.tf
terraform { backend "s3" { bucket = "terraform-987654321098" key = "terraform.tfstate" encrypt = true // vars から受け取れない region = "ap-northeast-1" shared_credentials_file = "$HOME/.aws/credentials" role_arn = "arn:aws:iam::123456789012:role/switch-role-admin" } }
実行
% terraform plan -var-file=terraform.tfvars