📖

TerraformをAssumeRoleした状態で実行する

2023/07/28に公開

はじめに

スイッチロール先の権限でTerraformを実行することもあると思います。
今回はそれを試してみました。

この構成のメリット

  • Terraformが使用するIAM Userで必要な権限は"Action": "sts:AssumeRole"のみ
    • 万が一流出しても最小限の被害ですむ
  • スイッチロール先のAWSクレデンシャルが不要

イメージ図

下で記載している、AssumeRoleのチュートリアルにある図を参考にしています。

公式ドキュメント

AssumeRoleの書き方について
https://registry.terraform.io/providers/hashicorp/aws/latest/docs#assuming-an-iam-role

AssumeRoleのチュートリアル
https://developer.hashicorp.com/terraform/tutorials/aws/aws-assumerole

検証

今回は実際にAWSリソースは作成せず、data.aws_caller_identity.current
でAssumeRoleしたIAMロールの情報を出力することにします。

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/caller_identity.html

現在のアカウント情報を確認する

検証に使うファイルは以下となります。

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" = "略"
}

参考

https://katsuya-place.com/terraform-assumerole/
https://blog.serverworks.co.jp/2020/09/28/terraform-by-assumerole

Discussion