AWS
CloudFormation

【随時更新】AWS CloudFormation & ECSの細かすぎるTIPS集


CloudFormation/ Templates


空のディレクティブがあると怒られる

Outputs: 

#何も記載しない


DescriptionにはExportされる値の例を書いておくと嬉しい

Outputs:

ECSCluster:
Description: A reference to ECS cluster name. ex) dev-Cluster
Value: !Ref TheECSCluster
Export:
Name: !Sub ${Env}-Cluster

リソースの戻り値の例はこちら


!Ref

!GetAtt


Export Nameの頭にも環境名をつけちゃう

同一リージョンに同じスタックを複数作成するときにExportの名前がかぶるからですね。

環境名じゃなくてスタック名とかでもOKです。

# 例1

Name: !Sub ${Env}-Cluster

# 例2 (こんな書き方もできる)
Name: !Join [ "-", [ "Ref":"AWS::StackName", "vpcid"]]


CloudFormation/ Templates


cfn-lintで一括lint

find ./cfn/templates -type f | xargs --no-run-if-empty cfn-lint


create/update-stack と deploy で微妙に挙動が違う


  • テンプレートファイルを指定するときのパスの書き方が違う

# create/update-stack

--template-file "file://cfn/banana.yaml" \

# deploy
--template-file "file://cfn/banana.yaml" \


  • deployではcli-input-jsonが利用できない
    パラメータを外出ししたいときに、オプションから指定することしかできないのでちょっと不便です。


リソースに変更がなくても強制的にupdateしたい場合は、毎回タグを更新する

aws cloudformation deploy \

......
--tags date="$(date '+%Y%m%d%H%M%S')"


CloudFomationで扱うとちょっと面倒臭いリソース一覧


  • DynamoDBは一度に10個以上作成・更新・削除できないので、一つのテンプレートにまとめて記述すると後から困ることがある

  • CloudFrontはリソース作成・削除に15分くらいかかる

  • API GatewayのVPC Linkは作成に10分くらいかかる


削除しづらいリソース一覧


  • ECSはサービスが動いているとクラスタを削除できない。

  • ECRのリポジトリはイメージが保存されていると削除できない

  • API Gatewayのステージはカスタムドメイン名にリンクされていると削除できない

  • API GatewayのVPC Linkはメソッドに紐ついていると削除できない

  • ELBはVPC Linkに紐ついていると削除できない。


タイミングが重要なリソース一覧

スタック削除を実行したのち、そのスタックのリソースを利用する手動作成したRDSを削除を実行すると、タイミングによってはスタックで管理されたDBSubnetGroupが削除されないことがある


ECS


サービスを削除する場合はまずELBから。