目次
はじめに
こんにちは。自宅の冷房を解禁してしまったヤナイです。
今回はCloudFormationについてクロススタックでリソース間で
参照させるときに役立ちそうな小ネタを書いていこうと思います。
クロススタックの参照について
一般的によく使われているであろうスタック間のリソースの共有方法です。簡単な例としてVPCを作成したスタックの情報をSecurity Groupを作成する別のスタックで参照できるようにするのなら以下のような形で実現可能です。
1.VPCを作成するスタックでリソースをエクスポート
Resources:
#VPC
CreateVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
Tags:
- Key: Name
Value: !Sub testblog-vpc
(中略)
Outputs:
#EXPORT_VPC
CreateVPC:
Value: !Ref CreateVPC
Export:
Name: testblog-vpc
2.Security Groupを作成するスタックでエクスポートされた値を参照
Resources:
# WEB_SG
WEB:
Type: "AWS::EC2::SecurityGroup"
Properties:
VpcId: !ImportValue testblog-vpc
このような形でスタック間でリソース間の共有が可能となっています。
スタック作成時の問題点
非常に便利な機能であるクロススタックの参照なのですが、1つのアカウント内でスタックを作成するときにエクスポートする名前が同一であるとスタックの作成ができないという問題が発生します。
例えば、同一アカウント内でtestblog-vpc
をエクスポートする名前に設定した際、既に別のスタックから同じ名前でエクスポートされていた場合は以下のようなエラーが出ます。
Export with name testblog-vpc is already exported by stack yanai-testvpc-stack. Rollback requested by user.
別のアカウントでCloudFormationからスタックを作成する分には問題ないのですが、検証用のアカウントなどで上の例のようにエクスポートの名前を固定のものにしていると都度確認、修正を加えなければいけないので少し面倒です。
回避策
Parameters
セクションを使用して、エクスポートする名前を変えてあげることでエラーを回避することができます。上記のコードを少し改修して以下のようにします。
1'.VPCを作成するスタックでリソースをエクスポート
Parameters:
ProjectName:
Type: String
Default: "testblog"
Description: Project Name
(中略)
Resources:
#VPC
CreateVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
Tags:
- Key: Name
Value: !Join [ "-", [ "Ref":"ProjectName" , "vpc"] ]
(中略)
Outputs:
#EXPORT_VPC
CreateVPC:
Value: !Ref CreateVPC
Export:
Name: !Join [ "-", [ "Ref":"ProjectName" , "vpc"] ]
2'.Security Groupを作成するスタックでVPCのidの値を参照
Parameters:
ProjectName:
Type: String
Default: "testblog"
Description: Project Name
(中略)
Resources:
# TEST_SG
TESTSG:
Type: "AWS::EC2::SecurityGroup"
Properties:
VpcId: { "Fn::ImportValue": !Join [ "-", [ "Ref":"ProjectName" , "vpc"] ] }
上記にスタックごとにParameterを設けて入力する値を統一させると、スタックの作成時に入力するだけでよくなるのでコードの修正の手間は省けるかと思います。
一点注意としては、ImportValue関数の中で別の関数を使用する際に
ImportValue関数の省略はできないようです。
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html
最後に
ということで今回はCloudFormationについての小ネタでした。
CloudFormationについてはネタを色々調べてまた書きたいと思います。
ディーネット構築担当のエンジニアです。