AWS:CloudFormation~Output値の考え方と書き方
みなさん、こんばんは。ちゃみみです。
さて、本日はcloudformationにおけるベストプラクティスとしてAWSでも推奨されているクロススタックにおけるスタックの連携時について間違いなく利用するであろう、Output値についてハマるポイントを記載していこうと思います。
私も最初はそうでしたし、書き始めて間もない方もこのパターンによく陥るのですが以下のパターンって見たことある、書いたことあると思うんですよ。
何がポイントか!って話なんですが、このResourceセクションで記載したLogicalNameをOutputsでExportするときに参照する関数やLogicalNameの書き方によってクロススタックがうまくキマらないなんていうことは割とよくあって、今日はそのあたりについて書いていこうと思います。
例を挙げるとすると、例えばS3だったりするわけですがS3ってOutputsでLogicalNameを↑のように!Refで引っ張っても残念なことにバケット名しかExportしてくれなかったりするんですね。
つまり、何かしらクロススタックとしてこのExportしたS3のARN情報を利用したいときにこのExport値をそのまま使っても参照できずにエラーが出てしまいスタックが構成できないという点が問題になります。
解として難しくはないのですが、AWSのS3のcloudformationコードの結構下のところにこういった記述があるのを見かけたことがあると思います。
S3に限らずですが、戻り値について云々~~というセクションを。今回はちょっとキャプチャしてきたのですがこんな内容が記載されていました。
でこれって何を書いてる?って話なんですが、Outputsの書き方について記載しているんです。
厄介なことにどれもそうなのですが、AWSでクロススタックを推奨している割にはこのOutput値まではサンプルベースの記載もなく本当に舐めてるなと毎度思っています。ゲフンゲフン今回は、たまたまやり玉にS3を挙げてみましたが一例としてS3バケットのArnが欲しい場合の書き方ですが、イメージとしてこんな感じです。
OutputsセクションのValue値の書き方を見てほしいのですが、!GetAtt <LogicalName>.Arnという書き方で引っ張っているのがわかるでしょうか?
この書き方でExport値を参照してもらえれば無事にArnを引っ張れるという話です。
もう一例でいえば、CloudfrontでS3をオリジンとして構成する場合に通常の!Refでは引っ張れないのでRegionalDomainNameでExportしたりするわけですがこんな感じです。
とまぁ、こんな感じで参照方法を!Ref→!GetAttに切り替えること、論理名のあとに「.Arn」や「.RegionalDomainName」なんていう形で語尾をつけてあげる形でExport値が劇的に変わったりするわけで何をExportするのか、このExport値は何のサービスのどういった設定に使われるのか?という点を常に考えながら、テンプレートを構成していくとなんとなくOutputsの構成が見えてくるかな?と思っています。
なかなか慣れない点も多いかと思いますし、このOutputsの書き方やサンプルって非常に少ない、というか結構見つからないのでこの記事を含めて参考にしてもらえればと思います!
2021年10月12日