Terraform Cloud上でIAM RoleからIAM RoleにSwitch Roleしてみた

# はじめに
AWSでは、IAM Roleを使用することでユーザーにアクセス権限を直接紐付けずに操作を許可することができます。
その際は、ユーザーが対象のIAM RoleにSwitch Role操作を行うことで、IAM Roleの権限を利用します。（以下のイメージ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/2009bcc6-f5ea-b1e3-9771-36257ca8b6b5.png)

またユースケースは限られてきますが、一度IAM RoleにSwitch Roleした後、もう一度別のIAM RoleにSwitch Roleする方法も可能です。([参考URL](https://dev.classmethod.jp/articles/role-chaining/))

上記参考URLでも説明されてますが、以下のようなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/efb34075-fa54-1974-fdbc-aa40f10d87b7.png)

本記事では、上記のようなIAM RoleからIAM Roleへの多段Switch Roleを、Terraform Cloud上で実施する方法を試してみました。

以下のようなイメージになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/4424a422-2854-7b9a-c2ea-21f8ca5c2fe7.png)

:::note info
前提
Terraform Cloud上のWorkspaceとAWSアカウントは、IAM Roleでデプロイされるように設定されているものとします。
:::

# 結論
aws providerでAssumeRole用の設定を追記して、resource側のproviderパラメータでaliasを指定することで自動的に多段SwitchRoleされます。

```terraform:provider.tf
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"
  }
}
```

```terraform:s3.tf
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」ロールが設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/906d2396-ef93-34a1-29ee-70b9304889a0.png)

### AWSアカウント設定
IAMロールの信頼関係ではTerraformの特定のOrganizationからのAssumeRoleを許可しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/1e328c2a-d252-b6e0-768f-0caa9ac02129.png)

IAMコンソールのIDプロバイダーでもTerraformとの紐付け設定を実施しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/636613da-1ebb-1e40-24b0-9d24b9aaf83c.png)

冒頭のTerraform図でいうところのSwitch Role先アカウントの"Role B"のIAM Roleも事前に作成しておきます。(「terraform-assume-role」ロール)
信頼関係のPrincipalではTerraform Cloudと紐付けてるIAM RoleのARNを直接指定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/03e36228-e7d7-a53b-7abd-a3074e7e6331.png)


## Terraform実行
Terraformを実装してApplyします。
今回はS3バケットを2つ作成するように実装し、片方のS3バケットはSwitchRoleしたIAM Roleでデプロイされるようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/1d797947-c07a-e093-8257-dfd0273e03d5.png)

Terraform initなどのコマンドは省略しますが、Applyを実行するとエラーなく成功し、2 addedと表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/e68dbc79-2122-288a-ef51-d8916319290f.png)

CloudTrailからCreateBucketイベントを確認してみます。

以下は多段SwitchRoleせずに作成したS3バケットのイベントですが、arnパラメータにWorkspaceで指定したIAM RoleのARNが設定されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/31ddc1fe-bf81-265a-02bf-bb16f550c233.png)

以下は多段SwitchRoleして作成したS3バケットのイベントです。arnパラメータにprovider.tfで指定したIAM RoleのARNが設定されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/4af448bb-06ed-ebb2-f4dc-1f89b2bf87b6.png)

以上のことから、リソースごとにデプロイで利用するIAM Roleを使い分けできることがわかりました。

# おわりに
必要になったので調べてみたら情報がほとんどなかったので、自分で試してみました。
(単純にそのような使われ方をするケースが少ないだけな気もしますね...)

この記事がどなたかの参考になれば幸いです。