- 公開日
- 最終更新日
【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
デプロイ結果の確認
デプロイに成功しました。

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

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

理由としては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です。
この記事がどなたかのお役に立てれば幸いです。
この記事は私が書きました
森 翔吾
記事一覧最近はコンテナ・サーバレスを学習しています。 よろしくお願いします。