使用CloudFormation来创建EC2实例

Cloud Formation是什么?

可以通过命令启动。

    1. 在yml文件中编写配置(参考下面的instance.yml文件)

启动
aws cloudformation create-stack –template-body file://instance.yml –stack-name instance –parameters ParameterKey=InstanceType,ParameterValue=t2.micro

取消
aws cloudformation delete-stack –stack-name instance

YAML的使用方法。

只需要一个选项,将以下内容以中文本地化:

仅仅启动EC2的yaml文件。

---
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Template for Kafka Broker'
Parameters:
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
    Default: test-key
  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t2.micro
    AllowedValues:
    - t1.micro
    - t2.nano
    - t2.micro
    - t2.small
    - t2.medium
    - t2.large
    ConstraintDescription: must be a valid EC2 instance type.

Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType:
        Ref: InstanceType

Outputs:
  InstanceId:
    Description: InstanceId of the newly created EC2 instance
    Value:
      Ref: EC2Instance
  AZ:
    Description: Availability Zone of the newly created EC2 instance
    Value:
      Fn::GetAtt:
      - EC2Instance
      - AvailabilityZone
  PublicDNS:
    Description: Public DNSName of the newly created EC2 instance
    Value:
      Fn::GetAtt:
      - EC2Instance
      - PublicDnsName
  PublicIP:
    Description: Public IP address of the newly created EC2 instance
    Value:
      Fn::GetAtt:
      - EC2Instance
      - PublicIp

最重要的是资源。

    1. 实例类型

 

创造一个能够以参数为输入的功能。(如果参数已经确定,也可以直接写入而不使用参数。)

在现有的子网中创建一个EC2实例。

将subnet_id写成SubnetId

Resources:
  EC2Instance:
    ...
    SubnetId: subnet-0000000000000

当未分配公共IP地址时

解决方法:将子网的自动分配IP设置启用。

请参考以下链接获取更多信息:https://dev.classmethod.jp/cloud/aws/auto-assign-public-ip-by-cfn/

调整音量

在Instance的BlockDeviceMappings中,写入DeviceName和Ebs的设置。根据以下配置,将附加一个gp2卷,容量为10GB。

Resources:
  ...
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ...
      BlockDeviceMappings:
      -
        DeviceName: /dev/sdf
        Ebs:
          VolumeSize: 10
          VolumeType: gp2
      ...

将弹性 IP 分配给 EC2。

如果创建弹性IP的话

只需使用AWS::EC2::EIP创建并使用AWS::EC2::EIPAssociation进行附加即可。

...
Resources:
  ElasticIP:
    Type: "AWS::EC2::EIP"
    Properties:
      Domain: vpc

  EC2Instance:
    ...

  IPAssoc:
    Type: AWS::EC2::EIPAssociation
    Properties:
      InstanceId: !Ref EC2Instance
      EIP: !Ref ElasticIP
...

如果要添加现有的弹性IP


...
Resources:
  EC2Instance:
    ...

  IPAssoc:
    Type: AWS::EC2::EIPAssociation
    Properties:
      InstanceId: !Ref EC2Instance
      EIP: <existing Elastic IP Address>

闲谈:我也想给弹性IP添加名称标签,但却无法实现。

CloudFormation的基本命令

我想看一下创建的Stack中的内容。

aws cloudformation describe-stacks --stack-name instance

获取通过CloudFormation创建的InstanceId

aws ec2 describe-instances \
--query "Reservations[*].Instances[*].InstanceId[]" \
--filters "Name=tag-key,Values=aws:cloudformation:stack-name" "Name=tag-value,Values=<stack_name>" \
--output=text
广告
将在 10 秒后关闭
bannerAds