AWS CDK運用設計:コスト追跡・監視・エラー検知
AWS CDK導入後のIaC運用課題と管理の全体像
これまで何回かAWS CDK(以下、CDK)を使ってクラウド上のインフラを構築してきた皆さん、「とりあえず動いた!」という瞬間のあの達成感、たまりませんよね。
私も最初は「コードを書くだけで環境が立ち上がるなんて魔法だ!」と興奮していました。しかし、いざ本番運用を始めると、思わぬ壁にぶつかるものです。「気づいたら料金が跳ね上がっていた」「誰かが画面から直接設定を変えていてデプロイが失敗した」といった問題です。
CDKを導入して終わり、ではなく、そこからが本当のスタートです。今回は、CDKで構築したアプリケーションを長期間健全に保つための「運用設計」の全体像について、私の経験も交えながらお話ししたいと思います。
なぜAWS CDKアプリケーションのIaC運用設計が重要なのか
CDKのようなIaC(Infrastructure as Code:インフラをコードとして管理する手法)を導入する最大のメリットは、インフラの構築スピードが劇的に上がることです。これまでAWSのマネジメントコンソール(Web画面)をポチポチと手作業で行っていた環境構築が、数分、あるいは数秒で完了するようになります。
しかし、ここに大きな落とし穴があります。構築が速くなったからこそ、環境がどんどん肥大化してしまうということです。
たとえば、開発環境、ステージング環境、本番環境と同じような構成をどんどん複製していくうちに、「そもそもこのリソースはどこで使われているんだっけ?」「このサーバーはいつから動いているの?」といった管理不明のリソースが増えていきます。
継続的な管理設計がない状態で運用を続けると、以下のような問題が頻発するようになります。
- 予期せぬ高額請求:使っていないリソースに気づかず、放置してしまう。
- 障害発生時のパニック:ログや監視の設定がバラバラで、エラーの原因特定に何時間もかかる。
- デプロイの失敗:コードと実際の環境の状態が合わなくなり、エラーでデプロイできなくなる。
IaCの本当の価値は、単に「構築が速いこと」ではなく、デプロイから監視、そして廃棄に至るまでのライフサイクル全体をコードで管理・追跡できることにあります。構築後の運用まで見据えて設計しておかないと、せっかくのCDKのメリットが失われてしまうのです。
IaC運用管理の負担を減らすためのマインドセット
では、どうすれば運用で疲弊しなくて済むのでしょうか。一番大切なのは、「アプリケーションとインフラは同じもの」として扱うマインドセットを持つことです。
これまでは、アプリケーションのコードはGitでバージョン管理し、テストして本番に反映するのが当たり前でした。一方で、インフラは「Web画面から手作業で設定して、動いたらヨシ!」と運用されているケースも多かったのではないでしょうか(私も昔はそうでした……)。
CDKを導入した今、インフラも立派な「コード」です。だからこそ、アプリケーションと同じプロセスをインフラにも持ち込む必要があります。
具体的には、次のようなアプローチを徹底します。
- マネジメントコンソールからの手動操作をやめる エラーが出たからといって、ブラウザを開いて設定を直接書き換えるのはNGです。一時的な対応は仕方ありませんが、最終的には必ずCDKのコードに修正を反映させ、コード経由でデプロイし直しましょう。
- Pull Request(変更依頼)でインフラをレビューする インフラの変更を行うときも、アプリケーションと同じようにPull Requestを作成します。「なぜこのリソースを増やすのか」「セキュリティ上の問題はないか」をチームでレビューすることで、事故を未然に防げます。
- テストを自動化する CDKには、「このコードから意図した通りのAWSリソースが生成されるか」を確認するためのテスト機能が用意されています。これをCI/CDパイプラインに組み込むことで、人間の目視レビューでは見落とすようなミスも機械的に防ぐことができます。
Tip
インフラのトラブルシューティングや設定変更を行う際、「まずはAWSのコンソール画面を開いて……」と癖になってしまいがちです。そんな時は、「この設定をコードで表現するとどう書けるか?」と立ち止まってみてください。この小さな意識が、属人化を防ぐ第一歩になります。
これから学ぶ、AWS CDKで守るIaC運用の全体像
アプリケーションとインフラを同じようにコードで管理する。このマインドセットが固まれば、あとは具体的な仕組み作りです。
この連載(全6セクション)では、私が実際のプロジェクトで実践している「CDKアプリケーションの管理・運用方法」を余すことなくお伝えしていきます。具体的には、以下のようなテーマを扱っていきます。
- デプロイメントの安定化と事前エラー検知 デプロイ時に発生するヒューマンエラーやリソースの競合を防ぐための自動テストとパイプラインの仕組み。
- コストの可視化と継続的な追跡 「AWSには標準のコスト見積もりコマンドがない」という課題を解決し、デプロイ前に料金を予測したり、タグを使って費用を可視化したりする方法。
- インフラの状態管理とドリフト(乖離)検知 コードと実際のインフラ状態が離れてしまう「ドリフト」を検知し、健全な状態を保つ仕組み。
- セキュリティとコンプライアンスの維持 誰がデプロイしても安全な状態を保つためのガードレール(ポリシー)の導入。
- 運用監視と障害発生時のアラート構築 エラーや負荷に即座に気づけるようにする、CloudWatchなどを活用した監視・アラートの自動化。
Important
今後のセクションで詳しく解説しますが、CDKを本番運用する上で最も重要かつ最初に抑えるべきポイントは「タグ付け(Tags)」のルール化です。リソースが「どのプロジェクトの、どの環境のものか」をコードレベルで強制するだけで、コスト管理やトラブルシューティングの難易度が劇的に下がります。
次回のセクションでは、いよいよ「デプロイメントの安定化と事前エラー検知」について深掘りしていきます。「せっかくコードを書いたのにデプロイでコケて時間を無駄にした」という悩みを解決するヒントをまとめますので、ぜひお楽しみに!
AWS CDKデプロイメントの安定化と事前エラー検知
CDKでインフラをコード化できたとしても、デプロイ時にエラーが多発していては本末転倒です。特に本番環境へのデプロイで失敗すると、ロールバックの待ち時間が発生し、最悪の場合はサービス停止につながります。
私も最初の頃は、デプロイエラーのたびに冷や汗をかいていました。しかし、適切な事前検知の仕組みを整えることで、デプロイ時の不安は劇的に減らせます。このセクションでは、デプロイメントを安定させるための2つの重要なアプローチを解説します。
AWS CloudFormationの早期バリデーションによるデプロイ失敗の防止
CDKのデプロイは、裏側でCloudFormationが動くことで実行されます。そのため、CloudFormationレベルでのエラー検知は、安定したデプロイメントを実現する上で非常に重要です。
2023年11月にCloudFormationに追加された早期バリデーション(Pre-deployment Validation)機能は、まさにゲームチェンジャーです。これまでは、変更セット(Change Set)を作成した後、実際にデプロイを実行してみないとわからなかったエラーを、変更セット作成段階で検知できるようになりました。
例えば、以下のようなケースが考えられます:
- リソースの競合:すでに存在するS3バケット名を指定してしまった場合
- 権限不足:IAMロールに必要な権限が付与されていない場合
- パラメータの不備:リソース間で参照関係が正しく設定されていない場合
従来のデプロイフローでは、これらのエラーは実際にスタックの更新を試みた後に発生し、その後ロールバックが実行されていました。ロールバックには数分から数十分かかることもあり、その間は「デプロイが失敗したかもしれない」という不安な時間を過ごすことになります。
早期バリデーション機能は、デフォルトで有効化されています。変更セットを作成する際、CloudFormationが自動的にテンプレートとターゲット環境に対してバリデーションチェックを実行してくれます。つまり、特別な設定をしなくても、次回のデプロイからはより早くエラーに気付けるようになっています。
Tip
CDKデプロイ時に --no-rollback オプションを併用することで、デプロイ失敗時のロールバックをスキップできます。開発環境では、このオプションと早期バリデーションを組み合わせることで、失敗時の状況をそのまま保持して原因調査を行いやすくなります。
AWS CDKパイプラインによる自動テストと安全なデプロイ
手動での cdk deploy は簡単ですが、本番環境では避けるべきです。ヒューマンエラーのリスクがあるだけでなく、変更内容が十分に検証されないまま本番環境に反映されてしまう可能性があるからです。
CDKパイプライン(CDK Pipelines)を利用すると、CI/CDのワークフローにインフラのテストとデプロイを統合できます。これにより、コードの変更から本番への反映までを自動化し、安全なデプロイメントフローを構築できます。
パイプラインに組み込むべきテストには、大きく分けて以下の2種類があります:
-
単体テスト(Unit Test) CDKコードが意図通りのCloudFormationテンプレートを生成しているかを検証します。例えば、「S3バケットの暗号化が有効になっているか」「セキュリティグループで特定のポートが開いていないか」といった確認を、デプロイ前に実行できます。Jestなどのテストフレームワークを使用して、CDKの合成されたテンプレート(Synthesized Template)に対してアサーションを書くのが一般的です。
-
機能テスト(Integration Test) 実際にAWS環境にリソースをデプロイし、期待通りに動作するかを確認します。例えば、「API Gatewayのエンドポイントにリクエストを送信して、正しいレスポンスが返ってくるか」を検証します。テスト完了後は、リソースを削除してクリーンアップします。
Pull Request(PR)の段階でこれらのテストを自動実行する仕組みを整えれば、本番環境へのマージ前に問題を発見できます。これにより、本番環境への悪影響を未然に防ぐことができます。
私のプロジェクトでは、PRを作成すると自動的に単体テストが実行され、mainブランチへのマージ後にはステージング環境へのデプロイと機能テストが走るようにしています。この仕組みを導入してから、本番環境でのインフラ関連のトラブルは激減しました。
Important
パイプラインを構築する際は、デプロイ用のIAMロールに必要最小限の権限のみを付与するようにしてください。権限が広すぎると、意図しないリソースの変更や削除が発生するリスクが高まります。Least Privilegeの原則を守ることが、安全な運用の基本です。
デプロイメントの安定化は、一度の設定で終わるものではありません。チームの開発フローに合わせて、テストのカバレッジを徐々に広げていくことが大切です。次のセクションでは、デプロイ後のコスト管理について解説します。
AWS CDKにおけるIaC運用のコスト可視化と継続的な追跡
こんにちは、BinaryBudです! ここまでデプロイの安定化やエラー検知について見てきましたが、インフラを運用する上で絶対に避けて通れないのが「お金(コスト)」の話ですよね。 「気づいたら想像以上の請求が来ていた…」という悲劇を防ぐためにも、CDKを使ったコストの可視化と継続的な追跡について、私の経験も交えながらお話ししようと思います。
AWS CDKデプロイ前のコスト見積もりを実現する4つのアプローチ
CDKで新しい機能を作っていてふと、「これをデプロイしたら毎月いくらかかるんだろう?」と不安になったことはありませんか?
実は、AWSには残念ながら cdk estimate のような標準コマンドが存在しません。長年コミュニティから要望が出されているのですが、まだ公式のツールとしては実装されていないんですよね。
だからといって、デプロイするまでコストがわからないわけではありません。私は以下の4つのアプローチを状況に合わせて使い分けています。
-
AWS Pricing Calculatorによる手動見積もり 最もシンプルな方法です。構築しようとしているリソース(例えばEC2インスタンスのスペックやRDSのデータ保存量など)をAWSの公式計算ツールに入力して試算します。アーキテクチャの設計段階でざっくりとした予算感を掴むのに便利です。
-
CloudFormationテンプレートを利用した推定 CDKは実際にAWSにデプロイされる際、CloudFormationと呼ばれるAWS標準のインフラ管理サービスのテンプレートに変換されます。
cdk synthコマンドで出力されたこのテンプレート情報を解析し、各リソースの金額を確認・計算するアプローチです。 -
CloudBurnなどのサードパーティ製ツールの活用 最近ではCDKのコスト見積もりに特化した便利な外部ツールが登場しています。例えば「CloudBurn」のようなサービスを利用すると、コードからより精度の高い見積もりを自動で出してくれます。手動での計算ミスを防ぐため、プロジェクトの初期段階から導入を検討する価値があります。
-
CI/CDパイプラインへの自動テストの組み込み 一番おすすめなのがこの方法です。Pull Request(コードの変更依頼)が出されたタイミングで、自動的にコスト増加を予測する仕組みをCI/CD(継続的インテグレーション/継続的デプロイ)パイプラインに組み込みます。これにより、「この変更をマージすると月額で〇〇円コストが増える」といったレビューが可能になり、本番導入前の予期せぬコスト増大を未然に防ぐことができます。
Note
コストを見積もる際、データ転送料やAPIの呼び出し回数など、実際の利用量に依存する部分は運用開始まで正確な予測が難しいことがあります。見積もりはあくまで目安として捉え、実運用後の監視とセットで運用することが大切ですよ。
AWS CDKコンストラクトを活用したコスト監視の自動化
デプロイ前の見積もりが終わったら、次は運用中の継続的な監視です。AWSの請求ダッシュボードを毎日手作業でチェックするのは、正直かなり大変ですよね。忘れてしまうこともあります。
そこで役立つのが、CDKのコンストラクト(インフラの構成要素をカプセル化した再利用可能な部品)を使った監視の自動化です。 例えば、Cost Monitoring Construct のようなオープンソースの外部ライブラリを利用すると、コスト監視の仕組み自体をCDKのコードとして数行で定義できます。
この仕組みをインフラ構築のコードと一緒に管理しておくことで、「1日の予算上限を○○円に設定したい」「特定のサービスで先月比200%のコスト増があったら通知したい」といったルールをコード化できます。予算超過や異常な課金が発生した瞬間にSlackやメールなどにアラートを飛ばすシステムを作っておけば、夜も安心して眠れるようになりますよ。
AWS CDKにおけるタグ付けのベストプラクティスによる精緻なコスト配分
プロジェクトが大きくなってきて、複数の環境(開発環境、ステージング環境、本番環境など)や複数のシステムが同じAWSアカウント内に混在し始めると、「そもそもどのリソースがいくらかかっているのか」が分からなくなってきます。
この問題を解決するのがタグ(Tags)です。AWSの各リソースに「環境名:本番」や「プロジェクト名:ECサイト」といったラベルを付けることで、後からコストをグループ別に集計できるようになります。
CDKでは、このタグ付けもコードで一括管理できます。特定のスタック(関連するリソースのまとまり)に含まれるすべてのリソースに対して、一貫したタグを自動で付与する設定が可能です。これにより、「リソースを作成するたびに手動でタグを追加する」という手間が省け、タグ付け忘れによるコスト追跡の抜け漏れを防ぐことができます。
タグをしっかり付けておけば、AWS Cost Explorer(AWSのコスト分析ツール)でリソースごとのコストを視覚的に追跡しやすくなります。私もタグ付けの自動化を導入してから、月次のコスト報告にかかる時間が劇的に短縮されました。プロジェクトの規模が拡大しても正確なコストトラッキングを維持するためにも、最初の段階でタグ付けのルールをコードに組み込んでおくことを強くおすすめします。
Important
タグはリソースの作成と同時に付与するのが一番確実です。後からまとめて付与しようとすると作業漏れが発生しやすく、コスト分析の精度が落ちてしまいます。CDKコードの初期設計段階で、必ずタグ付けのルールを決めておきましょう。
AWS CDKを用いたIaC運用における状態管理とドリフト検知の仕組み
CDKでインフラを構築した後、多くの人が直面するのが「コードと実態の乖離」という問題です。私は最初、この問題の重要性を軽く見ていました。しかし、ある夜間の緊急対応がきっかけで、ドリフト管理の必要性を痛感することになりました。
このセクションでは、CDKコードと実際のインフラ状態の整合性を保つための仕組みについて、私の経験も交えて解説します。
IaC運用におけるドリフト(設定の乖離)が引き起こすリスク
ドリフトとは、CDKコードで定義したインフラの状態と、AWS上に実際に存在するリソースの状態が一致しなくなる現象を指します。英語の「drift(漂流・逸脱)」という言葉が示す通り、本来あるべき姿から少しずつずれていくイメージです。
具体的にどんな場面でドリフトが発生するのか、いくつか例を挙げてみましょう。
ドリフトが発生しやすい状況の例:
- 夜間の障害対応で、AWSコンソールから手動でセキュリティグループのルールを変更した
- AWSサポートからの提案を受けて、コンソールからパラメータを調整した
- 他のチームメンバーが緊急でリソースの設定を直接変更した
- AWSの仕様変更により、デフォルト値が変わった
私が実際に経験したのは、深夜のアラート対応でのことです。API Gatewayのレート制限に引っかかり、緊急でスロットリング設定を変更する必要がありました。焦りの中でAWSコンソールから直接設定を変更し、対応を終えました。しかし、その変更をCDKコードに反映し忘れたのです。
1週間後、別の機能追加のデプロイを実行したところ、CDKコードに記載された以前の設定値で上書きされ、再び同じアラートが鳴る事態になりました。この時の教訓は大きかったです。
ドリフトを放置した場合のリスク:
- 次回デプロイ時に手動変更が上書きされ、障害が再発する
- コードを信頼できなくなり、「このコードは本当に今の状態を反映しているのか?」という不安が常につきまとう
- 新しいメンバーが参加した際、コードと実態のギャップで混乱する
- セキュリティ設定の変更が元に戻り、意図しない脆弱性が生まれる
ドリフトを放置すると、インフラをコードで管理するIaCの最大のメリットである「信頼性」が失われます。コードが真実の情報源でなくなった瞬間から、運用は複雑さを増していきます。
AWS CloudFormationを利用したドリフト検知と自動修復の仕組み
ドリフトのリスクを理解した上で、ではどのように検知し、対応すればよいのでしょうか。CDKは裏側でCloudFormationを利用しているため、CloudFormationのドリフト検出機能を活用することができます。
ドリフト検知の基本的な流れ:
CloudFormationのドリフト検出は、スタック内の各リソースの実際の設定を、テンプレートで定義された設定と比較します。具体的には以下のステップで動作します。
- CloudFormationがスタック内のリソース一覧を取得
- 各リソースの実際の設定をAWS API経由で取得
- テンプレートで定義された期待値と実際の設定を比較
- 差異があれば「DRIFTED」、一致していれば「IN_SYNC」とマーク
手動で実行する場合は、AWSコンソールからCloudFormationのスタックを選択し、「ドリフトの検出」をクリックするだけです。AWS CLIを使えば、以下のコマンドで実行できます。
# ドリフト検出の開始
aws cloudformation detect-stack-drift --stack-name my-cdk-stack
# 検出結果の確認
aws cloudformation describe-stack-resource-drifts --stack-name my-cdk-stack
ただし、毎回手動で実行するのは現実的ではありません。忘れてしまうことが明白だからです。そのため、定期的に自動実行する仕組みを構築することをおすすめします。
定期実行の仕組み例:
- EventBridgeルールを使って、毎日深夜にドリフト検出を実行
- 検出結果をSNSトピックに通知し、Slackやメールでアラートを受け取る
- AWS Configの設定と組み合わせて、継続的なコンプライアンスチェックを行う
この仕組み自体もCDKコードで定義できるため、「インフラ管理の仕組みもインフラとして管理する」というIaCの理念を貫くことができます。これにより、運用の属人化を防ぎ、システム全体の健全性を長期的に保つことが可能になります。
ドリフト検知後の対応フロー:
ドリフトが検知された後の対応は、状況に応じて2つのアプローチがあります。ここを間違えると余計なトラブルを引き起こすため、慎重に判断が必要です。
アプローチ1:実態をコードに合わせる(コード正解)
CDKコードが正しい状態を表しており、手動変更が一時的な対応だった場合に選択します。具体的には、該当リソースを一度削除してCloudFormationに再作成させる、あるいは手動で変更した設定を元に戻すことで対応します。
判断基準の例:
- 緊急対応時の一時的な変更だった
- コードレビューを経ていない変更だった
- セキュリティ上の理由から元の設定を維持すべき場合
アプローチ2:コードを実態に合わせる(実態正解)
手動での変更が意図的であったり、AWS側の推奨する設定変更であったりする場合に選択します。CDKコードを修正し、現在の実際の設定を反映させた上でデプロイし直します。
判断基準の例:
- 障害対応の結果、新しい設定値が適切だと判明した
- AWSからの推奨事項に基づく変更だった
- パフォーマンス改善のための調整を行った
ドリフト対応の判断に迷ったときは、「この変更を次回も維持すべきか?」を基準に考えると判断しやすくなります。一時的な対応なら実態をコードに合わせ、恒久的な改善ならコードを実態に合わせるという方針をチーム内で統一しておくことをおすすめします。
私が運用しているプロジェクトでは、週次でドリフト検知を実行し、結果をチームの定例ミーティングで確認するフローを敷いています。検知された場合は、なぜ乖離が起きたのか、どちらを正とするべきかをチームで議論し、対応方針を決定しています。
この習慣をつけることで、「コードは信頼できる」という安心感が生まれ、チーム全体の運用負荷が大きく下がったと実感しています。ドリフト管理は地味な作業ですが、長期的な運用安定性に直結する重要な取り組みです。
AWS CDKを用いたIaC運用におけるセキュリティとコンプライアンスの維持
CDKを使ってインフラの構築がコード化できるようになると、デプロイのスピードは劇的に上がります。ただ、便利になる反面で少し怖く感じることもありますよね。「誰かが誤ってセキュリティグループのポートを全開にしてデプロイしてしまったらどうしよう」とか、「暗号化されていないデータベースが本番環境に作られてしまったら」といった不安です。
私自身、初期の頃はコードレビューで「このポート開放はまずくない?」と指摘することが多く、ヒヤヒヤしたものです。このようなヒューマンエラーを防ぎ、安全な状態を維持し続けるためには、セキュリティとコンプライアンスを自動化・標準化する仕組みが不可欠です。
今回は、デプロイ時にルール違反を自動的にはじく仕組みと、そもそも安全な設定しかできないようにする仕組みについて解説します。
AWS CDKデプロイ時のガードレールとしてのCFN Guardの活用
どれだけ気をつけていても、人間がコードを書く以上ミスはゼロにはなりません。そこで活躍するのが、CloudFormation Guard(CFN Guard)というツールです。
CFN Guardは、AWSが提供するオープンソースのポリシー評価ツールです。難しく聞こえるかもしれませんが、要は「組織のセキュリティルールをファイルに書いておき、それに違反するインフラがデプロイされそうになったらブロックする」という門番のような役割をしてくれます。
例えば、「すべてのS3バケットは必ずパブリックアクセスを禁止しなければならない」というルールを組織のポリシーとして定義しておきます。誰かが意図せず(あるいはテスト目的で)パブリックアクセスを許可する設定をCDKコードに書いてデプロイしようとした場合、CFN Guardがそれを検知してデプロイをストップしてくれます。
具体的な仕組みとしては、CDKのコードを実際のAWSリソースに展開する前に、一度CloudFormationのテンプレート(設定ファイル)に変換する「cdk synth」というコマンドを実行します。生成されたテンプレートに対してCFN Guardでチェックを行い、ルールに違反していればエラーを出してデプロイを中止させるのです。これをCI/CDパイプライン(自動デプロイの仕組み)に組み込んでおけば、人的ミスが本番環境に到達するのを完全に防ぐことができます。
Tip
セキュリティルールは抽象的なものではなく、S3のパブリックアクセス禁止、特定のタグ(環境名やコストセンターなど)の付与必須など、明確なチェックリストとしてコード化しておくのがコツです。これにより、チームの認識のズレも防ぐことができます。
AWS CDKを用いたセキュリティ設定の標準化と監査
CFN Guardのような「事後チェックのガードレール」も重要ですが、それと同時に「そもそも間違った設定が書けないようにする」というアプローチも非常に強力です。そこで役立つのが、L3コンストラクト(独自の高レベルコンストラクト)の作成です。
CDKには「コンストラクト」という、AWSリソースを構成するためのブロックのような単位があります。L1はAWSのリソースをそのまま mapping したもので、L2は便利なデフォルト値が設定されたものです。さらに、私たちが複数のL2を組み合わせて「社内のルールに完全に準拠した独自のブロック」を作ることができ、これをL3コンストラクトと呼びます。
例えば、社内でRDS(データベース)を構築する際のルールが以下の通りだとします。
- ストレージの暗号化を必ず有効にする
- パスワードは自動生成し、Secrets Managerで管理する
- アクセスできるIPアドレスを社内ネットワークに限定する
これらを毎回コードに書くのは手間ですし、書き漏れが発生するリスクもあります。そこで、これらの要件をすべて満たす SecureDatabaseConstruct のようなL3コンストラクトをあらかじめ作成しておきます。そうすれば、チームの誰かがデータベースを作りたい時は、このL3コンストラクトを呼び出すだけで、自動的に安全なデータベースが作られるようになります。
Important
セキュリティ設定は「レビューで頑張る」のではなく、「デフォルトで安全な状態」にすることが不可欠です。L3コンストラクトを共有ライブラリとしてチーム全体で管理することで、誰がデプロイしても一定のコンプライアンスを満たすことができます。
このようにセキュリティをコードに組み込んで標準化しておくと、外部からの監査(セキュリティチェック)が入った時にも非常にスムーズに対応できます。「このプロジェクトはすべてこのL3コンストラクトを使っているので、暗号化設定に抜け漏れはありません」と、コードベースで明確に証明できるからです。
次回は、構築したインフラが正常に動いているかを監視し、障害が起きた際にどうやってアラートを受け取るかについて解説します。
AWS CDKを用いたIaC運用監視と障害発生時のアラート構築
こんにちは、BinaryBudです!これまでいくつかのセクションを経て、CDKを使ったインフラ構築やセキュリティの仕組み作りについて学んできました。ついにこの連載も最後のセクションです。
インフラをコードで美しく構築できても、それで終わりではありません。システムは生き物なので、予期せぬエラーを吐いたり、突然アクセスが集中して負荷が跳ね上がったりします。本番環境で安心して眠るためには、「異常をいち早く検知して通知する」「負荷に応じて自動で拡張する」という運用監視の仕組みが不可欠です。
今回は、CDKを使ってアプリケーションの監視設定からアラート、自動スケーリングまでをコードで管理する方法を見ていきましょう。
AWS CloudWatchやX-Rayと連携したAWS CDKアプリケーション監視の実装
AWS LambdaやAPI Gatewayを使ったサーバーレスアプリケーションは、サーバーの管理が不要な反面、「エラーが起きたときにどこでどう失敗したか分かりにくい」という悩みがつきものです。この課題を解決するのが、構造化ログと分散トレースです。
たとえば、従来の文字列だけのログ(例:Error: User not found)だと、後から特定のエラーを検索するのに苦労します。しかし、JSON形式の構造化ログ(例:{"level": "ERROR", "message": "User not found", "userId": "12345"})を出力するようにアプリケーションを設定しておけば、CloudWatch Logs上で特定のユーザーIDやエラーレベルだけを簡単にフィルタリングできるようになります。
さらに、API GatewayからLambda、そしてDynamoDBへと渡っていく一連のリクエストの流れを可視化するのがAWS X-Rayです。X-Rayを有効化しておくと、ボトルネックになっている箇所やエラーが発生した正確な場所がダッシュボード上で一目でわかるようになります。
CDKを使えば、こうした監視設定もコードで自動化できます。例えば、Lambda関数の定義時にX-Rayのトレースを有効にするのは、たった数行書くだけです。
const myLambda = new lambda.Function(this, 'MyFunction', {
// その他の設定...
tracing: lambda.Tracing.ACTIVE, // これだけでX-Rayトレースが有効になります!
});
Tip
CloudWatchアラートの通知先は、メールアドレスだけでなくSlackやMicrosoft Teamsなどのチャットツールと連携させるのがおすすめです。AWS ChatbotをCDKで設定しておけば、障害発生時にチーム全体がすぐ状況を共有できるようになります。
AWS CDKによるインフラリソースの異常検知と自動スケーリングの設定
アプリケーションのアクセス数が急増したとき、サーバーのCPU使用率が100%に張り付いてサイトが落ちてしまう…なんて事態は絶対に避けたいですよね。こうした負荷の変動に対応するためには、CloudWatchアラームと自動スケーリング(Auto Scaling)を組み合わせるのが定石です。
例えば、「EC2インスタンスのCPU使用率が5分間継続して80%を超えたら警告」といったルール(メトリクス)をCloudWatchアラームとして定義します。CDKを使えば、この閾値(80%や5分間など)をコード上で明確に定義でき、インフラの変更履歴として残すことができます。
そして、このアラームの状態変化をトリガーにして、自動的にサーバーの数を増やす(スケールアウト)、あるいは減らす(スケールイン)仕組みを構築します。
// オートスケーリンググループの設定例
const scaling = myAutoScalingGroup.scaleOnCpuUtilization('CpuScaling', {
targetUtilizationPercent: 50, // CPU使用率を50%付近に保つように調整
minCapacity: 2, // 最小インスタンス数
maxCapacity: 10, // 最大インスタンス数
});
上記のようなコードを書いておくことで、トラフィックが増えてCPU使用率が50%を超え始めると、自動的に新しいインスタンスが立ち上がり、負荷が分散されます。逆に深夜などアクセスが減った時は、不要なインスタンスが自動で削除されるため、コストの無駄遣いも防げます。
Important
アラームの閾値(何%を閾値とするかなど)は、最初から完璧な数値を設定するのは難しいものです。まずは少し緩めの数値でデプロイし、1〜2週間ほど実際のメトリクスを観察しながら、アラートが鳴りすぎず、かつ重要な異常を見逃さない数値へとチューニングしていくアプローチが実践的です。
AWS CDKとIaC運用のまとめ
さて、ここまで全6セクションにわたり、AWS CDKの導入からセキュリティ、そして今回の運用監視に至るまでを解説してきました。
これらを踏まえてCDK運用で最も重要なことは、インフラの変更を「手作業」ではなく「コードの変更」として扱い、レビューやテストを通じて安全に適用していくマインドセットと自動化の仕組みをチームに根付かせることです。本連載で紹介した自動テストによるエラー検知、タグ付けを用いたコスト管理、ドリフト検知による状態の可視化、L3コンストラクトやCFN Guardを利用したセキュリティの標準化、そしてCloudWatch等を使った監視の自動化は、すべてそのための強力な武器になります。
「インフラをコードで書く」という最初の一歩は少し勇気がいるかもしれません。しかし、監視設定やアラートの仕組みまでコードで管理できるようになると、手動でコンソールをポチポチと操作する必要がなくなり、圧倒的な安心感と作業効率の向上を実感できるはずです。コードが「真実の情報源」として信頼できる状態こそが、成熟したIaC運用のゴールです。
皆さんがAWS CDKを使って、安心・安全で運用しやすいアプリケーションを構築できるよう、私も一人のエンジニアとして応援しています!それでは、また別のトピックでお会いしましょう。