AWS CloudFormation を使用したセキュリティグループの管理
以下のスニペットは、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
パラメータによって参照されます。
サブネットは AWS::EC2:: Subnet リソースを使用します。サブネットは、MyVPC
として参照される VPC に関連付けられています。
EC2 インスタンスは、AWS::EC2::Instance リソースを使用して VPC とサブネット内で起動されます。このリソースは、インスタンスの起動に使用する Amazon マシンイメージ (AMI)、インスタンスが実行されるサブネット、インスタンスに関連付けるセキュリティグループを指定します。Fn::FindInMap
関数は、テンプレートで定義された AWSRegionToAMI
マッピングから値を取得し、AWS::EC2::Instance リソースの ImageId
を決定するために使用されます。
セキュリティグループ ID は、MyVPC
リソースからデフォルトのセキュリティグループを取得する Fn::GetAtt
関数を使用して取得されます。
インスタンスはスニペットで定義された MySubnet
リソース内に配置されます。
AWS CloudFormation を使用して VPC を作成すると、AWS はデフォルトのセキュリティグループを含むデフォルトリソースを自動的に作成します。ただし、AWS CloudFormation テンプレート内で VPC を定義すると、テンプレートを作成するときにこれらのデフォルトリソースの ID にアクセスできない場合があります。テンプレートで指定されているデフォルトリソースにアクセスして使用するには、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 インスタンスを作成する
次のスニペットは、指定した 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
進入ルールを持つセキュリティグループの作成
以下のサンプルスニペットは、AWS CloudFormation を使用して特定の進入ルールでセキュリティグループを設定する方法を示しています。
スニペット
SSH と HTTP アクセスの進入ルールを使用してセキュリティグループを作成します。
このスニペットは、2 つのセキュリティグループ進入ルールが記述された AWS::EC2::SecurityGroup リソースを示します。最初の進入ルールは、アカウント番号 1111-2222-3333
を持つ AWS アカウントが所有する、MyAdminSecurityGroup
という名前の既存のセキュリティグループからの SSH (ポート 22) アクセスを許可します。2 番目の進入ルールは、同じテンプレートで作成された、MySecurityGroupCreatedInCFN
という名前の別のセキュリティグループからの HTTP (ポート 80) アクセスを許可します。Ref
関数は、同じテンプレートで作成されたセキュリティグループの論理名を参照するために使用されます。
最初の進入ルールでは、SourceSecurityGroupName
と SourceSecurityGroupOwnerId
プロパティの両方に値を追加する必要があります。2 番目の進入ルールでは、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 アクセスの進入ルールを使用してセキュリティグループを作成します。
次のスニペットは、2 つのインバウンドルールを持つ 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 リソースを使用して、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