顶级对象 - Top Level Objects

在本节中,你将学到有关CloudFormation顶级对象(top-level objects)的更多信息,包括Format Version, Description, Metadata, Parameters, Resources.

Format Version

AWSTemplateFormatVersion部分标识模板的版本。 最新的模板格式版本是 2010-09-09,并且当前是唯一有效的值。

AWSTemplateFormatVersion: '2010-09-09'

Description

Description部分使您可以包含有关模板的注释。

Description : CFN 101 Workshop - Lab 02 Resources.

Metadata

可以使用Metadata 包含任意JSON或YAML对象,Metadata可以为与CloudFormation模板进行交互的其他工具提供信息。 例如,当使用CloudFormation Designer时,相关数据存储在Metadata部分的AWS::CloudFormation::Designer部分中。 CloudFormation本身没有将Metadata部分用于任何目的,仅供第三方工具用于存储其他信息。

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: 'Amazon EC2 Configuration'
        Parameters:
          - InstanceType

    ParameterLabels:
      InstanceType:
        default: 'Type of EC2 Instance'

Parameters

Parameters使您可以在每次创建或更新堆栈时向模板输入自定义值。CloudFormation支持以下参数类型:

类型 描述 示例
String A literal string. “MyUserName”
Number An integer or float. “123”
List<Number> An array of integers or floats. “10,20,30”
CommaDelimitedList An array of literal strings. “test,dev,prod”
AWS-Specific Parameter Types AWS values such as Amazon VPC IDs. AWS::EC2::VPC::Id
SSM Parameter Types Parameters that correspond to existing parameters in Systems Manager Parameter Store. AWS::SSM::Parameter::ValueAWS::EC2::Image::Id
Parameters:
  InstanceType:
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t2.small
    Description: 'Enter t2.micro or t2.small. Default is t2.micro.'

Resources

Resources声明了要包含在堆栈中的AWS资源。 例如,将EC2资源添加到堆栈中:

Resources:
  WebServerInstance:
    Type: 'AWS::EC2::Instance'
    Properties:
      InstanceType: !Ref InstanceType
      ImageId: <replace with AMI ID ami-xxxxx>

实验

将以下代码保存为02-lab02-Resources-Solution.yaml

AWSTemplateFormatVersion: '2010-09-09'

Description: CFN 101 Workshop - Lab 02 Resources.

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: 'Amazon EC2 Configuration'
        Parameters:
          - InstanceType

    ParameterLabels:
      InstanceType:
        default: 'Type of EC2 Instance'

Parameters:
  InstanceType:
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t2.small
    Description: 'Enter t2.micro or t2.small. Default is t2.micro.'

Resources:
  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-00a1270ce1e007c27 # This ImageId will only work in the London region
      InstanceType: !Ref InstanceType

EC2资源类型的唯一必需属性是 ImageId。 可以通过AWS控制台找到AMI ID,并进行替换:

ami-gif

参考上一节创建Stack的过程,创建一个新的堆栈,并命名为cfn-workshop-ec2,选择对应的实例类型:

image-20210522211648509

默认选项不用做更改,点击 Next,直到创建堆栈完成。

附: SSM Parameter Store

AMI可能会随时间发生变化,如果我们不想将其硬编码到cloudformation文件中,可以使用AWS Systems Manager Parameter Store来取出最新的AMI ID(参考 AWS Compute Blog ):

aws ssm get-parameters \
  --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 \
  --query "Parameters[].Value" \
  --region eu-west-2 \
  --output text

ami-id-gif