Slide 1

Slide 1 text

2025/01/17 クラスメソッドのAWS CDK事情⼤公開スペシャル#2 クラスメソッド株式会社 リテールアプリ共創部 Takagaki Ryuhei CDKコマンド誤⽤による環境リソースの 損失を防ぐ⽅法

Slide 2

Slide 2 text

⾃⼰紹介 2 ● 2019年 4⽉ ⼤阪⼤学⼊学 ○ 外国語学部中国語専攻 ● 2022~2024年3⽉ アパレル系⾃社開発企業(イン ターン) ○ toC向けLIFFアプリ ○ 社内アプリ開発 ● 2024年4⽉ クラスメソッド株式会社⼊社 ○ LINEミニアプリ運⽤保守‧追加開発 ● 実績 ● 部署 ○ クラスメソッド株式会社 ○ リテールアプリ共創部 ○ 24新卒 ● 名前(ニックネーム) ○ Takagaki Ryuhei ○ X:るおん(@ruonp24) ● 担当業務 ○ LINEミニアプリ ○ フロントエンド(React/Next.js) ○ バックエンド(Node.js/Lambda) ○ サーバレス構築(AWS CDK)

Slide 3

Slide 3 text

AWS CDKとは 3 ● インフラストラクチャをプログラミング⾔語で定義できるIaCツール ● TypeScript, Python, Java, C#などの⼀般的なプログラミング⾔語でAWSリ ソースを定義可能 ● 最終的にCloudFormationテンプレートに変換される 【主なメリット】 ✅ TypeScriptやPythonなどの親しいプログラミング⾔語でインフラ定義可能。 ループ処理や条件分岐などプログラミング⾔語特有の書き⽅ができる。 ✅ 環境構築の⾃動化と標準化。 ✅再利⽤性が⾼く素早い作成と破棄。 【主なコマンド】 デプロイ:cdk deploy リソース削除:cdk destroy

Slide 4

Slide 4 text

実運⽤中のプロジェクトでdestroyコマンドを打つとどうなるか? 4 ● 当たり前ですが環境のリソースは全て失われ、動いている アプリケーションは動作しなくなります。 ● 流⽯にこれをやってしまうエンジニアはいないはずです。 しかし、世の中にはこのDestroyコマンドを何も考えずに実⾏ してしまう⼈がいるんですよね...

Slide 5

Slide 5 text

cdk destroy実⾏ 5 何を隠そう、私です。 * 影響範囲は開発環境のみで、ステージン グ環境と本番環境にはユーザー影響なし。

Slide 6

Slide 6 text

影響 6 ● 復旧期間:2⽇ ● その間追加開発ができな かった。 ● システム調査などもするこ とができなかった。 ● ⼀部S3やDynamoDBのデー タが失われた

Slide 7

Slide 7 text

● cdk deployで復旧を試みる → 予想外の事態発⽣... ● cdk deploy しても以下の理由で失敗 ○ Retain属性を有効にしていたリソースが、destroy時に残って しまっており、同じ名前のS3バケットやDynamoDBテーブ ル、CloudWatchロググループをデプロイしようとして競合 発⽣。 ○ Parameter storeに保存していたリソースのarnなどが変更さ れて依存関係が崩壊 AWS CDKならすぐ復元できるのでは? 7

Slide 8

Slide 8 text

1. Retain属性を持つリソースの⼿動削除 ● 対象: DynamoDBテーブル、S3バケットやCloudWatchロググ ループ 2. SSMパラメータ更新 ● Parameter Storeに保存し、参照していたリソースのarnなどを 設定し直す 3. 設定ファイルの更新 ● アプリケーションの環境変数を設定するconfigファイル修正 ● CognitoユーザープールIDや AppSyncのapiUrlなども変更 復旧作業 8

Slide 9

Slide 9 text

● 追加開発においてDynamoDBの新しいテーブルを作成 ○ 実装段階でパーティションキーを変更したくなった ○ 既存のテーブルのパーティションキーは変更できないため、⼀度 テーブルを削除する必要があった。 ○ cdk destory -all ● 原因分析: ○ CDKコマンドの影響範囲の理解不⾜。 ○ 開発環境をチームで共有しているという認識が薄かった。 そもそも何故destroyコマンドを打とうと思ったのか 9 → チームで再発防⽌策を模索

Slide 10

Slide 10 text

CloudFormationの削除保護を設定しましょう CloudFormation削除保護とは 公式ドキュメントによると > スタックの削除保護を有効にして、スタックが誤って削除されるのを防ぐことができます。削除保護を有効にした 状態でスタックを削除しようとすると、削除は失敗し、ステータスを含め、スタックが変更されることはありません。 終了保護は、スタック作成時に有効にすることができます。デフォルトでは、スタックの削除保護は無効です。ス タックの削除保護は、任意のステータスで設定できます ([DELETE_IN_PROGRESS] または [DELETE_COMPLETE] を除く)。 対策 10

Slide 11

Slide 11 text

たった⼀⾏で設定可能! スタックの引数に`terminationProtection: true`を追加す るだけ CDKで実装すると 11 今⽇からできる!

Slide 12

Slide 12 text

有効化されているかを確認 12 削除保護がアクティブになっていることを確認

Slide 13

Slide 13 text

● リソース削除を防いでくれる! `Stack [TestStack] cannot be deleted while TerminationProtection is enabled` この状態でdestroyコマンドを打つと 13

Slide 14

Slide 14 text

CloudFormation削除保護を有効化しておきましょう! 14 ● 有効にするタイミング ○ 初期開発時はdestroyをすることがあるかも知れません が、運⽤保守段階に⼊ったアプリケーションは全て削除 保護を有効にしておくのが良さそう。 ● 有効にする環境 ○ 運⽤時のヒヤリハットを防ぐため開発環境のみでなくス テージング環境‧本番環境では有効にしておきましょ う。

Slide 15

Slide 15 text

まとめ 15 ● CDKは便利だけど、実務レベルのアプリケーションで destroyした環境は簡単には復旧できない ● CloudFormation削除保護を有効にしてヒヤリハットを 防ぎましょう。

Slide 16

Slide 16 text

● のんピ 「AWS CDKで管理しているスタックの削除保護を有効化してみた」, Developers.IO, 2022年3月12日, https://dev.classmethod.jp/articles/enable-delete-protection-for-stacks-managed- by-aws-cdk/ ● AWS Documentation 「CloudFormation スタックの削除を防⽌する」, AWS CloudFormation ユーザーガイド, https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide /using-cfn-protect-stacks.html 参考資料 16

Slide 17

Slide 17 text

No content