AssumeRoleについて

# はじめに
こんにちは、@72_mikanです。
AssumeRoleを使う機会があり、最初かなりとっつきにくいイメージがあったためアウトプット目的でAssumeRoleについてまとめていきます。

# 目次
- IAM - Identtity and Access Manegement について
- AssumeRoleについて
- AssumeRoleの使い方
- 最後に

# IAM - Identtity and Access Manegement について
AssumeRoleを使う前にIAMについてまとめていきたいと思います。
IAM(Identtity and Access Manegement)はAWSリソースのアクセスを安全に管理するためのサービスのことで、ユーザーがAWSリソースへのアクセス制限の権限を一元管理することができます。
具体的にはIAMユーザー、IAMグループ、IAMロールがあり、これらには最初作成された時点では何の権限も持っていない状態になります。つまり、AWSリソースを使えない状態になります。

![iam1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517290/ada71b37-cce5-b48d-a26e-d0fe91e6d5bc.png)


これらに対し、アクセス許可を定義したIAMポリシーを作成し、付与することでIAMポリシーに定義されているリソースのアクセス権限を与えることができます。

![iam2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517290/d246e45a-0292-7973-976a-2484ba3bad76.png)


ここで、補足としてIAMユーザー、IAMグループ、IAMロールについて説明すると、IAMユーザーとはAWSを利用するアカウントのことで、先ほども言ったように作られた時点では何の権限も持っていない状態、つまり、何の操作もできない状態になります。これに対し、アクセス許可を定義したIAMポリシーをIAMユーザーに付与することでIAMポリシーで許可されたAWSリソースにアクセスすることができるようになります。

IAMユーザーにIAMポリシーを付与する以外にIAMグループを作成し、IAMポリシーを付与する方法もあります。
こちらの方法では、IAMグループにIAMユーザーを作成することでIAMグループ内のユーザーはIAMグループに付与されたIAMポリシーの権限を持っている状態になります。こうすることで、複数のIAMユーザーを管理することができます。

最後に、IAMロールについて、IAMロールはAWSサービスやアプリケーションに権限を付与する仕組みになります。
IAMロールを作成し、作成したIAMロールにIAMポリシーを付与し、IAMロールを権限を与えたいAWSリソースに付与することで使うことができます。
例えば、EC2から何かしらの操作でS3にアクセスしたいとき、通常であればアクセスすることができないが、S3のアクセス許可が付与されたIAMロールを付与することでEC2からS3にアクセスすることができるようになります。

ここまでが、IAMについての解説になります。

# AssumeRoleについて
ここからAssumeRoleについて話していきたいと思います。AssumeRoleを
使うことで別のAWSアカウント
実はAssumeRoleはIAMのサービスではなくAWS STS(Security Token Service)のサービスの1機能のことになります。
ここで、事前にIAMについて話したことについて疑問に思うかもしてません。事前にIAMについて話したのでAssumeRoleではIAMロールを使う必要があるためです。
AssumeRoleを使うことで別のAWSアカウントからAWSリソースを操作することができるようになります。

具体的なイメージは以下のようになります。
![assumerole1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517290/624efe65-f296-414b-5a44-c9b7c8ff8d39.png)

いきなり全体像を示されてもわからないと思うのでひとつずつ見ていきます。
まず、二つのAWSアカウント(ID:1111111111とID:2222222222)がある状態とします。

::: note warn
AWSアカウントはIAMユーザーのことを指しているわけではありません。
AWSアカウント内で作成するユーザーのことがIAMユーザーのことになります。
つまり、画像で示されているUserがIAMユーザーを指しています。
:::

今回、別のAWSアカウントからAWSリソースを操作したいので外部AWSアカウント(ID:222222222222)のIAMユーザーがAWSアカウント(ID:111111111111)のAWSリソースを操作したいとします。

最初にIAMロールを作成する必要があります。
IAMロールを作成する際、信頼されたエンティティを選択する必要があります。
今回は外部のAWSアカウント(ID:222222222222)を信頼したいので、AWSアカウントを選択し、信頼するAWSアカウントとして外部AWSアカウント(ID:222222222222)を指定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517290/3a8007b7-2b00-64a7-f0c0-2ffe8a6c303b.png)
![Role1し.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517290/dc6a84a5-04bd-c504-1be5-0aed0cfbfa89.png)

こちらで作成された信頼ポリシーは以下のようになります。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Principal": {
                "AWS": "222222222222"
            },
            "Condition": {}
        }
    ]
}
```
その際、ポリシーのActionでは"sts:AssumeRole"が設定されます。
これで、IAMロールに対して外部のAWSアカウント(ID:222222222222)を信頼していると定義することができます。
![assumerole3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517290/8fbd3a8b-f57b-176f-ea81-2086c271105a.png)


次に、AWSリソースの使用の許可が定義されたポリシーを作成し、ロールに付与する必要があります。
IAMロールの部分で説明させていただいたようにAWSリソースの許可が定義されたポリシーを作成し、IAMロールに付与する必要があります。
こちらはIAMロールを作成する際、ポリシーを付与できるのでそちらを行い完了となります。
![assumerole2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517290/77398ad3-cc7d-98d8-41bb-967acd9cb40f.png)

最後に外部のAWSアカウント(ID:222222222222)でIAMユーザーを作成し、AWSアカウント(ID:111111111111)で作成したロールを使えるようにポリシーを定義する必要があります。
以下のようにポリシーを定義することでAssumeRoleの設定が完了となります。
```
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "Statement1",
			"Effect": "Allow",
			"Action": "sts:AssumeRole",
			"Resource": "arn:aws:iam::111111111111:role/ロール名"
		}
	]
}
```

![assumerole4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517290/bf3ce1c5-569e-0e5d-99b8-413b9ff5971e.png)

以上のようにAWSアカウント(ID:111111111111)のIAMロールと外部のAWSアカウント(ID:222222222222)でIAMユーザーを定義することでAWSアカウント(ID:111111111111)のIAMロールからSTSが発行されAWSアカウント(ID:222222222222)でIAMユーザーがそのSTSを介してIAMロールを使うことでAWSアカウント(ID:111111111111)のAWSリソースを操作することができるようになります。

# AssumeRoleの使い方
最後にAssumeRoleの切り替えについてみていきたいと思います。
まず、初めにAWS上の右上にあるアカウント名@2222-2222-2222(アカウントID)をクリックしロールのきりかえをクリックします。
![assume1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517290/c7a78b57-7898-ca50-2b47-954a9f6e91b4.png)

そこからswitch roleの画面に遷移するのでAccountとroleの部分には相手のID(ID:111111111111)を指定し、ロール名をすることでAWSアカウント(ID:222222222222)からAWSアカウント(ID:111111111111)のIAMリソースを操作できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517290/d337ac00-1ce0-952c-ba69-ebfe9d94ed41.png)


# 最後に
いかがでしたでしょうか？AssumeRole は使えれば便利なのでこの機会に触れてみてはいかがでしょうか？