AVM を試す

<!-- # AVM を試す -->

![machine_jidouhanbaiki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/beda8140-db6e-9680-4815-587f8a3788d5.png)

今日はこれを試します
https://github.com/aws-samples/aws-account-vending-machine

## これは何

[AWS Landing Zone のキーコンポーネントの一つ](https://aws.amazon.com/jp/solutions/aws-landing-zone/?nc1=h_ls) [※1](#note) です
組織が成長し、 [AWS Organizations](https://aws.amazon.com/jp/organizations/) で複数のアカウントを持つようになると、アカウントを新規作成するときにいろいろと設定することがあって面倒になります。
Ansible 等のサーバプロビジョニングツールで解決したいことと同じような悩みが、AWSのアカウントに対しても生じるわけです。

開発チームに引き渡す前に、セキュリティとかガバナンスとかログ集約とか色々な組織のニーズに沿うように仕立てておきたいとかね。しかしだからといってそれを人の温かみのある手動でポチポチなんてやってられないのですよ。そこで今回のようなツールが欲しくなってまいります

新規メンバーアカウントを作るだけなら [これ](https://docs.aws.amazon.com/cli/latest/reference/organizations/create-account.html) でも出来るんですが、作っただけで後は温かい手動ポチポチでは自動化になりませんので、それとこれとどう違うのかこのサンプルで見ていきましょう

## 事前準備

以下が必要です

1. AWS マスターアカウント
   * （いちばん偉いやつ）
   * 可能であればマスターアカウント自体、サンドボックスとして作ってそこでやりましょう。万一の事故防止ため
1. AVM セットアップ用の権限（後述のAccountAdministrator用, 例: IAM ロール、グループ等）
   * 今回は `arn:aws:iam::010010011111:group/Administrator` にします
   * この group に属する IAM ユーザーで以降の作業をするとやりやすいでしょう
1. [Organizations の有効化](https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_org_support-all-features.html)
1. メールアドレス
    * （新規作成メンバーアカウント用として。例: `aws-avm-my-new-account-001@yourcompany.co.jp` ）
    * 既に他のAWSアカウントで使用されていないか注意しましょう。重複していると B) がもしかしたらうまく行かないかも

## Step by Step walkthrough

さてあとは [書いてあること](https://github.com/aws-samples/aws-account-vending-machine#step-by-step-walkthrough) の通りに進めるだけなのですが、折角なので日本語で解説してゆきましょう

### [A) AVM のセットアップ](https://github.com/aws-samples/aws-account-vending-machine#a-setup-the-account-vending-machine-avm)

1. マスターアカウントへのログインと所定リージョンの選定
  * ここでは `Ohio (us-east-2)` にします（以下のうちいずれか）
      * Ohio (us-east-2)
      * Oregon (us-west-2)
      * Ireland (eu-west-1)
      * Singapore (ap-southeast-1) 
1. `Launch Stack` ボタン押下
  * [こちら](https://github.com/aws-samples/aws-account-vending-machine#a-setup-the-account-vending-machine-avm) に `Launch Stack` ボタンがあります。クリックしましょう
1. Create Stack: 次へ
1. Specify stack details:
    * AccountAdministrator -
        * ここでは `arn:aws:iam::010010011111:group/Administrator` を指定
    * SourceBucket - デフォルト
    * SourceTemplate - デフォルト
1. Configure stack options: 次へ
1. Review page, `I acknowledge ..` 云々にチェック ->  `Create Stack`
1. 10秒ほどで CREATE COMPLETE とアウトプットが得られます。もしうまく行かない時は前工程を疑いましょう
1. Output セクションに AccountLambda という情報が来ていますのでこれを控える
    * ここは画像で補足します。この arn を控えておきます。後工程のインプットになります( `MasterLambdaArn` )
![anoned_Screenshot from 2019-12-20 13-27-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/42576b44-a843-7364-eef4-bb740823974a.png)

ここまでで AVM のセットアップ完了

### [B) AVM の起動と新規アカウントの発行](https://github.com/aws-samples/aws-account-vending-machine#b-launch-the-avm-to-create-a-new-aws-account)

前工程で AVM 自体のセットアップを行いました。その AVM を動かします

1. 前工程で使用した IAM エンティティでマネコンへログインします。 今回の場合 `arn:aws:iam::010010011111:group/Administrator` に属している任意の IAM ユーザーでログインしている前提で進めます

1. [Service Catalog](https://github.com/aws-samples/aws-account-vending-machine/blob/master/resources/images/product-list.png) へ

1. プロダクトリストから AVM > `LAUNCH PRODUCT`

1. Product Version page: 任意の名前（今回は `my-new-account-001`）  を入力し、バージョンを選択

1. Click NEXT

1. Parameters page:
    * MasterLambdaArn: 先の `MasterLambdaArn` で控えた値
    * AccountEmail: 事前準備で用意した任意のメルアド
    * OrganizationalUnitName: あってもなくても良い。お好きに
    * AccountName: Enter an account name
        * ここでは同じく `my-new-account-001` にします
    * StackRegion: お好きに
    * SourceBucket: デフォルト
    * BaselineTemplate: デフォルト
1. Click NEXT.
1. On the TagOptions page, click NEXT.
1. On the Notifications page, click NEXT.
1. On the Review page `LAUNCH`
    * 少し時間がかかります(5~10分くらい)。`AVAILABLE` になるまでコーヒーでも飲みながら待ちましょう
    * もしうまく行かない時は前工程を疑いましょう（メルアド重複、 Organizations の有効化等）
1. こうなれば成功
https://github.com/aws-samples/aws-account-vending-machine/blob/master/resources/images/output.png

* これで次工程 C) に必要なインプットが揃いました
* ※ ここから C) を省略する場合でも最低限、ここで払いだされた IAM ユーザのログイン情報は安全なものに直ちに変更しましょう
    * パスワードがそのまんまですので放置すると危険です
    * 次工程 C) の 2 までやればひとまず安心（初回ログインで変更を強制される）

### [C) 発行した新規アカウントへログインしてみる](https://github.com/aws-samples/aws-account-vending-machine#c-login-to-the-newly-created-aws-account-for-end-user-experience)

1. 前工程 B) で新規作成した AWS アカウントにログイン
    * リージョンは前工程 `StackRegion` で指定したリージョンです
1. ログイン情報入力
    * ログインURL、ユーザ名は前工程 B) のアウトプットとして示されています。パスワードは 参照先の github を参照。初回ログインにつき変更を促されます
1. Service Catalog で pre-configured された AWS Service Catalog products を閲覧できる
1. VPC で 全リージョンの default VPCs が消えているのを確認
1. VPC の新規作成が所定の方法では許可されていないのを確認

※すみませんが続きは長いので本投稿では省略します。英語で構わない方はどうぞ

### [掃除](https://github.com/aws-samples/aws-account-vending-machine#clean-up)

おかしな課金をされないようここまでに作成したリソースを削除しましょう

* `Service Catalog` > `Provisioned Products` にあるものを `terminate`
* CloudFormation console で関連スタックを `Delete`


#### 注

* ※上記の作業だけでは対象の AWS アカウント本体は消えません
*  アカウント本体をクローズしたいときは [こう](https://aws.amazon.com/jp/premiumsupport/knowledge-center/close-aws-account/) してください
  - root のパスワードを得るには [リセット](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys_retrieve.html#reset-root-password) してください

## まとめ

本番用としてはこのサンプルだけでは物足りないのですが、 Landing Zone の理解を深める一助にはなるでしょうか。 baseline を熟成させたりいろいろとやりたくなりますね。ソースを眺めるとより理解が深まるでしょう

本投稿は概ね冒頭の README.md の内容を一部日本語で写しただけなので、 英語を読める方は元の github をそのままご覧になったほうがよいかと思います

## note
* (2021/06/15追記)
  * *当組織では 2021/06 現在、引き続きこのツールを、新規メンバーアカウント作成時に利用しています*
      * *"B) AVM の起動と新規アカウントの発行" は CLI でもできますのでスクリプトにしてオペレーションを簡略化。全リージョンで Default VPC を消失させてくれるというセキリュティ上の利点も利用動機となっています*
      * *(fork して AccountCreationLambda.py の一部を修正したものを使っています)*
  * *※1 但し、もし [Controle Tower](https://aws.amazon.com/jp/controltower/?control-blogs.sort-by=item.additionalFields.createdDate&control-blogs.sort-order=desc) を導入可能な組織であれば、そちらをご検討なさると良いと思います*
      * *同サービスで [Account Factory ](https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/account-factory.html) なる機能が提供されています*