【Terraform】Cloud9からAssumeRole先の別AWSアカウントにデプロイする設定についてご紹介します

本記事では、アカウントAにあるCloud9から、アカウントBにAssumeRoleしてリソースをデプロイする為の設定についてご紹介します。
2024.04.17

※本記事ではTerraform v1.7.0を使用しています。

概要

下記図のようなイメージです。

  • アカウントA
    • Cloud9:Terraform開発環境
    • ロールA:Cloud9(EC2)に割り当てられたIAMRole
  • アカウントB
    • ロールB:AssumeRole先IAMRole

設定方法

① ロールB

  1. 「AdministratorAccess」を付与します。(※用途に応じて適切なポリシーを付与してください)
  2. 信頼されたエンティティに下記を定義します。
{
	"Version":"2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": {
				"AWS": "[ロールAのARN]"
			},
			"Action": "sts:AssumeRole",
			"Condition": {
				"StringEquals": {
					"sts:ExternalId": "[任意の文字列]"
				}
			}
		}
	]
}

よりセキュアにするためにExternalIdを設定しています。

② ロールA

  1. 「AdministratorAccess」を付与します。(※用途に応じて適切なポリシーを付与してください)
  2. インラインポリシーとして下記を定義します。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "[ロールBのARN]"
        }
    ]
}

③ TerraformのProvider設定

  1. 下記のようにprovider設定を定義します。
provider "aws" {
  region = "ap-northeast-1"
  assume_role {
    role_arn     = "[ロールBのARN]"
    session_name = "terraform"
    external_id  = "[sts:ExternalIdで設定した文字列]"
  }
}

注意事項

Cloud9はデフォルトの設定により、起動時に自身の所属するアカウントに対しての一時的なクレデンシャルが発行されます。
本記事の設定よりこちらのクレデンシャルの方が優先されてしまうため、本記事の設定を行う際には下記サイトの手順で設定を無効化しておく必要があります。