目次
はじめに
こんにちは、omkです。
ディーネット技術ブログでの空前の小ネタブームに困惑しながらも(本当に小ネタか??)さらなる小ネタを提供します。
さて、CloudFormationで条件を使用する際のあれこれを調べてみましたので備忘も兼ねてここに記載します。
なお、本記事はCFnのテンプレート構成に関してベストプラクティスを提供するものではありませんのでご留意ください。
やってみた
Conditionに基づいてOutputsで出力するしないを分けたい
そもそもOutputsセクションでConditionが使えるかのところからですが、普通に使えました。
公式の例にも載ってます。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html#outputs-section-structure-examples
本番環境と開発環境でサーバ構成が違うケースでConditionsを利用していて、その際にコンディションに合わせて出力するかどうかを指定したかったので確認しました。こんな感じで使えました。
Outputs:
WEBInstanceID:
Value: !Ref WEB
MAILInstanceID:
Condition: ProductOnly
Value: !Ref MAIL
ネストしたスタックのExportを同じルートから派生する別のスタックのパラメータにImportしたい
共通のルートスタックから派生するスタックAとスタックBのうち、スタックAで作成したリソースをExportし、ルートスタック上でスタックBのパラメータにImportValueしようとしましたがこれは不可能でした。
要は下のような感じです。
↓root.yml
---------
resources:
StackA:
Type: AWS::CloudFormation::Stack
TemplateURL: !Sub ${TemplatesBacketURI}/stacka.yml
StackB:
Type: AWS::CloudFormation::Stack
TemplateURL: !Sub ${TemplatesBacketURI}/stackb.yml
Parameters:
Param1: !ImportValue StackA-Export
---------
↓StackA.yml
---------
#(ry)
Outputs:
StackA-Export:
Value: !Ref Resource
Export:
Name: "StackA-Export"
---------
まぁGetAttを使えばよい話なのですが、開発環境で本番環境のリソースを使いまわしたかったのでこんなことをしていました。
これはValueの評価のタイミングがルートスタック作成時なので、StackAで出力する前に評価されてしまうためエラーとなります。DependsOnを指定した際においても同様です。
よってStackBにDependsOnを設定しても無駄でした。
この条件においては本番はGetAtt、開発でImportValueで値を入れるというやり方が可能です。
Param1: !If [ ProductOnly, !GetAtt StackA.Outputs.StackA-Export, !ImportValue StackA-Export]
各環境で共有するリソースは共通スタックのような、環境ごとのスタックの外に置いておくやり方が一番綺麗じゃないかと思います。
パラメータにAWS::NoValueは入るのか
入りませんでした。「○○ must have values」のエラーが出ます。
環境によっては作らないリソース用のパラメーターで、対象リソースを作らない環境の場合に「AWS::NoValue」を指定したかったのですが、そもそもパラメータは値が必須でいるとのことで(参照するリソースのコンディションにかかわらず)エラーになりました。
パラメーターのタイプがStringだったので代わりに「""」を指定したらいけました。
Conditionに基づいてリストに値を入れる入れないを分けたい
これも特定環境のみで作成するリソースをリストに含めるために検証しました。
特定環境のみでリソースを作成するのでそれ以外の環境で参照してしまうとエラーが発生します。
リストにおいて「AWS::NoValue」を指定することが可能なのか不明だったのですが、これについては弊社chiyodaさんの記事を参照ください。
出来ます。
CloudFormationで動的にセキュリティグループのインバウンドを追加する
おわりに
そんなこんなでCFnの条件について検証してみました。
あまり実用的でない方法も検証していますが、全体通してCFnの挙動のイメージがついたのでやってみてよかったなと思います。
最後までお付き合いありがとうございました。
アーキテクト課のomkです。
AWSについて雑多に取り組んだ内容を発信しています!!