はじめに
AWSでは、IAM Roleを使用することでユーザーにアクセス権限を直接紐付けずに操作を許可することができます。
その際は、ユーザーが対象のIAM RoleにSwitch Role操作を行うことで、IAM Roleの権限を利用します。(以下のイメージ)
またユースケースは限られてきますが、一度IAM RoleにSwitch Roleした後、もう一度別のIAM RoleにSwitch Roleする方法も可能です。(参考URL)
上記参考URLでも説明されてますが、以下のようなイメージです。
本記事では、上記のようなIAM RoleからIAM Roleへの多段Switch Roleを、Terraform Cloud上で実施する方法を試してみました。
前提
Terraform Cloud上のWorkspaceとAWSアカウントは、IAM Roleでデプロイされるように設定されているものとします。
結論
aws providerでAssumeRole用の設定を追記して、resource側のproviderパラメータでaliasを指定することで自動的に多段SwitchRoleされます。
provider "aws" {
alias = "default"
region = "ap-northeast-1"
}
provider "aws" {
alias = "assume_role"
region = "ap-northeast-1"
assume_role {
role_arn = "arn:aws:iam::123456789123:role/role-b"
session_name = "assume-role-b"
}
}
resource "aws_s3_bucket" "main" {
bucket = "test-default-bucket-123456789132"
force_destroy = true
}
resource "aws_s3_bucket" "sub" {
provider = aws.assume_role
bucket = "test-assume-bucket-123456789132"
force_destroy = true
}
実施例
事前設定
Terraform Cloud設定
Terraform CloudのWorkspaceにはVariable setsで「terraform-deproy-role」ロールが設定されています。
AWSアカウント設定
IAMロールの信頼関係ではTerraformの特定のOrganizationからのAssumeRoleを許可しています。
IAMコンソールのIDプロバイダーでもTerraformとの紐付け設定を実施しています。
冒頭のTerraform図でいうところのSwitch Role先アカウントの"Role B"のIAM Roleも事前に作成しておきます。(「terraform-assume-role」ロール)
信頼関係のPrincipalではTerraform Cloudと紐付けてるIAM RoleのARNを直接指定しておきます。
Terraform実行
Terraformを実装してApplyします。
今回はS3バケットを2つ作成するように実装し、片方のS3バケットはSwitchRoleしたIAM Roleでデプロイされるようにしています。
Terraform initなどのコマンドは省略しますが、Applyを実行するとエラーなく成功し、2 addedと表示されました。
CloudTrailからCreateBucketイベントを確認してみます。
以下は多段SwitchRoleせずに作成したS3バケットのイベントですが、arnパラメータにWorkspaceで指定したIAM RoleのARNが設定されていることがわかります。
以下は多段SwitchRoleして作成したS3バケットのイベントです。arnパラメータにprovider.tfで指定したIAM RoleのARNが設定されていることがわかります。
以上のことから、リソースごとにデプロイで利用するIAM Roleを使い分けできることがわかりました。
おわりに
必要になったので調べてみたら情報がほとんどなかったので、自分で試してみました。
(単純にそのような使われ方をするケースが少ないだけな気もしますね...)
この記事がどなたかの参考になれば幸いです。