Day12 AWS CloudFormation2
Day12 AWS CloudFormation2

Day12 AWS CloudFormation2

内容纲要

Day12 AWS CloudFormation2

1.回顾

在昨天我们学会了如何配置和使用Git,并用CloudFormation写了一个网络环境。

2.目标

  • [ ] 学会使用Outputs:属性
  • [ ] 学会如何用YAML模版写安全组
  • [ ] 学会如何用YAML模版写EC2实例

3.练习

3.0. 认识使用Outputs:属性

Outputs 是 CloudFormation 模板中用于输出模板创建的资源属性的部分。这些输出可以在管理控制台或使用 AWS CLI 或 SDK 检索。

Outputs 部分可以包含任何数量的输出,每个输出都必须有一个唯一的名称和一个值。值可以是模板中任何资源的属性,可以是一个字符串、数字、布尔值或任何其他类型的值。

看看下面这段代码

Outputs:

  tutuopvpc:
    Value: !Ref tutuvpc
    Export:
      Name: tutuopvpc

  tutuopigw:
    Value: !Ref tutuigw
    Export: 
      Name: tutuopigw

  tutuoppub1a:
    Value: !Ref tutupub1a
    Export: 
      Name: tutuoppub1a
  tutuoppub1c:
    Value: !Ref tutupub1c
    Export: 
      Name: tutuoppub1c
  tutuoppri1a:
    Value: !Ref tutupri1a
    Export: 
      Name: tutuoppri1a
  tutuoppri1c:
    Value: !Ref tutupri1c
    Export: 
      Name: tutuoppri1c

这段代码定义了一个名为 "tutuopvpc" 的输出,其值是 "tutuvpc" 资源的引用。

  • tutuvpc 是定义的 VPC 资源。

并且这个输出被导出,导出名称为 "tutuopvpc"。这意味着该输出可以在其他模板中使用 Fn::ImportValue 引用。

这样,在这个模板中创建的VPC资源的引用就可以在其他模板中使用了。

而且这样的导出可以方便的在其他模板中进行引用,这样就可以减少重复的配置,提高代码的可维护性。

3.1. 写一个安全组

新起一个文件写入

Resources:
  bassg:
    Type: 'AWS::EC2::SecurityGroup'             #输入ec2sg快捷键可以补全模版
    Properties:
      GroupDescription: "for bas"
      GroupName: "qlite-dev-xxx-sg-bas123"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
      SecurityGroupEgress:          #这里是出站规则,其实理论上只需要写一个- IpProtocol: -1就可以因为是允许所有协议的流量。下面的-1可以不写。
        - IpProtocol: -1
          FromPort: -1
          ToPort: -1
          CidrIp: 0.0.0.0/0
      Tags:
       - Key: Name
         Value: qlite-dev-xxx-sg-bas123
      VpcId: !ImportValue xxxopvpc

这个模板中:

  • MySecurityGroup 是定义的安全组资源。

  • GroupDescription 是定义的安全组描述。

  • VpcId 是定义的 VPC 资源。

  • SecurityGroupIngress 是定义的入站规则,其中包括了对22端口和80端口的访问,可以访问来源为任意IP。

  • FromPortToPort 是定义入站规则中端口范围的属性。

    FromPort 属性定义了端口范围的起始端口。

    ToPort 属性定义了端口范围的结束端口。

    在上面的示例中,我们为22端口和80端口分别设置了起始端口和结束端口相同的规则,这样就只能访问22号端口和80号端口了。

    如果您希望开放一个端口范围,例如从 80 到 90,您可以将 FromPort 设置为 80,将 ToPort 设置为 90。

    注意,端口范围的起始端口和结束端口都是以整数形式指定的。

  • SecurityGroupEgress, 它定义了出站规则。

    SecurityGroupEgress 中的第一条规则允许所有协议(-1),来源为任意 IP 地址(0.0.0.0/0)的流量进行出站。

    这样我们就完成了入站和出站的规则设置。需要注意的是,根据实际需要可能需要修改配置,例如只开放特定IP进行出站。

这样,我们就完成了创建安全组并开放 22 号端口和 80 端口的配置。

3.2.写一个EC2实例资源

 EC2bas:
    Type: 'AWS::EC2::Instance'
    Properties:
      AvailabilityZone: ap-northeast-1a
      ImageId: ami-0bba69335379e17f8
      InstanceType: t2.micro
      NetworkInterfaces:
      - AssociatePublicIpAddress: true
        DeviceIndex: 0
        GroupSet: 
        - Ref: bassg
        SubnetId: !ImportValue oppub1a     #引用已有的资源oppub1a这个子网
      KeyName: infra-xxx
      Tags:
       - Key: Name
         Value: qlite-dev-xxx123-ec2-bas

在创建EC2实例的这段代码中。

具体来说:

  • AvailabilityZone 指定了该实例所在的可用性区,在这里是 ap-northeast-1a
  • ImageId 指定了该实例使用的镜像 ID,在这里是 ami-0bba69335379e17f8
  • InstanceType 指定了该实例的类型,在这里是 t2.micro
  • NetworkInterfaces 指定了该实例的网络接口,包括公共 IP 地址的分配,安全组,子网等
  • KeyName 指定了该实例使用的密钥对
  • Tags 指定了该实例的标签

再看个例子

下面是一个使用 YAML 模板创建 EC2 实例资源的示例, 需要写入密钥,配置公网 IP, 地区为东京,并选择安全组:

Resources:
  MyEC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      AvailabilityZone: ap-northeast-1c
      ImageId: ami-0bba69335379e17f8
      InstanceType: t2.micro
      KeyName: infra-test
      NetworkInterfaces:
      - AssociatePublicIpAddress: true
        DeviceIndex: 0
        GroupSet:
          - !Ref MySecurityGroup
        SubnetId: !ImportValue MyPublicSubnet
      Tags:
       - Key: Name
         Value: MyEC2Instance

在这个示例中,

  • AvailabilityZone 指定了该实例所在的可用性区,在这里是 ap-northeast-1c
  • ImageId 指定了该实例使用的镜像 ID,在这里是 ami-0bba69335379e17f8
  • InstanceType 指定了该实例的类型,在这里是 t2.micro
  • KeyName 指定了该实例使用的密钥对
  • NetworkInterfaces 指定了该实例的网络接口,包括公共 IP 地址的分配,安全组,子网等
  • GroupSet 指定了该实例使用的安全组
  • SubnetId 指定了该实例所在的子网
  • Tags 指定了该实例的标签

在这个示例中, AssociatePublicIpAddress 设置为 true,分配公网IP,并选择了东京地区,并且将安全组配置进去了.

需要注意的是,在这个示例中,我们使用了 !Ref MySecurityGroup 和 !ImportValue MyPublicSubnet,这些是 CloudFormation 中的函数,它们用于引用现有的资源。

MySecurityGroup 是指之前定义的安全组,而 MyPublicSubnet 是指之前定义的公共子网。如果你没有在模板中定义这些资源,那么你需要在这里指定具体的安全组 ID 和子网 ID。

这个例子中, 我们没有指定EBS卷,如果需要的话,可以在Properties中加上 BlockDeviceMappings 属性。

总之, 上面这段代码是为了演示如何使用 YAML 模板创建一个 EC2 实例资源,并配置公网 IP,地区为东京,并选择安全组,实际应用中需要根据具体情况进行修改。

注意事项

1.GroupSet

GroupSet: !Ref bassg这句代码是错误的格式, GroupSet 应该是一个数组,而不是一个引用。

正确的格式应该是这样的:

NetworkInterfaces:
      - AssociatePublicIpAddress: true
        DeviceIndex: 0
        GroupSet:
          - !Ref bassg
        SubnetId: !ImportValue pub1a

在 AWS CloudFormation 中,GroupSet 是一个数组,它用于指定一组安全组。 因此,在使用 GroupSet 属性时,应该指定一组安全组,而不是单独的一个安全组。

因此, GroupSet: !Ref bassg是错误的,因为它指定了一个单独的安全组。

正确的格式是 GroupSet: – !Ref bassg 这样,就能将安全组绑定在实例的网络接口上。

因为这个原因,在 GroupSet 中使用一个数组来指定一组安全组是正确的。

2.符号 –

在 YAML 文件中看到 – 是一个列表项,可以不写 – , 但是这是一种 YAML 的标准写法。开发人员可以根据自己的喜好来决定使用 – 符号还是不使用,只要确保文件中的列表项能被正确识别即可。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注