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。 -
FromPort
和ToPort
是定义入站规则中端口范围的属性。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-1aImageId
指定了该实例使用的镜像 ID,在这里是 ami-0bba69335379e17f8InstanceType
指定了该实例的类型,在这里是 t2.microNetworkInterfaces
指定了该实例的网络接口,包括公共 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-1cImageId
指定了该实例使用的镜像 ID,在这里是 ami-0bba69335379e17f8InstanceType
指定了该实例的类型,在这里是 t2.microKeyName
指定了该实例使用的密钥对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 的标准写法。开发人员可以根据自己的喜好来决定使用 – 符号还是不使用,只要确保文件中的列表项能被正确识别即可。