俺のアウトプット

調べたこと、試したことを書きます

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を選択、テンプレートファイルを保存してみてください。 出力ウィンドウに結果が表示されます。

f:id:kitsugi:20180805115154p:plain

注意点として、コマンドが実行されるのは既存ファイルを保存した時です。新規にファイルを作成した時は実行されません。

まとめ

テンプレートを書きながら気軽に検証したい場合、IDEやエディタの機能をうまく活用すると便利です。 Visual Studio Codeはテンプレート用の入力補助プラグインがいくつかあるので、おススメのIDEです。

参考

CloudFormationクロススタック参照

クロススタック参照を使用すると、スタック間の連携が可能になります。

スタック間の連携、つまりテンプレートが複数必要になります。

  • 参照される側のテンプレート
    • OutputsセクションのExportプロパティで値をエクスポート
  • 参照する側のテンプレート
    • 組み込み関数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"

f:id:kitsugi:20180801075810p:plain

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テンプレートの条件関数

組み込み関数の条件関数を利用すると、リソースを柔軟に制御できます。

リソースを制御する大まかな流れは

  1. Parametersセクション
    • パラメータを入力
  2. Conditionsセクション
    • 入力値を評価して条件(論理値)を作成
  3. Resourcesセクション
    • 条件によりリソースを作成
    • 条件によりプロパティを定義
    • 条件によりプロパティ値 A or B を設定

となります。

条件関数

条件関数は全部で5つあります。
よく使うのはFn::IfFn::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]

f:id:kitsugi:20180731075537p:plain

参考

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の逆です。
指定した文字列をデリミタ(区切り文字)で分割してリスト化します。

f:id:kitsugi:20180724075254p:plain

サンプル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インスタンスのユーザーデータやメタデータに値を埋め込む時に利用します。

参考

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 の略。置換。

f:id:kitsugi:20180720060559p:plain

参考

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) は候補が多いため入力補助がありません。事前に調べて入力します。

f:id:kitsugi:20180719065428p:plain

複数対応

キーペア名(AWS::EC2::KeyPair::KeyName) 以外はリスト形式 List<パラメータ型> で指定可能です。

Type: List<AWS::EC2::AvailabilityZone::Name>

選択するとテキストボックスに追加され、☓を押すと消去できます。

f:id:kitsugi:20180719065447p:plain

サンプル

パラメータでアベイラビリティゾーン(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を確認し、パラメータで選択した値と同じことを確認します。

参考

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 で数値のみに限定します。
  • Input3, Input4
    • カンマ区切りで指定します。カンマの前後にある半角スペースは除去されます。
  • Input5
    • NoEcho を有効にするとアスタリスク(*)表示で入力値が見えなくなります。

入力例

f:id:kitsugi:20180718074839p:plain

出力 (Outputs)

  • Output3, Output4
    • 組み込み関数 Fn::Join (短縮形は!Join) を使用して、リストの値を連結しています。

出力タブ

f:id:kitsugi:20180718074850p:plain

疑問点

誰か教えてください。

  • Description にマルチバイトを入力出来ないの?対応予定もなし?
  • NumberとList<Number>に対して、StringとCommaDelimitedList。なんでList<String>じゃないの?

参考