自由帳

とりとめのない学習メモです。主に Web サービスのシステム基盤や運用に関することを書いています

AssumeRole で Terraform を実行するための設定メモ

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