CloudFormation でセキュリティグループを管理する
以下のスニペットは、CloudFormation を使用してセキュリティグループと Amazon EC2 インスタンスを管理し、AWS リソースへのアクセスを制御する方法を示しています。
スニペットカテゴリ
Amazon EC2 インスタンスをセキュリティグループと関連付けるには
次のスニペットは、CloudFormation を使用して Amazon EC2 インスタンスをデフォルトの Amazon VPC セキュリティグループに関連付ける方法を示します。
Amazon EC2 インスタンスをデフォルトの VPC セキュリティグループと関連付けるには
次のスニペットは、Amazon VPC、VPC 内のサブネット、Amazon EC2 インスタンスを作成します。VPC は AWS::EC2::VPC リソースを使用して作成されます。VPC の IP アドレス範囲は、大きい方のテンプレートで定義され、MyVPCCIDRRange
パラメータによって参照されます。
サブネットは AWS::EC2:: Subnet リソースを使用します。サブネットは、MyVPC
として参照される VPC に関連付けられています。
EC2 インスタンスは、AWS::EC2::Instance リソースを使用して VPC とサブネット内で起動されます。このリソースは、インスタンスの起動に使用する Amazon マシンイメージ (AMI)、インスタンスが実行されるサブネット、インスタンスに関連付けるセキュリティグループを指定します。Fn::FindInMap
関数は、テンプレートで定義された AWSRegionToAMI
マッピングから値を取得し、AWS::EC2::Instance リソースの ImageId
を決定するために使用されます。
セキュリティグループ ID は、MyVPC
リソースからデフォルトのセキュリティグループを取得する Fn::GetAtt
関数を使用して取得されます。
インスタンスはスニペットで定義された MySubnet
リソース内に配置されます。
CloudFormation を使用して VPC を作成すると、AWS はデフォルトのセキュリティグループを含むデフォルトリソースを VPC 内に自動的に作成します。ただし、CloudFormation テンプレート内で VPC を定義すると、テンプレートを作成するときにこれらのデフォルトリソースの ID にアクセスできない場合があります。テンプレートで指定されているデフォルトリソースにアクセスして使用するには、Fn::GetAtt
などの組み込み関数を使用できます。この関数を使用すると、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 インスタンスを作成する
次のスニペットは、指定した AMI から起動する AWS::EC2::Instance リソースを使用する Amazon EC2 インスタンスを作成します。インスタンスは、AWS::EC2::SecurityGroup リソースを使用して、指定された IP アドレスからポート 22 で受信する 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
進入ルールを持つセキュリティグループの作成
以下のサンプルスニペットは、CloudFormation を使用して特定の進入ルールでセキュリティグループを設定する方法を示しています。
スニペット
SSH と HTTP アクセスの進入ルールを使用してセキュリティグループを作成します。
このスニペットは、2 つのセキュリティグループ進入ルールが記述された AWS::EC2::SecurityGroup リソースを示します。最初の進入ルールは、アカウント番号 1111-2222-3333
を持つ AWS アカウントが所有する、MyAdminSecurityGroup
という名前の既存のセキュリティグループからの SSH (ポート 22) アクセスを許可します。2 番目の進入ルールは、同じテンプレートで作成された、MySecurityGroupCreatedInCFN
という名前の別のセキュリティグループからの HTTP (ポート 80) アクセスを許可します。Ref
関数は、同じテンプレートで作成されたセキュリティグループの論理名を参照するために使用されます。
最初の進入ルールでは、SourceSecurityGroupName
と SourceSecurityGroupOwnerId
プロパティの両方に値を追加する必要があります。2 番目の進入ルールでは、MySecurityGroupCreatedInCFNTemplate
は同じテンプレートで作成された別のセキュリティグループを参照します。論理名が、大きい方のテンプレートで指定するセキュリティグループリソースの実際の論理名 MySecurityGroupCreatedInCFNTemplate
と一致することを確認してください。
セキュリティグループの詳細については、「Amazon EC2 ユーザーガイド」の「Amazon EC2 インスタンス用の 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 アクセスの進入ルールを使用してセキュリティグループを作成します。
次のスニペットは、2 つのインバウンドルールを持つ Amazon EC2 インスタンスのセキュリティグループを作成します。インバウンドルールは、指定された CIDR 範囲からの指定ポートへの受信 TCP トラフィックを許可します。AWS::EC2::SecurityGroup リソースは、ルールの指定に使用されます。各ルールのプロトコルを指定する必要があります。TCP の場合は、ポートまたはポート範囲も指定する必要があります。ソースセキュリティグループまたは CIDR 範囲のいずれも指定しない場合、スタックは正常に起動しますが、ルールはセキュリティグループに適用されません。
セキュリティグループの詳細については、「Amazon EC2 ユーザーガイド」の「Amazon EC2 インスタンス用の 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 リソースを使用して、SGroup1
と SGroup2
の 2 つの Amazon EC2 セキュリティグループを作成します。2 つのセキュリティグループ間の通信を許可する進入ルールは、AWS::EC2::SecurityGroupIngress リソースを使用して作成されます。SGroup1Ingress
は、送信元セキュリティグループ SGroup2
からポート 80 で受信 TCP トラフィックを許可する SGroup1
の進入ルールを確立します。SGroup2Ingress
は、送信元セキュリティグループ SGroup1
からのポート 80 への着信 TCP トラフィックを許可する SGroup2
の進入ルールを確立します。
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 リソースを生成します。このセキュリティグループは、ポート 80 での着信 TCP トラフィックを許可する、ELB
ingress group
という 1 つの進入ルールを使用して作成されます。この進入ルールのソースは、ロードバランサーリソースから属性を取得する 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