運用してて困った・知っておきたかったことをつらつら書きます
自分が運用してた範囲なので内容は散発的です
基本的にaws-cdkで運用してきてるのでyml/jsonに関する事情はあんまり触れないです
tl;dr
公式のユーザーガイド を隅々まで読もう
DeletionPolicyについて
問題になるケース
- リソースの削除をしたかったのにDeletionPolicyがデフォルトでRetainになってるケースがあり、リソースが残り続けてしまう
- うっかり論理名を変更しちゃってデプロイした結果、削除されてほしくないリソースに対して削除→作成が走ってしまう
知っておきたかった
- そもそもDeletionPolicyという概念が存在する
- DeletionPolicyがデフォルトで設定されているリソースがある
-
AWS::RDS::DBCluster
など - aws-cdkの場合、aws-cdkのデフォルト実装でRetainになってテンプレートが生成されるリソースがある(
AWS::S3::Bucket
などが該当)
-
Stackの削除保護について
問題になるケース
- 削除保護をしてないStackを誤って削除してしまう
- 恐怖
知っておきたかった
- 存在を知っておきたかった
- 知ってる諸氏は必ず設定しましょう
スタックのリソースの更新動作について
知っておきたかった
- リソース更新時の振る舞いとして以下の3つがあること
- 中断を伴わない更新(Update with No Interruption)
- 一時的な中断を伴う更新(Updates with Some Interruption)
- 置換 (Replacement)
- 状態を持たないリソースは Replacement の変更をしても問題になりにくい
- 例えばSecurityGroupなどは作り直しになっても問題がない
- DBClusterやS3::Bucketなどのような状態を持つリソースが Replacement を伴う変更が発生する場合は特別な対応が必要になる
リソース同士の依存関係について
知っておきたかった
- 基本的にちゃんとCloudFormationの記述をしていればdependsOn属性が必要になることはない
- 逆に上記ドキュメントにないケースで必要になった場合そもそも書き方が悪い可能性がある
- CloudFormation側がリソース間の依存関係を解決できるような記述方法に直せるなら直すべき
- (CloudFormationしぐさみたいなところはありそう)
CFn管理外リソースとの付き合い方
知っておきたかった
- CFn管理外リソースに依存する場合、Stackを分ける
- 例えばECSクラスタ、ECSタスク定義、タスク定義をキックするCloudWatchEventというリソースがあり、ECSタスク定義だけがCFn管理外だった場合、ClusterStack,EventStackの用に分離しておく
- そうすれば、CFnとコンテナのデプロイをそれぞれ独立して運用できる
ECSの例だとわかりやすいが、あまり変更がないタイプのリソース(AWSアカウントをまたいだAssumeRoleのようなもの)だと見落としがちなので注意
問題になるケース
- CFn管理外リソースに依存する・されるようなStack定義になっていると、0ベースでStack構築ができなくなる
- たとえばECSタスク定義がないとそのタスク定義に依存するCloudWatchEventは定義できないので、もしECSクラスタとCloudWatchEventを両方同じStackで定義しているとStack構築を0から出来ない
(番外)aws-cdkで定義した論理名について出力されたテンプレート上ではアンダースコアが消し飛ばされている
問題になるケース
- 論理名に依存した処理(例えば
aws ec2 describe-instances
コマンドで特定のインスタンスを取得したい、など)でaws-cdkの実装上で定義した名前が使えない
知っておきたかった
- 論理名はキャメルケースで定義するべし
- しれっと変換するくらいなら例外吐いて止まってほしい
Outputsの使い方・export/import/get_export
各種Stackの更新ステータスで取るべき対応
(時間切れでした)
(気が向いたら更新したい)
以上でした