ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

【CloudFormation】いろいろなパラメータタイプをJSONファイルでoverrideする

この記事を共有する

目次

はじめに

こんにちはサービスGの森です。
今回はAWS CloudFormation (以下、CFn)のParametersセクションについてです。

テンプレートの縮小化、再利用化のため、
「外部のJSONファイルでパラメータを定義し、デプロイ時にオーバーライドする」という方法があります。

...しかし、ふと気になったのは「この方法、どんなパラメータのタイプでも使えるんだっけ?」という事です。

やりたいこと

  • 5種類のパラメータタイプをCFnテンプレートで使用
パラメータタイプ 説明
String 文字列
CommaDelimitedList 文字列の配列
Number 整数または浮動小数点
List<Number> 整数または浮動小数点の配列
AWS::SSM::Parameter::Value パラメータストアに保存されたImage ID


  • CFnテンプレートをデプロイ時、パラメータをJSONファイルでoverride


先に結論

上記パラメータはすべてJSONファイルから参照可能!


やってみた

ネットワークリソースとEC2を作成するシンプルなCFnテンプレートをデプロイします。

project_directory
├── templates/
│   └── vpc-ec2.yaml    # CFnテンプレート
└── parameters/
    └── dev.json        # パラメータファイル


CFnテンプレートの内容

templates/vpc-ec2.yaml
※JSONファイルから参照させるため、パラメータのデフォルト値は設定していません。

AWSTemplateFormatVersion: 2010-09-09
Description: Parameters test.
#--------------------------------------------------#
# Parameters
#--------------------------------------------------#
Parameters:
  # システム名
  SystemName:
    Type: String
    Description: Name for Systems.
  # 環境名
  Env:
    Type: String
    Description: Name for Environment.
  # VPCのDNSサポート
  VpcDnsSupport:
    Type: String
    Description: Enable DNS Support for the VPC.
  # CIDRブロック
  CidrBlock:
    Type: CommaDelimitedList
    Description: List of Availability Zone.
  # SGインバウンドルール用ポート番号
  SgIngressPorts:
    Type: List
    Description: List of ports to allow for ingress traffic.
  # SGアウトバウンドルール用IPプロトコル
  SgEgressIpProtocol:
    Type: Number
    Description: Protocol to allow for all egress traffic.
  # AMI ID
  AmiId:
    Type: AWS::SSM::Parameter::Value
    Description: AMI ID for the EC2 instance.
#--------------------------------------------------#
# Resources
#--------------------------------------------------#
Resources:
  #VPC
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: !Ref VpcDnsSupport
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${Env}-vpc
  # サブネット
  Subnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: !Select [0, !Ref CidrBlock ]
      AvailabilityZone: !Select [0, !GetAZs ]
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${Env}-subnet-1a
  Subnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: !Select [1, !Ref CidrBlock ]
      AvailabilityZone: !Select [1, !GetAZs ]
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${Env}-subnet-1c
  # セキュリティグループ
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: "Security Group"
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: !Select [0, !Ref SgIngressPorts ]
          ToPort: !Select [0, !Ref SgIngressPorts ]
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: !Select [1, !Ref SgIngressPorts ]
          ToPort: !Select [1, !Ref SgIngressPorts ]
          CidrIp: 0.0.0.0/0
      SecurityGroupEgress:
        - IpProtocol: !Ref SgEgressIpProtocol
          CidrIp: 0.0.0.0/0
  # EC2インスタンス
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref AmiId
      InstanceType: t2.micro
      SubnetId: !Ref Subnet1
      SecurityGroupIds:
        - !Ref SecurityGroup
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${Env}-ec2
#--------------------------------------------------#
# Outputs
#--------------------------------------------------#
Outputs:
  EnableDnsSupportOutput:
    Description: DNS Support parameter value
    Value: !Ref VpcDnsSupport
  SystemNameOutput:
    Description: System name parameter value
    Value: !Ref SystemName
  EnvOutput:
    Description: Environment parameter value
    Value: !Ref Env
  CidrBlockOutput:
    Description: CIDR block parameter value
    Value: !Join [", ", !Ref CidrBlock]
  SgIngressPortsOutput:
    Description: Ingress ports parameter value
    Value: !Join [", ", !Ref SgIngressPorts]
  SgEgressIpProtocolOutput:
    Description: Egress IP protocol parameter value
    Value: !Ref SgEgressIpProtocol
  AmiIdOutput:
    Description: AMI ID parameter value
    Value: !Ref AmiId

パラメータファイルの内容

parameters/dev.json

[
   {
        "ParameterKey": "SystemName",
        "ParameterValue": "ParamTest"
   },
   {
        "ParameterKey": "Env",
        "ParameterValue": "dev"
   },
   {
        "ParameterKey": "VpcDnsSupport",
        "ParameterValue": "true"
   },
   {
        "ParameterKey": "CidrBlock",
        "ParameterValue": "10.0.0.0/24,10.0.1.0/24"
   },
   {
        "ParameterKey": "SgIngressPorts",
        "ParameterValue": "22,443"
   },
   {
        "ParameterKey": "SgEgressIpProtocol",
        "ParameterValue": "-1"
   },
   {
        "ParameterKey": "AmiId",
        "ParameterValue": "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64"
   }
]


デプロイ

parameter-overridesオプションでparameters/dev.jsonを指定してデプロイします。

aws cloudformation deploy \
  --template-file templates/vpc-ec2.yaml \
  --stack-name vpc-ec2-stack \
  --parameter-overrides file://parameters/dev.json


デプロイ結果の確認

デプロイに成功しました。

resource.png

パラメータの出力確認

JSONファイルのパラメータもすべて出力できました。

outputs.png


注意点1

aws cloudformation deployコマンドのドキュメントには3つのJSON構文が紹介されていますが、
パラメータごとにParameterKeyとParameterValueのオブジェクトで定義する構文をおすすめします。

json_syntax.png

理由としてはcreate-change-set, update-stack, update-stack といったコマンドでは
ParameterKeyとParameterValueのオブジェクトしかサポートしていないためです。

ただしdeployコマンドしか使わない場合は"Key=Value"のシンプルな組み合わせのリストでもよいと思います。

注意点2

JSONファイルではすべてのキーは文字列型にする必要があります。
Bool値や整数値であってもクォーテーションを忘れるとエラーになるので注意が必要です。

[
   {
        "ParameterKey": "VpcDnsSupport",
        "ParameterValue": "true"
   },
   {
        "ParameterKey": "SgEgressIpProtocol",
        "ParameterValue": "-1"
   },
]


おわりに

まとめると、
「テンプレートでは各データタイプで型を宣言し、JSONファイルからは文字列型の値を参照」 すればOKです。 この記事がどなたかのお役に立てれば幸いです。

この記事は私が書きました

森 翔吾

記事一覧

最近はコンテナ・サーバレスを学習しています。 よろしくお願いします。

森 翔吾

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。