AWS CloudFormationの知見共有

在宅勤務しています。打鍵音のうるさい同僚もいないから超快適。

昨年末からAWSを触り始めて、その翌月にはSAAを取得して、今に至ります。好きなAWSのサービスはELBです(これが言いたかっただけ)

CloudFormationを使う

構成管理はCloudFormationを使っています。
Terraformという選択肢もありましたが、最初に触ったのがCloudFormationだったので今も使い続けているという感じです。必要になったらTerraformで書けばいいかな、程度。

samと一緒に使う

CFnのデプロイはCode4兄弟を使うのがベストプラクティスではありますが、軽く検証したいときなどはsamを使うほうが手軽でオススメです。
例えば、↓のようなスクリプトを書いたみたり。マネコンでポチポチしているのがバカバカしく思えるくらい効率的。

#!/bin/bash
set -Ceu

function env_test() {
    STACK_NAME='test-stack'
    APP_ENV='test'

function env_stage() {
    STACK_NAME='stage-stack'
    APP_ENV='stage'
}

function env_prod() {
    STACK_NAME='prod-stack'
    APP_ENV='prod'
}

BUCKET_NAME=''

if ! type env_$1 > /dev/null 2>&1; then
    echo '引数には test,stage,prod のいずれかを指定してください'
    exit 1
fi

env_$1

echo '=== Validate ==='
sam validate -t ${TEMPLATE}

echo '=== Deploy ==='
sam deploy \
    -t template.yml \
    --stack-name ${STACK_NAME} \
    --s3-bucket ${BUCKET_NAME} \
    --s3-prefix ${STACK_NAME} \
    --confirm-changeset true \
    --capabilities CAPABILITY_IAM \
    --region ap-northeast-1 \
    --parameter-overrides \
        ParameterKey=AppEnv,ParameterValue=${APP_ENV}

コマンド実行順

CFnだけでアプリケーション設定を完結しようとすると、コマンドやらを使わざるを得ません。
そのコマンドに関する注意点。公式ドキュメントにも書いてありますが、

コマンドは、名前のアルファベット順に処理されます。 https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-init.html#aws-resource-init-commands

とのこと。順序を保証させたいときは、↓のようにプレフィックスに数字を付与したりします。

commands:
  00_install_agent:
    command: ./install auto
    cwd: /home/ec2-user/
  01_adjust_timezone:
    command: timedatectl set-timezone Asia/Tokyo
  02_install_php:
    command: amazon-linux-extras install php7.3 nginx1 -y
  03_install_libs:
    command: yum install php-mbstring php-bcmath php-xml php-opcache php-pecl-zip -y

sysvinitで指定するfiles

cfn-init がファイルブロックによっていずれかを直接変更する場合、このサービスは再起動されます。 https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-init.html#aws-resource-init-services

files で作成したファイルを commands で指定の場所にコピーして、そのコピー先のパスを sysvinit で指定してもキックしてくれません。
デプロイしてもサービスが再起動されない、などという場合は大体これが原因でした。

ドキュメントは原文を読む

Cognitoの構成管理を書いているときにハマりましたが、ドキュメントは翻訳が間に合っていなかったりすることも多々あるので、原文を参照するのがベターです。

まとめ

などなど、ハマってしまうポイントもいくつかありますが、大体はドキュメントに書いてあります。やっぱり、ドキュメントは正義でした。