AWS-CloudFormation

【小ネタ】CFnテンプレートの条件周りで気になるあれやこれやを検証してみた

はじめに

こんにちは、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の挙動のイメージがついたのでやってみてよかったなと思います。
最後までお付き合いありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA