AWS CLI を使って CloudFormation スタック作成をコマンドラインで実行する

管理コンソールからいちいちポチポチするのがだるいので調べてみた。

サマリー

必要なのは以下二つ。

  • 必要なアクセスキーは事前につくって入手しておく
  • aws cloudformation create-stack コマンドを使う

コマンドライン

$ aws cloudformation create-stack --stack-name testFromCreateStack --template-body myEnv.yaml --capabilities CAPABILITY_IAM --parameters ParameterKey=NameTagValue,ParameterValue=stakiran ParameterKey=KeyPairName,ParameterValue=keypair_stakiran_gen

引数が長ったらしいが、以下のとおり

  • スタック名
  • アップするテンプレートファイル
  • (テンプレート中で IAM つくってる場合は)その旨に同意するための指定
  • 各パラメータの指定

アクセスキー

IAM からユーザーつくって、アクセスキーとかメモして、このユーザーに以下のポリシーを付ける。

問題はポリシーをどうするかだけど、結論としては以下の権限が必要。

  • a) CloudFormation でスタックをつくる、消す系の権限
  • b) テンプレートから操作するリソースに関するすべての権限

b) が曲者で、いちいち洗い出して列挙するのが面倒くさすぎる。また、列挙したとしてもすぐエラーになって「実は iam:PutRolePolicy が必要やねん」「iam:AddRoleToInstanceProfile が足りとらんぞおい」と 「暗黙のうちに依存している分」が指定されてない 問題に苦しむ。

……で、面倒くさくなったので、ワイルドカードでフルコンにした。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:ListStacks",
                "cloudformation:UpdateStack",
                "cloudformation:DeleteStack",
                "cloudformation:TagResource",
                "cloudformation:ValidateTemplate",
                "iam:*",
                "ec2:*",
                "route53:*"
            ],
            "Resource": "*"
        }
    ]
}

無論、ずっと使うのは危ないので、終わったらアクセスキーは消しとく。今回は実験したかっただけなので一度成功を確認できたところで消しといた。

動作確認方法

create-stack

「リクエスト送信の可否」が非同期で返ってくる。失敗時はエラーメッセージ。

スタック作成の成否自体はわからない ので、次の方法を。

create-stack の後

一番簡単なのは管理コンソールにログインして、CREATE FAILED で落ちてないか見る。

もう少し頑張ってここもコマンドライン完結したいなら、describe-stack を 定期的に実行して CREATE_COMPLETE になるまで監視する など工夫する必要があるだろう?(まだ試してない)

以下は describe-stack の実行例。

$ aws cloudformation describe-stacks

出力。

{
    "Stacks": [
        {
            "StackId": "arn:aws:cloudformation:ap-northeast-1:...",
            "StackName": "...",
            "Description": "...",
            "Parameters": [
                {
                    "ParameterKey": "KeyPair",
                    "ParameterValue": "hogefugapiyo"
                },
                ...
            ],
            ...
            "StackStatus": "CREATE_COMPLETE", // ★ここを監視する感じか
            ...
        },
        {
            "StackId": ...,
            ...
        },
        ...
    ]
}

所感

  • やろうと思えばコマンドライン完結もできそう
  • アクセスキー運用の良いプラクティスって無いんだろうか?
    • フルコンポリシー + アクセスキー注意深く管理して、以外に何かある?

参考