本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
下列程式碼片段示範如何使用 AWS CloudFormation 來管理安全群組和 Amazon EC2 執行個體,以控制對 AWS 資源的存取。
將 Amazon EC2 執行個體與安全群組建立關聯
下列範例程式碼片段示範了如何使用 AWS CloudFormation,將 Amazon EC2 執行個體與預設 Amazon VPC 安全群組建立關聯。
將 Amazon EC2 執行個體與預設 VPC 安全群組建立關聯
下列程式碼片段會建立 Amazon VPC、VPC 內的子網路以及 Amazon EC2 執行個體。VPC 使用 AWS::EC2::VPC 資源建立。VPC 的 IP 地址範圍在較大的範本中定義,並且 MyVPCCIDRRange
參數會參考該範圍。
子網路在 VPC 內使用 AWS::EC2:: Subnet 資源。子網路與 VPC 關聯,以 MyVPC
做為參考。
EC2 執行個體在 VPC 和子網路內使用 AWS::EC2::Instance 資源啟動。此資源會指定用於啟動執行個體的 Amazon Machine Image (AMI)、執行執行個體所在的子網路,以及要與執行個體建立關聯的安全群組。Fn::FindInMap
函數用於從範本定義的 AWSRegionToAMI
映射中擷取值,以確定 AWS::EC2::Instance 資源的 ImageId
。
安全群組 ID 使用 Fn::GetAtt
函數取得,該函數會從 MyVPC
資源擷取預設安全群組。
執行個體會放置在程式碼片段定義的 MySubnet
資源內。
當您使用 建立 VPC 時 AWS CloudFormation, 會在 VPC 內 AWS 自動建立預設資源,包括預設安全群組。不過,當您在 AWS CloudFormation 範本中定義 VPC 時,在建立範本時,您可能無法存取這些預設資源IDs。若要存取和使用範本中指定的預設資源,您可以使用內部函數,例如 Fn::GetAtt
。此函數可讓您使用 AWS CloudFormation自動建立的預設資源。
JSON
"MyVPC": {
"Type": "AWS::EC2::VPC",
"Properties": {
"CidrBlock": {
"Ref": "MyVPCCIDRRange"
},
"EnableDnsSupport": false,
"EnableDnsHostnames": false,
"InstanceTenancy": "default"
}
},
"MySubnet": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"CidrBlock": {
"Ref": "MyVPCCIDRRange"
},
"VpcId": {
"Ref": "MyVPC"
}
}
},
"MyInstance": {
"Type": "AWS::EC2::Instance",
"Properties": {
"ImageId": {
"Fn::FindInMap": [
"AWSRegionToAMI",
{
"Ref": "AWS::Region"
},
"64"
]
},
"SecurityGroupIds": [
{
"Fn::GetAtt": [
"MyVPC",
"DefaultSecurityGroup"
]
}
],
"SubnetId": {
"Ref": "MySubnet"
}
}
}
YAML
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock:
Ref: MyVPCCIDRRange
EnableDnsSupport: false
EnableDnsHostnames: false
InstanceTenancy: default
MySubnet:
Type: AWS::EC2::Subnet
Properties:
CidrBlock:
Ref: MyVPCCIDRRange
VpcId:
Ref: MyVPC
MyInstance:
Type: AWS::EC2::Instance
Properties:
ImageId:
Fn::FindInMap:
- AWSRegionToAMI
- Ref: AWS::Region
- "64"
SecurityGroupIds:
- Fn::GetAtt:
- MyVPC
- DefaultSecurityGroup
SubnetId:
Ref: MySubnet
建立具有附接磁碟區和安全群組的 Amazon EC2 執行個體
下列程式碼片段會使用 AWS::EC2::Instance 資源來建立 Amazon EC2 執行個體,該資源從指定的 AMI 啟動。執行個體與安全群組關聯,允許使用 AWS::EC2::SecurityGroup 資源,在連接埠 22 上從指定的 IP 地址傳入 SSH 流量。它會使用 AWS::EC2::Volume 資源來建立 100 GB 的 Amazon EBS 磁碟區。磁碟區建立在與執行個體相同的可用區域 (如 GetAtt
函數所指定),並掛接至 /dev/sdh
裝置上的執行個體。
如需有關建立 Amazon EBS 磁碟區的詳細資訊,請參閱建立 Amazon EBS 磁碟區。
JSON
"Ec2Instance": {
"Type": "AWS::EC2::Instance",
"Properties": {
"SecurityGroups": [
{
"Ref": "InstanceSecurityGroup"
}
],
"ImageId": "ami-1234567890abcdef0
"
}
},
"InstanceSecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupDescription": "Enable SSH access via port 22",
"SecurityGroupIngress": [
{
"IpProtocol": "tcp",
"FromPort": "22",
"ToPort": "22",
"CidrIp": "192.0.2.0/24
"
}
]
}
},
"NewVolume": {
"Type": "AWS::EC2::Volume",
"Properties": {
"Size": "100",
"AvailabilityZone": {
"Fn::GetAtt": [
"Ec2Instance",
"AvailabilityZone"
]
}
}
},
"MountPoint": {
"Type": "AWS::EC2::VolumeAttachment",
"Properties": {
"InstanceId": {
"Ref": "Ec2Instance"
},
"VolumeId": {
"Ref": "NewVolume"
},
"Device": "/dev/sdh"
}
}
YAML
Ec2Instance:
Type: AWS::EC2::Instance
Properties:
SecurityGroups:
- !Ref InstanceSecurityGroup
ImageId: ami-1234567890abcdef0
InstanceSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Enable SSH access via port 22
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 192.0.2.0/24
NewVolume:
Type: AWS::EC2::Volume
Properties:
Size: 100
AvailabilityZone: !GetAtt [Ec2Instance, AvailabilityZone]
MountPoint:
Type: AWS::EC2::VolumeAttachment
Properties:
InstanceId: !Ref Ec2Instance
VolumeId: !Ref NewVolume
Device: /dev/sdh
使用傳入規則建立安全群組
下列範例程式碼片段示範了如何透過使用 AWS CloudFormation的特定傳入規則來設定安全群組。
使用傳入規則建立安全群組以進行 SSH 和 HTTP 存取
下列程式碼片段描述了使用 AWS::EC2::SecurityGroup 資源的兩個安全群組傳入規則。第一個傳入規則允許 SSH (連接埠 22) 從名為 的現有安全群組存取MyAdminSecurityGroup
,該安全群組由 AWS 帳戶擁有,帳戶號碼為 1111-2222-3333
。第二個傳入規則允許從稱為 MySecurityGroupCreatedInCFN
的不同安全群組存取 HTTP (通訊埠 80),該安全群組在相同範本中建立。Ref
函數用於參考在相同範本中建立的安全群組的邏輯名稱。
在第一個傳入規則中,您必須為 SourceSecurityGroupName
和 SourceSecurityGroupOwnerId
屬性新增值。在第二個傳入規則中,MySecurityGroupCreatedInCFNTemplate
會參考在相同範本中建立的不同安全群組。確認邏輯名稱 MySecurityGroupCreatedInCFNTemplate
與您在較大範本中指定的安全群組資源的實際邏輯名稱相符。
如需有關安全群組的詳細資訊,請參閱適用於 Linux 執行個體的 Amazon EC2 安全群組和適用於 Windows 執行個體的 Amazon EC2 安全群組。
JSON
"SecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupDescription": "Allow connections from specified source security group",
"SecurityGroupIngress": [
{
"IpProtocol": "tcp",
"FromPort": "22",
"ToPort": "22",
"SourceSecurityGroupName": "MyAdminSecurityGroup",
"SourceSecurityGroupOwnerId": "1111-2222-3333
"
},
{
"IpProtocol": "tcp",
"FromPort": "80",
"ToPort": "80",
"SourceSecurityGroupName": {
"Ref": "MySecurityGroupCreatedInCFNTemplate"
}
}
]
}
}
YAML
SecurityGroup:
Type: 'AWS::EC2::SecurityGroup'
Properties:
GroupDescription: Allow connections from specified source security group
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: '22'
ToPort: '22'
SourceSecurityGroupName: MyAdminSecurityGroup
SourceSecurityGroupOwnerId: '1111-2222-3333
'
- IpProtocol: tcp
FromPort: '80'
ToPort: '80'
SourceSecurityGroupName:
Ref: MySecurityGroupCreatedInCFNTemplate
使用傳入規則建立安全群組,以從指定的 CIDR 範圍進行 HTTP 和 SSH 存取
下列程式碼片段會針對具有兩個傳入規則的 Amazon EC2 執行個體建立安全群組。傳入規則允許從指定 CIDR 範圍的指定連接埠上傳入 TCP 流量。AWS::EC2::SecurityGroup 資源用於指定規則。您必須針對每項規則指定協定。針對 TCP,您必須指定連接埠或連接埠範圍。如果您未指定來源安全群組或 CIDR 範圍,堆疊會成功啟動,但不會將規則套用至安全群組。
如需有關安全群組的詳細資訊,請參閱適用於 Linux 執行個體的 Amazon EC2 安全群組和適用於 Windows 執行個體的 Amazon EC2 安全群組。
JSON
"ServerSecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupDescription": "Allow connections from specified CIDR ranges",
"SecurityGroupIngress": [
{
"IpProtocol": "tcp",
"FromPort": "80",
"ToPort": "80",
"CidrIp": "192.0.2.0/24
"
},
{
"IpProtocol": "tcp",
"FromPort": "22",
"ToPort": "22",
"CidrIp": "192.0.2.0/24
"
}
]
}
}
YAML
ServerSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow connections from specified CIDR ranges
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 192.0.2.0/24
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 192.0.2.0/24
使用傳入規則建立相互參照的安全群組
下列程式碼片段使用 AWS::EC2::SecurityGroup 資源來建立兩個 Amazon EC2 安全群組 (SGroup1
和 SGroup2
)。允許兩個安全群組之間進行通訊的傳入規則使用 AWS::EC2::SecurityGroupIngress 資源建立。SGroup1Ingress
會建立 SGroup1
的傳入規則,以允許來源安全群組 SGroup2
連接埠 80 上的傳入 TCP 流量。SGroup2Ingress
會建立 SGroup2
的傳入規則,以允許來源安全群組 SGroup1
連接埠 80 上的傳入 TCP 流量。
JSON
"SGroup1": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupDescription": "EC2 instance access"
}
},
"SGroup2": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupDescription": "EC2 instance access"
}
},
"SGroup1Ingress": {
"Type": "AWS::EC2::SecurityGroupIngress",
"Properties": {
"GroupName": {
"Ref": "SGroup1"
},
"IpProtocol": "tcp",
"ToPort": "80",
"FromPort": "80",
"SourceSecurityGroupName": {
"Ref": "SGroup2"
}
}
},
"SGroup2Ingress": {
"Type": "AWS::EC2::SecurityGroupIngress",
"Properties": {
"GroupName": {
"Ref": "SGroup2"
},
"IpProtocol": "tcp",
"ToPort": "80",
"FromPort": "80",
"SourceSecurityGroupName": {
"Ref": "SGroup1"
}
}
}
YAML
SGroup1:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: EC2 Instance access
SGroup2:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: EC2 Instance access
SGroup1Ingress:
Type: AWS::EC2::SecurityGroupIngress
Properties:
GroupName: !Ref SGroup1
IpProtocol: tcp
ToPort: 80
FromPort: 80
SourceSecurityGroupName: !Ref SGroup2
SGroup2Ingress:
Type: AWS::EC2::SecurityGroupIngress
Properties:
GroupName: !Ref SGroup2
IpProtocol: tcp
ToPort: 80
FromPort: 80
SourceSecurityGroupName: !Ref SGroup1
使用安全群組傳入規則建立 Elastic Load Balancer
下列範本會在指定的可用區域建立 AWS::ElasticLoadBalancing::LoadBalancer 資源。AWS::ElasticLoadBalancing::LoadBalancer 資源設定為在連接埠 80 上接聽 HTTP 流量,請求也會引導至連接埠 80 上的執行個體。Elastic Load Balancer 負責對執行個體之間的傳入 HTTP 流量進行負載平衡。
此外,此範本會產生與負載平衡器關聯的 AWS::EC2::SecurityGroup 資源。此安全群組使用單一傳入規則建立,描述為 ELB ingress group
,這會允許連接埠 80 上的傳入 TCP 流量。此傳入規則的來源 Fn::GetAtt
函數定義,以從負載平衡器資源擷取屬性。SourceSecurityGroupOwnerId
使用 Fn::GetAtt
來取得負載平衡器來源安全群組的 OwnerAlias
。SourceSecurityGroupName
使用 Fn::Getatt
來取得 ELB 來源安全群組的 GroupName
。
此設定可確保 ELB 與執行個體之間進行安全通訊。
如需負載平衡的詳細資訊,請參閱 Elastic Load Balancing 使用者指南。
JSON
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"MyELB": {
"Type": "AWS::ElasticLoadBalancing::LoadBalancer",
"Properties": {
"AvailabilityZones": [
"aa-example-1a
"
],
"Listeners": [
{
"LoadBalancerPort": "80",
"InstancePort": "80",
"Protocol": "HTTP"
}
]
}
},
"MyELBIngressGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupDescription": "ELB ingress group",
"SecurityGroupIngress": [
{
"IpProtocol": "tcp",
"FromPort": 80,
"ToPort": 80,
"SourceSecurityGroupOwnerId": {
"Fn::GetAtt": [
"MyELB",
"SourceSecurityGroup.OwnerAlias"
]
},
"SourceSecurityGroupName": {
"Fn::GetAtt": [
"MyELB",
"SourceSecurityGroup.GroupName"
]
}
}
]
}
}
}
}
YAML
AWSTemplateFormatVersion: '2010-09-09'
Resources:
MyELB:
Type: 'AWS::ElasticLoadBalancing::LoadBalancer'
Properties:
AvailabilityZones:
- aa-example-1a
Listeners:
- LoadBalancerPort: '80'
InstancePort: '80'
Protocol: HTTP
MyELBIngressGroup:
Type: 'AWS::EC2::SecurityGroup'
Properties:
GroupDescription: ELB ingress group
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: '80'
ToPort: '80'
SourceSecurityGroupOwnerId:
Fn::GetAtt:
- MyELB
- SourceSecurityGroup.OwnerAlias
SourceSecurityGroupName:
Fn::GetAtt:
- MyELB
- SourceSecurityGroup.GroupName