AWS-CloudFormation

CloudFormationのクロススタックの小ネタ

はじめに

こんにちは。自宅の冷房を解禁してしまったヤナイです。
今回は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についてはネタを色々調べてまた書きたいと思います。

返信を残す

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

CAPTCHA