AWS 複数AWSアカウントへのログインを簡単にするスイッチロールのススメ

クマ松です。

10個以上のAWSアカウントを持っていて、それぞれにログインするIAMユーザがいる。
AWS起因の障害発生時にEC2の確認をするのにいちいちログインとログアウトを繰り返す。

これでは仕事が嫌になってしまいます。

今回はそんなイライラを解消するべく、管理用アカウントから子アカウントへ簡単にログインできるスイッチロールの設定を行います。

# 概要

スイッチロールが出来るようになるためには2つのことが必要です。

- IAMユーザがスイッチロールを使う権限を持っている
- スイッチロール側がIAMユーザを信頼している

これを実現する為に、2か所設定変更をします。

|  №  |  作業場所  |  作業対象  |  作業内容  |
| ---- | ---- | ---- | ---- |
|  1  |  管理用アカウント  |  IAMユーザ  |  Actionsts:AssumeRoleを加える  |
|  2  |  子アカウント  |  IAMロール  |  スイッチ用IAMロール作成  |


今回はスイッチ先のAWSアカウントにAdmin権限のロールとReadOnly権限のロールを作ります。

障害対応等でログやメトリクスの状態を確認したい際はReadOnly権限ロールを使い、実作業を行う際はAdmin権限ロールを使う等、用途毎にIAMロールを分けることでオペミスを減らすことが出来ると思います。

![IAM構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/54f2f5d7-07b3-0ae6-bd3c-73ea4da898c3.png)

# 作業手順


|  №  |  作業アカウント  |  作業手順  |
| ---- | ---- | ---- |
|  1  |  管理用アカウント  |  IAMユーザ側にカスタムポリシーをアタッチ  |
|  2  |  子アカウント  |  IAMロール構築用CFnスタックの作成・実行  |


# 実作業
## 管理用アカウントの作業
※ご利用しているIAMユーザに既にAdministratorAccess等の強い権限をアタッチしている場合は、この作業は不要です。

スイッチロールをしたいIAMユーザにsts:AssumeRole権限を付与します。
Resourceには、後工程で作成する予定のIAMロールの名前を設定します。


```json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:iam::{子アカウントID}:role/kumayuki-prod-Administrator-role",
                "arn:aws:iam::{子アカウントID}:role/kumayuki-prod-ReadOnly-role"
            ]
        }
    ]
}
```

## 子アカウントの作業
まずは子アカウントにログインしてIAMロールを作成します。
今回はCloudFormationを使って構築します。

###CloudFormation：Parametereセクションの解説

|  パラメータ名  |  用途  |
| ---- | ---- |
|  ProjectName  |  作成するIAMロールの名前にProjectNameを入れるために設定  |
|  CentralAWSAccount  |  管理用アカウントID  |

```yaml

AWSTemplateFormatVersion: "2010-09-09"
Description:
  IAM Role which will be used by CentralAWSAccount IAM Users
Parameters:
  ProjectName:
    Description: project name
    Type: String
  CentralAWSACcount:
    Description: Central Management and STG AWS Account ID
    Type: String
    MaxLength: 12
    MinLength: 12
    Type: String
```

###CloudFormation：Resourcesセクションの解説

作成するIAMロールは2つですが、それぞれのIAMロールの違いは2か所だけです。

1つ目はManagedPolicyArnsです。
Admin権限を持つIAMロールにはAWS管理ポリシー**AdministratorAccess**を使います。
ReadOnly権限を持つ方には**ReadOnlyAccess**を設定します。

2つ目はRoleNameです。
Admin権限かReadOnly権限なのか判別がしやすいような名前にしましょう。

```yaml

Resources:
# ------------------------------------------------------------#
#  IAM Role
# ------------------------------------------------------------#
  AdministratorRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ${ProjectName}-Administrator-role
      Path: /
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
        - Effect: Allow
          Action: sts:AssumeRole
          Principal:
            AWS:
             - !Sub arn:aws:iam::${CentralAWSACcount}:user/#スイッチロールを許可したいIAMユーザ
             - !Sub arn:aws:iam::${CentralAWSACcount}:user/#スイッチロールを許可したいIAMユーザ
      ManagedPolicyArns:
      - arn:aws:iam::aws:policy/AdministratorAccess
  ReadOnlyAccessIAMRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ${ProjectName}-ReadOnly-role
      Path: /
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
        - Effect: Allow
          Action: sts:AssumeRole
          Principal:
            AWS:
             - !Sub arn:aws:iam::${CentralAWSACcount}:user/#スイッチロールを許可したいIAMユーザ
             - !Sub arn:aws:iam::${CentralAWSACcount}:user/#スイッチロールを許可したいIAMユーザ
      ManagedPolicyArns:
      - arn:aws:iam::aws:policy/ReadOnlyAccess
```

作成されたIAMロールの「信頼されたエンティティ」を見てみます。
スイッチロールを許可したい管理用アカウントのIAMユーザが表示されていることがわかります。

![信頼関係.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/eb869a5e-8980-3662-5156-c3342420807b.png)

# 動作確認
ではスイッチしてみます。
AWSのコンソール画面の右上のヘッダー部分にある「IAMユーザ＠AWSアカウントID▼」をクリックし、「ロールの切り替え」を選択します。
![スイッチロール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/0fbc85ee-c222-16e4-58f3-2641982153c0.png)

スイッチ先のAWSアカウントIDとロール名を入力します。
表示名の入力は任意ですので、空白でも構いません。

![ロールの切り替え.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/2699eb0e-eb37-c378-96b4-031509406002.png)

スイッチロールができました。
![vewTQnEc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/5cb9625d-ce29-2fc9-4401-99534035a8cf.png)

ReadOnly権限にスイッチしましたので、AWSリソースの削除はできません。
![-wdW9e2M.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/9c90b3c4-570f-80a7-2be1-e54e84021142.png)

ぜひご活用下さい。