AWSのクロスアカウントスイッチロールを丁寧に解説します。

今回は、**クロスアカウントスイッチロールを用いてひとつのユーザーでAWSアカウントを切り替える方法**をお伝えします。

## スイッチロールについて

スイッチロールの方法の前に、AWSのIAMにあるユーザー、ロール、ポリシーについてお話しします。
※早く手順を知りたいという方は読み飛ばしてください。

AWSでは、**ポリシーでアクセス権限を定義**していて、**ユーザーやロールなどに割り当てることでアクセス権限を与える**ことができます。
ロールはユーザーに割り当てることが可能で、割り当てられたユーザーは、ロールに割り当てられたアクセス権限を得ることができます。

![イメージ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510908/d1826c46-4139-c65c-3302-1ce113872808.png)


上のイメージを例に、ユーザーAの権限（できること）を考えます。

ユーザーAには次の権限が与えられています。
- 農家になれる権限
- エンジニアになれる権限

各ロール（職業）には次の権限が与えられています。
- 農家　　　：種まき、水やり、収穫　　の権限
- エンジニア：設計、修理、点検　　　　の権限
- 警察官　　：捜査、逮捕、パトロール　の権限

Aさんは農家になれる権限をもっているので、"農家"になり、"種まき"や"水やり"ができます。同じように"エンジニア"になり、"設計"をすることができます。
しかし、"警察官"になることはできないので、残念ながら"捜査"をすることはできません。また、"種まき"は"農家"に与えられた権限なので、Aさんが"エンジニア"になっているときはできません。
つまり、職業に与えられた権限は、ユーザーがその職業になることで権利を行使することができます。スイッチロールに置き換えると、Aは**ロールを切り替えることで、ロールに付与された権限を得る**ことができるということです。

では、異なるAWSアカウントの場合はどうなるでしょうか。

![イメージ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510908/a18b574e-d3bf-8b4f-035a-228080dba493.png)

"ユーザーA"、"農家"とそのポリシーは"AWSアカウントA"にあり、"エンジニア"、"警察官"とそのポリシーは"AWSアカウントB"にあるとします。その場合、**アカウントが異なるため、そのままでは"エンジニア"になることができない**のです。"エンジニア"になるには、**"AWSアカウントB"から"エンジニア"になる許可を与えてあげる**必要があります。"ユーザーA"は実家が農家のため、いつでも跡を継いで"農家"になることができますが"エンジニア"や"警察官"になるには採用されなければならないといった具合です。
（実家を継ぐには家長の許可がいるように、同じAWSアカウント内でもスイッチロールに制限をかけることも可能です。）

## クロスアカウントスイッチロールの前準備
クロスアカウントスイッチロールの設定の手順は大きく2つです。
1. スイッチロール先でロールの信頼ポリシーを設定する
2. スイッチロール元でユーザーにスイッチロールを許可するポリシーを設定する

### スイッチロール先でロールの信頼ポリシーを設定する
まずはスイッチロール先（AWSアカウントB）でロール（エンジニア）を作成します。
①IAMのロールから”ロールの作成”を選択します。
②信頼されたエンティティタイプで”AWSアカウント”を選択します。
**※ここでスイッチロール元のAWSアカウントにスイッチロールする権限を設定します。**
③AWSアカウントで”別のAWSアカウント”を選択し、スイッチロール元の（ユーザーAがいる）AWSアカウントのIDを入力します。

![role1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510908/924cb5b8-f564-1a9b-50f0-5db36298b43f.png)

④ロールに付与するポリシー（権限）を選択します。

![role2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510908/1fe506f1-45fb-d7fb-7fc5-d155c08876c1.png)

⑤ロールの詳細でロール名（エンジニア）を入力します。
⑥信頼ポリシーの中のAWSの値にスイッチロール元の（ユーザーAがいる）AWSアカウントのIDが入っていることを確認します。

![role3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510908/28e76099-7da9-b2d6-8d56-e34a56f9ef1c.png)

⑦許可ポリシーの概要でロールに付与したポリシーを確認します。
⑧間違いがなければ右下の”ロールを作成”を選択します。

![role4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510908/7a3b7d9a-d984-c4cd-b103-c2c6d5e25ed0.png)

「ロール ”ロール名”が作成されました。」のメッセージと、ロール一覧に作成したロールが表示されれば完了です。

![role5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510908/c945cda1-6d1a-f534-9eae-6da1bc17845b.png)



### スイッチロール元でユーザーにスイッチロールを許可するポリシーを設定する
先ほどロールの作成時に信頼されたエンティティタイプで”AWSアカウント”を選択しましたが、このままでは設定したAWSアカウントに属するすべてのユーザーやロールがスイッチロールすることが可能な状態になってしまいます。Aさんの家族全員にエンジニアになる権限を与えている状況です。
そこでAWSアカウントAの中で、Aさんにエンジニアになる権限を設定することで、Aさんのみがエンジニアになることができ、他の家族はエンジニアになることができないようにすることが可能です。

![イメージ3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510908/13bcd163-4e64-2262-4f4c-b6a9de7a814c.png)

では、具体的な手順を説明します。

①IAMのポリシーから画面右上の”ポリシーの作成”を選択します。
②ポリシーエディタで”JSON”を選択し、下記のJSONを入力します。

![b2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510908/7aeee1e8-5ae7-87a0-5ba0-20105987eba2.png)

```
{
    "Statement": [
        {
            "Action": [
                "sts:AssumeRole"
            ],
            "Condition": {},
            "Effect": "Allow",
            "Resource": "arn:aws:iam::AWSアカウントID:role/ロール名
        }
    ],
    "Version": "2012-10-17"
}
```
※"Resource"のAWSアカウントIDとロール名は任意の値に書き換えてください。

③入力が済んだらページ右下の"次へ"を選択します。


④ポリシーの詳細で"ポリシー名"を入力します。
⑤入力が済んだらページ右下の"作成"を選択します。

![b3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510908/8891ef59-f7e5-9cd1-4c31-d53b565823fd.png)


「ポリシー ”ポリシー名”が作成されました。」のメッセージと、ポリシー一覧に作成したポリシーが表示されます。
⑥作成されたポリシーをユーザーAに付与（アタッチ）してください。

![b4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510908/6fd4d49e-529b-2930-310a-5cc7eeda6955.png)

これで準備は完了です。

## スイッチロールの手順
前準備が済んで、ようやくスイッチロールです。

①画面右上の"ユーザー名@アカウントID"が表示されているヘッダーを選択してください。
②メニューバーが開くので"ロールの切り替え"を選択してください。
![c1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510908/3199b114-e85e-b428-79ce-a4a893a0596e.png)

③ロールの切り替え画面が表示されます。
アカウントに"スイッチロール先にAWSアカウントID"、ロールに"スイッチロール先のロール名"を入力して、画面右下の"ロールの切り替え"を選択してください。

![c2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510908/f418aa75-ae14-8f02-0357-79f47701a10f.png)

右上に"スイッチしたロール名@スイッチロール先のAWSアカウントID"が表示されていたら、スイッチロール成功です。

![c3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510908/325651d9-8b81-1cd2-e578-0d7a1bfda680.png)



### スイッチロール先のAWSアカウントにおけるロールの設定
今回の例では、スイッチロール先のAWSアカウントのロール（engineer）では、スイッチロール元のAWSアカウント（ユーザーAが属するもの）のすべてのユーザーにスイッチロールする権限を与え、スイッチロール元でスイッチロールを許可するポリシーを作成し、対象ユーザーにアタッチすることで実現しましたが、スイッチロール先のロールの設定で、スイッチロールの許可をユーザーまで指定することも可能です。厳密に管理ができる反面、運用が大変になるので環境に合わせて使い分けることをおすすめします。

## おわりに
はじめてQiita記事を書きました。わかりづらい部分や拙い部分が多々あったかと思いますが、最後までお読みいただきありがとうございました。
お役に立てていれば幸いです。