LoginSignup
1
0

More than 1 year has passed since last update.

[CloudFormation]複数環境を用意して共有リソースをエクスポートする

Posted at

やりたいこと

CloudFormationのベストプラクティスのうち
・クロススタック参照を使用して共有リソースをエクスポート
・テンプレートを再利用して複数の環境にスタックを複製

どうやって実現するか

OutputsセクションとMappingセクション及びParameterセクションを使用

クロススタック参照の共有リソースをエクスポートする方法

・Outputsセクションと!Importvalue(Fn::Importvalue)を使います。
ざっくりとしたイメージです。
template.png

構文

Outputs:
  Logical ID:
    Description: Information about the value
    Value: Value to return
    Export:
      Name: Value to export
表記 解説
Logical ID 論理ID。識別しやすい名前を設定
Description どんな値を出力するかなどの説明。なくても問題ないです。
Value 出力する値。通常は、同一テンプレート内のResourcesセクションで用いたリソースの戻り値。RefやGettAtt関数で指定します。
Name 出力する名前。参照先テンプレートで使用する名前になります。パッと見で何を出力しているのか分かり易い名前がいいと思います。

参照元(TamplateA)のOutputsセクション

TamplateA.yml
AWSTemplateFormatVersion: 2010-09-09

Resoucers:
  myvpc:
   Type: AWS::EC2::VPC
   Properties:
      CidrBlock: 10.0.0.0/16

Outputs:
    VPCID:
    Description: VPCID
    Value: !Ref myvpc
    Export:
      Name: VPCID

Valueで指定する値は、Ref関数だけじゃなくて、GettAtt関数も指定できます。
例えば、
!GetAtt myvpc.CidrBlockと指定すれば、myvpcのCiderblockプロパティで指定した値が出力できます。今回の例で言うと、10.0.0.0/16です。
Ref関数やGettAtt関数で取り出せる値は、それぞれ違うのでどのような値が出力できるかは、リファレンスをご参照くださいませ。
vpcのリファレンスは、こちらです。

参照先(TemplateB)でのインポート

Fn::ImportValue:か短縮形の!ImportValueの後に続けてTemplateAで付けた名前を指定します。今回の例で言うと、VPCIDですね。

TemplateB.yml
AWSTemplateFormatVersion: 2010-09-09

Resources:
  # サブネットの作成
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone:
        Fn::Select:
          - 0
          - Fn::GetAZs: ""
      VpcId: !ImportValue VPCID
      CidrBlock: 10.0.0.1/24
      MapPublicIpOnLaunch: true

エクスポート⇆インポートする値がどんな値かをまずリファレンスで確認しましょう。今回、サブネットのPropertiesで指定するVpcIdは、公式リファレンスによるとThe ID of the VPC the subnet is in.と説明がありますので、vpc IDの指定が必要であることが分かります。ここでエクスポート⇆インポートする値が一致しないと、エラーを起こしてしまいます。

テンプレートを再利用して複数の環境にスタックを複製する方法

ここでは、同一テンプレートでテスト環境と開発環境を用意します。
コンソールからテンプレートをアップロードして、テスト環境か、開発環境を選択して各々のパラメーターが適用された状態でスタックが展開されます。
スクリーンショット 2022-04-16 14.29.27.png

Parametersセクションでテスト環境と開発環境の器を作成し、Mappingsセクションでそれぞれのパラメーターを設定します。値の取得は、FindInMapを使用します。

Mappingsの構文

Mappings: 
  MapName: 
    Key01: 
      Name: Value01

FindInMapでの値取得

Fn::FindInMap: [ MapName, TopLevelKey, SecondLevelKey ]

短縮形

!FindInMap [ MapName, TopLevelKey, SecondLevelKey ]
Mappingsセクション FindInMap 備考
MapName MapName 分かり易い名前の設定をします
Key01 TopLevelKey Parameterセクションで各環境を用意し、Ref関数で戻り値を利用します。ここでは、テスト環境、開発環境なので仮にtest devとします。
Name SecondLevelKey value01の値が返ってきます。いくつかのパラメーターを設定する必要がある場合は、これを追加していきます。

実際に、例を見た方が分かり易いと思います。

MappingTamplaete.yml
AWSTemplateFormatVersion: 2010-09-09

Parameters:
  Environment:
    Type: String
    Default: test
    AllowedValues:
      - test
      - dev

Mappings:
  VPCMap:
    test:
      VPCCidr: 10.0.0.0/16
    dev:
      VPCCidr: 10.16.0.0/16

Resources:
  MYVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !FindInMap [VPCMap, !Ref Environment, VPCCidr]
      EnableDnsHostnames: true
      EnableDnsSupport: true

ポイントは、ParameterセクションでFindInMapで取得しにいく環境名(Key01=TopLevelKey)を設定しておき、FindInMapの2番目の引数TopLevelKeyRef関数の戻り値とすることでKey01をいくつも作成することなく、各環境ごとのパラメーターを設定・呼び出しができると言うものです。
 今回は、Mappingセクションで設定したNameキーは一つだけでしたが、複数設定することができます。

この記事はAWS初学者を導く体系的な動画学習サービス
「CloudTech」の課題カリキュラムで作成しました。
https://kws-cloud-tech.com

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0