エンジニア組織を作るのは難しいけど、AWS上の組織構築は完全に理解した【AWS Organizations】

最近色々悩みに悩んでいるCBcloud 徳盛です。

これまで一人で突っ走っている時にはAWSのインフラを全て一つのアカウントで管理していました。が、エンジニア組織が分割されていくにつれ、どのサービスでどれだけAWSが利用されているのかを特定するのが難しくなってしまったりと、リソース管理の煩雑化が目に見えてきたため、AWSのOrganizationsを利用して整えていこうとしています。
最近ジョインしていただいたAWSの運用にとても詳しい禿にワークショップ形式で教えていただいているので、今回はその内容をメモがてら書いていこうと思います。

## 今回のアカウント設計の全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124149/a34900fb-b2e0-d50d-f8e8-9f8288c324d1.png)

## Organizationsを管理するルートアカウントの操作手順 【ルートアカウント】
### 1. Organizationアカウントの作成
##### 1.1. Organizationsの画面から「アカウントの追加」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124149/30641ceb-5be8-51ee-5ba3-d0b5999e833d.png)

##### 1.2. 必要な情報を入力して、作成を押します。
フルネーム: [サービス名]-prodや[サービス名]-dev
Eメール:  インフラを管理する専用のアドレスにしました。(フルネームをエイリアスに利用)
IAMロール名: 全てのOrganizationアカウントで統一したものにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124149/b372e4b6-96f7-17ba-8f6e-7ea1c8844560.png)

ちなみに、ここで設定したロール名は作成されたアカウント内でロールが自動生成され、Admin権限が付与されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124149/581dcf66-b29f-8ee1-d97b-a0ff0db56edc.png)

## ユーザを管理する側のOrganizationアカウントの操作手順 【IAMユーザ管理アカウント】
[全体像](#今回のアカウント設計の全体像)では、アカウントを管理するOrganizationアカウントを作成して、そこでIAMユーザを管理していますが、弊社ではまだルートアカウントでIAMユーザを管理しているため、「IAMユーザ管理アカウント = ルートアカウント」となっております。
今後、ユーザ管理のCFnを整備できたら移行する予定です。
### 2.　OrganizationのAdminロールにassumeするためのIAMユーザを作成
##### 2.1. まずIAMユーザを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124149/cc47b5f3-2a48-56fe-18c9-82d2ee27e035.png)

##### 2.2. 作成したOrganizationのAdmin権限ロールをassumeするための権限を付与します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124149/1366b5ae-0cb6-6e70-2b98-15f88630df5a.png)

作成されたユーザの「アクセス権限の追加」を押し、下記のjsonを適用してください。

```json:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::{1.2で作成したOrganizationのアカウントID}:role/{1.2で作成したOrganizationのAdmin権限ロール名}"
            ]
        }
    ]
}
```

##### 2.3. セキュリティ上、AサービスのAdmin権限ロールをassumeできる条件として、two-factor認証設定済みIAMユーザとするため、設定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124149/a47cf70e-dc59-b6e0-d6cf-27b17558af88.png)

## assumeされる側のOrganizationアカウントの操作手順 【Aサービス-prodアカウント】
### 3. Aサービスのルートアカウントでログイン
##### 3.1. パスワードのリセット
Aサービスで利用するためのOrganizationアカウントのメールアドレス【[1.2で作ったもの](#12-必要な情報を入力して作成を押します)】を利用してルートアカウントにログインするためには、パスワードのリセットを行う必要があります。
通常のログインページより行ってください。設定を登録アドレス宛にメールがリセットメールが届きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124149/7b5e0292-2a91-20d6-1d25-14c03e19d66c.png)

### 4. [1.2](#12-必要な情報を入力して作成を押します)で自動生成されているAdmin権限ロールに対してassumeできる条件を設定
##### 4.1. [2.1](#21-まずiamユーザを作成します)で作成したIAMユーザのみがAdmin権限ロールにassumeできるように、ロールに変更を追加します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124149/4ad84b7b-867d-031c-0598-a9622a4759a1.png)

```json:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      --省略---
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringLike": {
          "aws:username": "{assumeを許可するIAMユーザ名}"
        },
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        },
        "IpAddress": {
          "aws:SourceIp": "社内のGlobalIPとか"
        }
      }
    }
  ]
}
```

今回はassumeできる条件として、[こちら](#21-まずiamユーザを作成します)で作成したIAMユーザかつ、two-factor認証を設定している、かつ社内からのアクセスだった場合にのみassumeできるようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124149/0779121c-f061-add7-f771-d6fefe26a2f3.png)

## assumeできる環境が整ったので、試してみる
##### アカウントメニューよりスイッチロールを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124149/14fffa67-aaf9-af21-44ff-a44d554cb04b.png)

##### 以下を入力して、ロールの切り替えを行えばOK。
アカウント: 1.で作成したOrganizationアカウントのID
ロール: 1.で作成したOrganizationアカウントのadmin権限ロール名
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124149/627c4b34-64b0-4911-5900-04dd220346ae.png)

##### 新規で作成したOrganizationアカウントにassumeRoleに成功すると当然リソースは何もなく綺麗な状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124149/f597d7e1-f606-2015-a6f7-ce740969928a.png)

# まとめ
時間の関係上ワークショップが途中で終わってしまったため、今回の記事はまだ途中です。
この後、作成したOrganizationアカウントに、メンバーがassumeできるロールを作成し、admin権限を持つロールをassumeできるアカウントを封印する作業や、そもそもこれまでの作業をCFnで管理するというが残っています。
作業完了次第続きをアップできればと思います〜。