CloudFormationテンプレートをVisual Studio Codeで保存した時に自動検証する
テンプレートの検証
AWS-CLIのaws cloudformation validate-template
コマンドを使うと、テンプレート内容を検証できます。
ローカル上のテンプレートファイルを検証する場合は、--template-body
オプションを使い、
aws cloudformation validate-template --template-body ファイルパス
テンプレートのファイルパスを指定して実行します。
試しに、形式バージョンの日付を間違えたYAMLファイルで検証してみます。(正しくは"2010-09-09")
error.template.yaml
AWSTemplateFormatVersion: "2018-09-09" Resources: MyVPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16
実行するとエラーが表示されます。
$ aws cloudformation validate-template --template-body file://error.template.yaml An error occurred (ValidationError) when calling the ValidateTemplate operation: Template format error: 2018-09-09 is not a supported value forAWSTemplateFormatVersion.
Visual Studio Code
テンプレートを作成する時、皆さんはどんなエディタやIDEを使っていますか?
私は、見るだけならエディタで開くことが多いですが、書く場合は Visual Studio Code を利用することが多いです。
Visual Studio Codeには便利なプラグインがいくつも公開されており、テンプレート作成に役立つプラグインもあります。 今回はテンプレートファイルを保存した時に、自動で検証する方法をご紹介します。
Run on Save
Run on Saveプラグインを使用すると、ファイルを保存した時に特定のコマンドを実行できます。
プラグインをインストールしたら、Visual Studio Codeの設定(User Settings)でemeraldwalk.runonsave
構成を追加します。
"emeraldwalk.runonsave": { "commands": [ { "match": "\\.template.(json|yaml)$", "cmd": "aws cloudformation validate-template --template-body file://${file}" } ] }
補足
commands
で複数の条件を設定可能です。今回は1つだけ設定しています。match
でファイル名への正規表現を指定します。ファイル名が*.template.拡張子
、拡張子がjsonまたはyamlを含むものを対象とします。cmd
で実行するコマンドを設定します。${file}
で保存対象のファイルパスを取得できます。
Visual Studio Codeの出力ウィンドウを開き、リストボックスからRun On Save
を選択、テンプレートファイルを保存してみてください。
出力ウィンドウに結果が表示されます。
注意点として、コマンドが実行されるのは既存ファイルを保存した時です。新規にファイルを作成した時は実行されません。
まとめ
テンプレートを書きながら気軽に検証したい場合、IDEやエディタの機能をうまく活用すると便利です。 Visual Studio Codeはテンプレート用の入力補助プラグインがいくつかあるので、おススメのIDEです。
参考
- AWSドキュメント
- AWS CLIコマンドリファレンス
- Visual Studio Code
- Run on Save
CloudFormationクロススタック参照
クロススタック参照を使用すると、スタック間の連携が可能になります。
スタック間の連携、つまりテンプレートが複数必要になります。
- 参照される側のテンプレート
- Outputsセクションの
Export
プロパティで値をエクスポート
- Outputsセクションの
- 参照する側のテンプレート
- 組み込み関数
Fn::ImportValue
で値をインポート
- 組み込み関数
値をスタック間で受け渡しすることによって、IAMロールやVPC情報、セキュリティグループなどを共有することができます。
参照される側のテンプレート
web-sg.template.yaml
AWSTemplateFormatVersion: "2010-09-09" Parameters: MyVPC: Type: AWS::EC2::VPC::Id Resources: WebSG: Type: AWS::EC2::SecurityGroup Properties: GroupName: "web-sg" GroupDescription: "web security group" SecurityGroupIngress: - IpProtocol: "tcp" FromPort: "80" ToPort: "80" CidrIp: "0.0.0.0/0" SecurityGroupEgress: - IpProtocol: "-1" CidrIp: "0.0.0.0/0" VpcId: !Ref MyVPC Outputs: WebSG: Description: The ID of the web security group Value: !Ref WebSG Export: Name: "stack-web-sg"
Export
OutputsセクションのExportプロパティで値をエクスポートします。
Outputs:
<論理ID>:
Description: 出力の説明
Value: 出力値
Export:
Name: エクスポート名
注意点として、エクスポート名はリージョン内で一意にする必要があります。リージョン内のグローバル変数と言った方がわかりやすいかもしれません。
サンプルでは固定文字列ですが、組み込み関数Fn::Sub
を使って動的に設定することも出来ます。
!Sub "${AWS::StackName}-SGID"
参照する側のテンプレート
ec2.template.yaml
AWSTemplateFormatVersion: "2010-09-09" Parameters: KeyPair: Type: AWS::EC2::KeyPair::KeyName Description: "KeyPair Name" Resources: MyEC2: Type: AWS::EC2::Instance Properties: ImageId: ami-e99f4896 InstanceType: "t2.micro" SecurityGroupIds: [!ImportValue "stack-web-sg"] KeyName: !Ref KeyPair Outputs: MyEC2: Value: !Ref MyEC2
Fn::ImportValue
組み込み関数Fn::ImportValue
を使用してエクスポートした値を受け取ります。
!ImportValue エクスポート名
まとめ
テンプレートを論理単位に分割すると疎結合になり、共有や管理がしやすくなります。 また、ネットワーク構築者とアプリ構築者のように責務を分担出来ます。 使える所では積極的に使っていきたいですね。
参考
CloudFormationテンプレートの条件関数
組み込み関数の条件関数
を利用すると、リソースを柔軟に制御できます。
リソースを制御する大まかな流れは
- Parametersセクション
- パラメータを入力
- Conditionsセクション
- 入力値を評価して条件(論理値)を作成
- Resourcesセクション
- 条件によりリソースを作成
- 条件によりプロパティを定義
- 条件によりプロパティ値 A or B を設定
となります。
条件関数
条件関数は全部で5つあります。
よく使うのはFn::If
とFn::Equals
です。
条件関数 | 説明 | 例 | 備考 |
---|---|---|---|
Fn::If | 値の評価 | !If [条件, 真の値, 偽の値] | プロパティ定義に擬似パラメータAWS::NoValue を使用可能 |
Fn::Equals | 2つの値が等しいかどうかを比較 | !Equals [入力パラメータ, 値] | |
Fn::Not | 真偽を反転 | !Not [条件] | |
Fn::And | 全ての条件が真かどうか | !And [条件1, 条件2, ...] | 条件数は2〜10個 |
Fn::Or | いずれかの条件が真かどうか | !Or [条件1, 条件2, ...] | 条件数は2〜10個 |
Conditionsセクション
入力パラメータを評価する条件を定義します。
Fn::If
以外の条件関数は、Conditionsセクションでしか使用出来ません。
Conditions:
<論理ID>: 条件関数
...
Conditions: IsProduction: !Equals [!Ref Env, "production"] IsEC2Role: !Not [!Equals [!Ref EC2Role, ""]] IsPublic: !Equals [!Ref Scope, "public"] ProdAndPub: !And [!Equals [!Ref Env, "production"], !Equals [!Ref Scope, "public"]] ProdOrPub: !Or [!Equals [!Ref Env, "production"], !Equals [!Ref Scope, "public"]]
必ず条件関数を使います。下記はエラーになります。
Conditions: IsProduction: true
Template format error: Conditions can only be boolean operations on parameters and other conditions
Resourcesセクション
Conditionsセクションで作成した条件を使用してリソースを制御します。
リソース作成
リソースを作成するかどうかは、Conditionプロパティで制御します。条件が真
の場合はリソースを作成します。
Resources: MyEC2: Type: AWS::EC2::Instance Condition: 条件 Properties: ...
プロパティ定義
プロパティを利用するかどうかは、条件関数Fn::If
と疑似パラメータAWS::NoValue
を使用します。
下記の例は、条件が真
の場合にロール名を設定、偽
の場合はプロパティを無効(IamInstanceProfile行を削除と同等)にします。
Resources: MyEC2: Type: AWS::EC2::Instance Properties: IamInstanceProfile: !If [条件, !Ref ロール名, !Ref "AWS::NoValue"] ...
プロパティ値の設定
条件によって値を設定する場合、関数Fn::If
を使用します。
下記の例は、条件によりインスタンスタイプを変更します。
Resources: MyEC2: Type: AWS::EC2::Instance Properties: InstanceType: !If [条件, "t2.micro", "t2.nano"] ...
Outputsセクション
Conditionプロパティを使用すると出力項目を制御できます。
Fn::If
はOutputsセクションでも利用出来ます。
Outputs: IsProduction: Condition: 条件 Value: true IsEC2Role: Value: !If [条件, true, false]
サンプル
条件関数を利用したテンプレートのサンプルです。
AWSTemplateFormatVersion: "2010-09-09" Parameters: Env: Type: String Default: production AllowedValues: - development - production Description: enter the environment name. Scope: Type: String Default: public AllowedValues: - public - private EC2Role: Type: String Description: enter the ec2 role name. KeyPair: Type: AWS::EC2::KeyPair::KeyName Description: KeyPair Name Conditions: IsProduction: !Equals [!Ref Env, "production"] IsEC2Role: !Not [!Equals [!Ref EC2Role, ""]] IsPublic: !Equals [!Ref Scope, "public"] ProdAndPub: !And [!Equals [!Ref Env, "production"], !Equals [!Ref Scope, "public"]] ProdOrPub: !Or [!Equals [!Ref Env, "production"], !Equals [!Ref Scope, "public"]] Resources: # EC2作成 MyEC2: Type: AWS::EC2::Instance Condition: IsPublic Properties: ImageId: ami-e99f4896 InstanceType: !If [IsProduction, "t2.micro", "t2.nano"] IamInstanceProfile: !If [IsEC2Role, !Ref EC2Role, !Ref "AWS::NoValue"] BlockDeviceMappings: - DeviceName: '/dev/xvda' Ebs: VolumeType: 'gp2' VolumeSize: 10 KeyName: !Ref KeyPair Tags: - Key: Name Value: !Sub "${AWS::StackName}-${Env}-${Scope}" Outputs: IsProduction: Condition: IsProduction Value: true IsEC2Role: Condition: IsEC2Role Value: true IsPublic: Condition: IsPublic Value: true ProdAndPub: Value: !If [ProdAndPub, true, false] ProdOrPub: Value: !If [ProdOrPub, true, false]
参考
- AWSドキュメント
CloudFormationテンプレートの組み込み関数
組み込み関数を上手に利用すると、より動的なテンプレートを作成出来ます。
例えば、
- 実行するまでわからない値を取得する。
- 値を加工する。
- 値を条件分岐によりプロパティにセットする。
のようなことが出来ます。
組み込み関数
組み込み関数の一覧です。
組み込み関数 | 分類 | 説明 | 入力例 | 出力例 |
---|---|---|---|---|
Ref | 参照 | 値を参照 | MySubnet | subnet-eb4950c3 |
Fn::GetAtt | 参照 | リソースの属性値を参照 | MySubnet.AvailabilityZone | us-east-1a |
Fn::ImportValue | 参照 | 別スタックによってエクスポートされた出力の値を参照 | ||
Fn::FindInMap | 選択 | Mappingsセクションで定義された値を取得 | [RegionMap, !Ref AWS::Region, 64] | ami-7a11e213 |
Fn::GetAZs | 選択 | 特定リージョンのAZを取得 | us-east-1 | [us-east-1a, us-east-1b, us-east-1c, us-east-1d] |
Fn::Select | 選択 | リストから取得 | [3, [東京都, 神奈川県, 千葉県, 埼玉県] | 埼玉県 |
条件関数 | 条件分岐 | リソース作成や出力に条件を追加 | ||
Fn::Sub | 加工 | テンプレート文字列 | ${AWS::StackName}-${Environment} | test-development |
Fn::Base64 | 加工 | 文字列のBase64化 | test | dGVzdA== |
Fn::Join | 加工 | 文字列の連結 | ["-", [2018, 07, 24]] | 2018-07-24 |
Fn::Split | 加工, リスト化 | 文字列の分割 | ["-", 2018-07-24] | [2018, 07, 24] |
Fn::Cidr | リスト化 | Cidrアドレスブロック | [10.0.0.0/16, 4, 8] | [10.0.0.0/24, 10.0.1.0/24, 10.0.2.0/24, 10.0.3.0/24] |
条件関数
はこちらのエントリを参照してください。
Fn::ImportValue
はこちらのエントリを参照を参照してください。
サンプル1
VPCとサブネットを作成するサンプルです。
AWSTemplateFormatVersion: '2010-09-09' Parameters: Environment: Type: String Default: Production AllowedValues: - Development - Testing - Staging - Production Description: enter the environment name. Resources: MyVPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Tags: - Key: Name Value: !Sub ${AWS::StackName}-${Environment} MySubnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref MyVPC CidrBlock: 10.0.1.0/24 Tags: - Key: Name Value: !Sub ${AWS::StackName}-${Environment} Outputs: Output1: Value: !GetAtt MySubnet.AvailabilityZone Description: AvailabilityZone
Ref
!Ref logicalName
よく使う組み込み関数です。
指定したパラメーターまたはリソースの値を参照します。
Fn::Sub
!Sub String
パラメータが埋め込まれたテンプレート文字列から文字列を作成します。
パラメータは ${Environment} の形式で埋め込みます。
この組み込み関数もよく使われます。
DescriptionやTagのName値、Outputの出力、EC2のユーザーデータなど、動的な文字列を設定するプロパティで活躍します。
Fn::GetAtt
!GetAtt logicalNameOfResource.attributeName
リソースから属性の値を参照します。
取得出来る属性は 組み込み関数リファレンス-Fn::GetAtt の属性を参照してください。
サンプル2
VPCとサブネットを2つ作成するサンプルです。
AWSTemplateFormatVersion: '2010-09-09' Parameters: CidrBlock: Type: String Default: 10.0.0.0/16 Count: Type: String Default: 4 MaskSize: Type: String Default: 8 Resources: MyVPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref CidrBlock MySubnet1: Type: AWS::EC2::Subnet Properties: VpcId: !Ref MyVPC CidrBlock: !Select [0, !Cidr [!Ref CidrBlock, !Ref Count, !Ref MaskSize]] MySubnet2: Type: AWS::EC2::Subnet Properties: VpcId: !Ref MyVPC CidrBlock: !Select [1, !Cidr [!Ref CidrBlock, !Ref Count, !Ref MaskSize]] Outputs: Output1: Value: !Ref MySubnet1 Description: MySubnet1 Output2: Value: !Ref MySubnet2 Description: MySubnet2
Fn::Cidr
!Cidr [ ipBlock, count, sizeMask ]
Cidrアドレスブロックをリストで返します。リストの数は count
の数だけ作成されます。
例えば !Cidr [10.0.0.0/16, 4, 8] の場合、指定したCidrブロック 10.0.0.0/16
とマスクサイズ 8
から
- 10.0.0.0/24
- 10.0.0.1/24
- 10.0.0.2/24
- 10.0.0.3/24
のリストを返します。
主にサブネットのCidrブロックを設定する時に利用します。
Fn::Select
!Select [ index, listOfObjects ]
Cidr関数をリスト化すると
- !Select [0, 10.0.0.0/24, 10.0.0.1/24, 10.0.0.2/24, 10.0.0.3/24] -> 10.0.0.0/24
- !Select [1, 10.0.0.0/24, 10.0.0.1/24, 10.0.0.2/24, 10.0.0.3/24] -> 10.0.0.1/24
になり、それぞれ0番目と1番目の値が選択されます。
サンプル3
VPCを作成するサンプルです。
AWSTemplateFormatVersion: '2010-09-09' Resources: MyVPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Outputs: Output1: Value: !Join [", ", !GetAZs ap-northeast-1] Description: GetAZs, Join Output2: Value: !Select [1, !Split ["-", !Ref "AWS::Region"]]
Fn::GetAZs
!GetAZs region
指定したリージョンのAZリストを取得します。
リージョンを省略した場合は、疑似パラメータ AWS::Region
が指定されます。
Fn::Join
!Join [ delimiter, [ comma-delimited list of values ] ]
リストの値をデリミタ(区切り文字)で連結して1つの文字列にします。
Fn::Split
!Split [ delimiter, source string ]
Joinの逆です。
指定した文字列をデリミタ(区切り文字)で分割してリスト化します。
サンプル4
EC2インスタンスを作成します。
東京リージョンの場合、
CloudFormation-gettingstarted_5.3.3_1.0_8e08a38f-32bit-20110227-0559
が選択されます。
AWSTemplateFormatVersion: '2010-09-09' Parameters: MyName: Type: String MyValue: Type: String Mappings: RegionMap: us-east-1: "32": "ami-6411e20d" "64": "ami-7a11e213" us-west-1: "32": "ami-c9c7978c" "64": "ami-cfc7978a" eu-west-1: "32": "ami-37c2f643" "64": "ami-31c2f645" ap-southeast-1: "32": "ami-66f28c34" "64": "ami-60f28c32" ap-northeast-1: "32": "ami-9c03a89d" "64": "ami-a003a8a1" Resources: MyEC2: Type: AWS::EC2::Instance Properties: ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", "32"] InstanceType: m1.small UserData: Fn::Base64: !Sub | Ref: MyValue Ref: MyName Hello World Outputs: Output1: Value: !Ref MyEC2 Description: MyEC2
Fn::FindInMap
!FindInMap [ MapName, TopLevelKey, SecondLevelKey ]
Mappingsセクションで指定したマッピング情報から値を返します。最上位のキーと2番目のキーを省略することはできません。
Fn::Base64
!Base64 valueToEncode
文字列をBase64にエンコードします。
この関数は通常、EC2インスタンスのユーザーデータやメタデータに値を埋め込む時に利用します。
参考
- AWSドキュメント
CloudFormationテンプレートの擬似パラメータ
擬似パラメータは、CloudFormation側で事前定義されているパラメータです。
Parametersセクションで定義する必要はありません。
現在ログインしているAWSアカウントIDや選択しているリージョンなど、主に現在のコンテキスト情報を参照するために利用します。
擬似パラメータ
擬似パラメータは AWS::
から始まります。
擬似パラメータ | 説明 | よく使う組み込み関数 | 出力例 |
---|---|---|---|
AWS::AccountId | AWSアカウントID | Ref | 123456789012 |
AWS::NotificationARNs | スタックの通知 Amazon リソースネーム | Ref | arn:aws:sns:ap-northeast-1:871728391824:topic1 |
AWS::NoValue | 組み込み関数 Fn::If で使用すると対象プロパティを削除 |
Fn::If | |
AWS::Partition | パーティション | Fn::Sub | aws |
AWS::Region | リージョン | Fn::Sub | ap-northeast-1 |
AWS::StackId | スタックのID | Ref | arn:aws:cloudformation:ap-northeast-1:123456789012:stack/test/12345678-8b4e-9abc-def0-123456789abc |
AWS::StackName | スタック名 | Ref | test |
AWS::URLSuffix | ドメインのサフィックス | Fn::Sub | amazonaws.com |
AWS::NotificationARNs
[スタックの作成]-[オプション]のアドバンストで設定したトピック。
AWS::NoValue
少し特殊な疑似パラメータです。組み込み関数 Fn::If
内で使用します。
定義されている場合はプロパティに設定し、未定義ならプロパティに設定したくない場合に利用します。
DBSnapshotIdentifier: !If: - UseDBSnapshot - Ref: DBSnapshotName - Ref: AWS::NoValue
サンプル
パラメータでアベイラビリティゾーンを選択し、サブネット作成時に入力値を設定するサンプルです。
AWSTemplateFormatVersion: '2010-09-09' Resources: MyVPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Outputs: Output1: Value: !Sub "arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${MyVPC}" Description: VPC ARN Output2: Value: !Sub "https://dynamodb.${AWS::Region}.${AWS::URLSuffix}" Description: DynamoDB endpoint
出力 (Outputs)
- 組み込み関数
Fn::Sub
を利用すると、文字列内にパラメータを埋め込むことができます。 - パラメータは ${パラメータ名} で表現。
- Sub は
substitute
の略。置換。
参考
CloudFormationテンプレートのAWS固有のパラメータ型
Parametersセクションでは、AWS固有のパラメータ型を利用することができます。 入力値はアカウントユーザーに関連するリソース情報になります。
通常の型と比べて、
- 入力補助がある
- 入力値をチェックしてくれる
というメリットがあります。
手間が減り、入力間違いがないため、定義されているパラメータ型があれば積極的に使用しましょう。
AWS固有のパラメータ型
型は AWS::
から始まります。
パラメータ型 | 入力補助 | 複数対応 | 説明 | 入力例 |
---|---|---|---|---|
AWS::EC2::AvailabilityZone::Name | ○ | ○ | アベイラビリティーゾーン | ap-northeast-1a |
AWS::EC2::Image::Id | ○ | EC2 イメージID | ami-ff527ecf | |
AWS::EC2::Instance::Id | ○ | ○ | EC2 インスタンスID | i-011c45735cf4e9dbc |
AWS::EC2::KeyPair::KeyName | ○ | EC2 キーペア名 | ||
AWS::EC2::SecurityGroup::GroupName | ○ | ○ | セキュリティグループ名 | web-sg |
AWS::EC2::SecurityGroup::Id | ○ | ○ | セキュリティグループID | sg-a123fd85 |
AWS::EC2::Subnet::Id | ○ | ○ | サブネットID | subnet-123a351e |
AWS::EC2::Volume::Id | ○ | ○ | EBS ボリュームID | vol-3cdd3f56 |
AWS::EC2::VPC::Id | ○ | ○ | VPC ID | vpc-a123baa3 |
AWS::Route53::HostedZone::Id | ○ | ○ | Route 53 ホストゾーンID | Z23YXV4OVPL04A |
入力補助
ドロップダウンリストが表示されます。直接入力することも可能です。
AMI(AWS::EC2::Image::Id) は候補が多いため入力補助がありません。事前に調べて入力します。
複数対応
キーペア名(AWS::EC2::KeyPair::KeyName) 以外はリスト形式 List<パラメータ型>
で指定可能です。
Type: List<AWS::EC2::AvailabilityZone::Name>
選択するとテキストボックスに追加され、☓を押すと消去できます。
サンプル
パラメータでアベイラビリティゾーン(AZ)を選択し、サブネット作成時に選択したAZを参照設定するサンプルです。
AWSTemplateFormatVersion: '2010-09-09' Parameters: MyAZ: Type: AWS::EC2::AvailabilityZone::Name Description: AvailabilityZone Name Resources: MyVPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 MySubnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref MyVPC AvailabilityZone: !Ref MyAZ CidrBlock: 10.0.1.0/24 Outputs: Result: Value: !Ref MySubnet Description: AvailabilityZone Name
入力 (Parameters)
- ドロップダウンリストには、選択しているリージョンのAZ一覧が表示されます。
- パラメータを選択しないでスタックを作成すると、エラーになりロールバックされます。
出力 (Outputs)
- サブネットIDを出力しています。
- [VPC] - [サブネット] から、作成されたサブネットのAZを確認し、パラメータで選択した値と同じことを確認します。
参考
- AWSドキュメント
CloudFormationテンプレートのパラメータ
Parametersセクションを利用すると、スタック作成時に様々な値を渡すことができます。
パラメータ構文
Parameters: パラメータ名: Type: データ型 プロパティ: 値 ...
Typeプロパティは必須項目でデータ型を指定します。
データ型
データ型は、文字列や数値などのプリミティブな型とAWS固有のタイプがあります。
データ型 | 説明 | 入力例 |
---|---|---|
String | リテラル文字列 | "MyTest" |
Number | 整数または浮動小数点値 | 90 |
List<Number> | カンマで区切られた整数または浮動小数点値の配列 | "10,20,30" |
CommaDelimitedList | カンマで区切られたリテラル文字列の配列 | "aaa,bbb,ccc" |
AWS固有のタイプ | Amazon EC2キーペアの名前やVPCのIDなど |
AWS固有のタイプは、下記エントリを参照してください。
入力値の参照
組み込み関数 Ref を使用して、入力した値を参照できます。
RefはReference(参照)の略です。
下記テンプレートを実行すると、パラメータ名 VpcName
をVPCの名前タグに設定します。
AWSTemplateFormatVersion: '2010-09-09' Parameters: VpcName: Type: String Resources: MyVPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Tags: - Key: Name Value: !Ref VpcName
- Parametersセクションで文字列型のパラメータ
VpcName
を定義 - ResourcesセクションのVPC定義内で
VpcName
を参照して名前タグに設定
!RefはRefの短縮形です。
「短縮形?文字数増えてるやんけ」と思いましたが、エディタによってはハイライト機能が有効になるので、積極的に使っていきましょう。
デフォルト値
パラメータに値を指定しなかった場合にセットする値です。
プロパティ | 説明 |
---|---|
Default | 値を指定しなかった場合にセットする値 |
制約
制約関連のプロパティです。型によって使用出来る、出来ないがあります。 制約に違反する場合は、エラーになり実行出来ません。 パラメータを必須入力させる場合も制約を利用します。
プロパティ | String型 | Number型 | 説明 |
---|---|---|---|
AllowedValues | ○ | ○ | 許可する値をリストで指定 |
AllowedPattern | ○ | 値を正規表現でチェック | |
MinLength | ○ | 最小文字数 | |
MaxLength | ○ | 最大文字数 | |
MinValue | ○ | 最小値 | |
MaxValue | ○ | 最大値 |
表示系
表示に関するプロパティです。
残念ながら日本語には対応していません。日本語を入力すると???になります。
プロパティ | 説明 |
---|---|
Description | パラメータの説明 |
ConstraintDescription | 入力した値が制約にひっかかった場合の説明 |
NoEcho | 値をアスタリスク(*)で見えなくするかどうか true/false |
サンプル
入力した値を出力するだけのサンプルです。 リソースはVPCを作成しています。
AWSTemplateFormatVersion: '2010-09-09' Parameters: Input1: Type: String AllowedValues: ["apple", "banana", "melon", "grape"] Description: Select fruit Input2: Type: Number MinValue: 0 MaxValue: 100 Description: Input your weight (0-100) Input3: Type: List<Number> Default: "10,20,30" MinValue: 10 MaxValue: 100 Description: Input your numbers (10-100) Input4: Type: CommaDelimitedList Default: "var,www,html" Description: Input directory Input5: Type: String NoEcho: true MinLength: 4 MaxLength: 16 Description: Input your secret word (4-16chars) Resources: MyVPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Outputs: Output1: Description: Fruit Value: !Ref Input1 Output2: Description: Weight Value: !Ref Input2 Output3: Description: Numbers Value: !Join [" or ", !Ref Input3] Output4: Description: Directory Value: !Join ["/", !Ref Input4] Output5: Description: Secret word Value: !Ref Input5
入力 (Parameters)
- Input1
AllowedValues
を利用するとセレクトボックスが表示されます。- 未選択の場合は、[次へ]ボタン押下時にエラーになります。
- Input2
- Number型だと整数だけでなく浮動小数点も入力可能です。整数だけにしたい場合は
AllowedPattern
で数値のみに限定します。
- Number型だと整数だけでなく浮動小数点も入力可能です。整数だけにしたい場合は
- Input3, Input4
- カンマ区切りで指定します。カンマの前後にある半角スペースは除去されます。
- Input5
NoEcho
を有効にするとアスタリスク(*)表示で入力値が見えなくなります。
入力例
出力 (Outputs)
- Output3, Output4
- 組み込み関数 Fn::Join (短縮形は!Join) を使用して、リストの値を連結しています。
出力タブ
疑問点
誰か教えてください。
Description
にマルチバイトを入力出来ないの?対応予定もなし?- NumberとList<Number>に対して、StringとCommaDelimitedList。なんでList<String>じゃないの?
参考
- AWSドキュメント