CloudFormation設計の落とし穴:クロススタック参照をどう解決するか?
目次
背景
CloudFormation(以下、Cfn)を使用したインフラ設計を行う中で、特に運用フェーズに入った際に様々な課題が顕在化しました。アーキテクチャの設計段階では問題がなくても、運用設計で見落としが発覚するケースが多く、特にクロススタック参照に起因する運用上の難しさに直面しました。こうした経験を踏まえ、本記事ではこれらの課題とその対策について解説します。
はじめに
クロススタック参照とは?
CloudFormationで複数のスタックを利用する際、スタック間でリソース情報を共有する仕組みです。
一般的な課題と対策の必要性
クロススタック参照はスタック間の柔軟な設計を可能にしますが、適切に設計しないと運用や管理が難しくなります。本記事では、依存関係を最小限に抑えつつ、運用しやすい対策について考えます。
クロススタック参照のメリットとデメリット
まず、クロススタック参照のメリット・デメリットについてです。
メリット
- 複数スタックでのリソース再利用が可能
- 複数のテンプレート間で設計がシンプルになる
デメリット
- 依存関係の複雑化:スタック間のExport/Importが増えると管理が困難になる
- 更新時のリスク:一部のスタック更新が他スタックに影響を与える
- 柔軟性の低下:設計変更や新スタックの追加時に手間がかかる
複数スタック間のリソースの再利用できる点は便利ですが、スタック間の依存性が高くなります。
そのため、将来的なリソース更新が発生する運用フェーズで制約が生じ、Cfn運用が破綻させる可能性があります。
よくあるクロススタック参照の課題
Cfnクロススタック参照の課題は以下の通りです。
依存関係の管理が困難
Export/Importによるリソース共有が多くなると、依存関係が連鎖し更新が困難となります。
テンプレート間の変更の影響とエラー発生
Export名の変更やリソース削除により他のスタックにエラーを引き起こす原因となります。
またクロススタック参照先のリソース削除・変更ができなくなります。
(補足)依存関係を解消する複雑な手順で、リソース削除・変更はできますが、あまり現実的ではありません。
例:参照しているリソースを削除して依存関係を解消するなど
新しいスタックの組み込みが困難
クロススタック参照が多い環境では、新しいスタックを追加する際の設計が複雑化します。
クロススタック参照の対策方法
SSMパラメータストアの活用
スタック間の参照を維持させたい場合、SSMパラメータストアを利用した参照がよさそうです。
AWSのナレッジセンターでもスタック間のリソース共有方法が公開されています。
概要:
Systems Manager パラメータストアを使用し、リソース情報を動的に管理します。
利点:
- スタック間の依存関係を軽減し、更新が容易になる
- Export/Importを使わずに参照可能
設定例:
リソースのARNやIDをSSMパラメータに保存し、別スタックで!Subや!Refを用いて動的に取得します。
以下はリソースベースポリシーの定義でパラメータストアに格納したLambdaのARNを参照しています。
Parameters:
LambdaARN:
Type: AWS::SSM::Parameter::Value<String>
Default: /example/lambda/arn # SSMパラメータ名
~~~~~~~~~
Resources:
LambdaPermission:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !Ref LambdaARN # SSMパラメータ名の参照
Action: lambda:InvokeFunction
Principal: apigateway.amazonaws.com
一つのテンプレート(スタック)にリソースをまとめる
クロススタック参照をそもそも発生させないアプローチになります。
テンプレートの記述が膨大にならない限りはリソースを一つのスタックにまとめておきましょう。
概要:
複数のスタックに分割せず、可能な限り一つのテンプレート内でリソースを管理する方法です。
利点:
- スタック間の依存関係を完全に回避できる
- リソースの管理がシンプルになる
注意点:
テンプレートが大規模化する場合(コードが数千行になるなど)は管理が難しくなるため、小規模または関連性の強いリソースに限定しましょう。
クロススタック参照(Export/Import)は避けるべきか?
Export/Importはスタック間参照で発生する主なエラー原因になります。しかし、スタック間の設計がシンプルでリソース共有が少ない場合には有効な機能になるので、うまく使い分けていきましょう。
使用する際のベストプラクティス:
- Export名は明確かつ重複しないように管理
(例:プロジェクト名や環境名を含むユニークな値を含めるなど) - 依存関係が増えすぎないように注意
まとめと今後の展望
クロススタック参照は便利な一方、過度に依存すると運用や更新の障害となります。SSMパラメータストアや可能な限り一つのスタックへの集約などの代替手法を活用し、依存関係を最小限に抑えた設計を意識することが重要です。
適切な設計と運用を心掛け、CloudFormationを最大限に活用していきましょう。