CloudFormationでIAMユーザー作成を自動化

QiitaやYouTubeでAWS操作を共有するときに、ユーザー情報を隠すのが面倒くさい・・
じゃあIAMユーザーを使い捨てにしよう！っということでIAMユーザー作成を自動化します。

# jsonファイル作成
まず、IAMユーザー作成のjsonファイルを作ります。

~~~json:createIamUser.json
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Template for creating Initial IAM",
    "Resources": {
        "IAMUserInitialAdmin": {
            "Type": "AWS::IAM::User",
            "DeletionPolicy": "Retain",
            "Properties":{
                "UserName": {"Fn::Join" : [
                    "",
                    ["demo-iniadmin-user-",{"Ref": "AWS::AccountId"}]
                    ]},
                "LoginProfile": {
                    "Password": "pass",
                    "PasswordResetRequired": true
                },
                "ManagedPolicyArns": [
                    "arn:aws:iam::aws:policy/AdministratorAccess"
                ]
            }
        }
    },
    "Outputs": {
        "UserName": {
            "Description": "Information about User name",
            "Value": { "Ref" : "IAMUserInitialAdmin" }
        },
        "LoginURL": {
            "Description": "Information about console login URL",
            "Value": {"Fn::Join" : [
                "",
                ["https://",{"Ref": "AWS::AccountId"},".signin.aws.amazon.com/console"]
                ]}
        }
    }
}

~~~

# CloudFormationで実行
CloudFormationではスタック作成が実行みたいな感じなので、先程のjsonファイルを使ってスタック作成(実行)します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/f3aca32a-ec2e-f3fc-b075-b7d0bd70081a.png)
今回はテンプレートファイルを直接アップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/82ed1f46-da6d-36ee-ae82-5989f91c7010.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/1520925d-f90b-c451-5d1e-b050de281ad4.png)
スタック名を入力して次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/9b85ab17-47d3-b11d-d8b5-4a9874e246c3.png)
オプション設定は特なし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/d735fb22-d08a-9b01-3aec-4e398b08917b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/5d39fa6e-84f1-7b40-279f-aa32d79aa45b.png)
レビュー画面で確認して問題なければ、最後の青い枠にチェックを入れてスタック作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/e3b27a38-4bc1-415a-bf71-f00d882e8a06.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/42d381ed-b428-ea78-bc89-0d2f84e06a6e.png)
ステータスが作成中になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/ad470689-4f13-b72e-0fe5-212abe81f176.png)
しばらくすると完了する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/8c153da5-65f0-bf2a-aa58-771713733ff3.png)
IAMユーザーが作成されていることを確認！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/a8d94554-4663-693e-2134-b1852b704dce.png)

# 実行に失敗したとき
ロールバックと表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/e28ecb4c-ed8e-1fc1-842f-283806b1e333.png)
イベントタブでエラーメッセージが確認できる。今回はパスワードルールに引っかかりました^^;
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/8caffcd0-21ca-aa49-9e06-670780972d8a.png)
失敗すると、再度スタックの作り直しになる・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/42829e34-451e-415f-0805-f42c7c7b0d21.png)
**※注意点**
失敗するとロールバックと出るので、作成されていないと思ったのですが、IAMユーザーが作られていました。
その状態で実行すると、`xxxxx（残されたままのリソース） is already exists.`というエラーがまた出て、またやり直しになります。
ですので、一旦リソースを確認し削除する必要がありますね。

# 終わりに
初めてCloudFormationを使ってみましたが、CloudFormationだけで完全自動化はちょっと難しそう。(ソース修正する度にスタック作成しなかんし:frowning2:)
参考記事でもLambdaとか組み合わせていたので、Lambdaやaws cliとのコンボで威力を発揮できるサービスな気がします！

# 参考
https://qiita.com/toshikitsubouchi/items/acd1954793e36296bdae
https://dev.classmethod.jp/articles/aws-cloudformation-initaial-iam/
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html
https://tech.nri-net.com/entry/cloudformation_pattern