目次
はじめに
CloudFormationにてセキュリティグループを作成する際に、
お互いがお互いを参照しているため無限ループしてしまう相互再帰的なテンプレートになってしまい上手くいかなかったのですが、上手くいったので記事にまとめたいと思います。
つくりたいもの
以下の2つセキュリティグループを作成したいと思っています。
ALB用セキュリティグループ
-
インバウンド
すべての IPv4 アドレスからの HTTP アクセスを許可する。
すべての IPv4 アドレスからの HTTPS アクセスを許可する。
-
アウトバウンド
対象のセキュリティグループ (EC2) のアウトバウンドアクセスを許可する。
EC2用セキュリティグループ
-
インバウンド
対象のセキュリティグループ (ALB)からの HTTP アクセスを許可する。
-
アウトバウンド
全てのアウトバウンドアクセスを許可する。
既存のセキュリティグループを更新する
調べたところ、AWS::EC2::SecurityGroup内で完結させるのではなく
ルールのみを設定してリソースを作成することができるAWS::EC2::SecurityGroupIngress, AWS::EC2::SecurityGroupEgressを利用することで循環参照させずに既存のセキュリティグループにルールを追加することが可能らしいです。
In some cases, you might have an originating (source) security group to which you want to add an outbound rule that allows traffic to a destination (target) security group. The target security group also needs an inbound rule that allows traffic from the source security group. Note that you cannot use the Ref function to specify the outbound and inbound rules for each security group. Doing so creates a circular dependency; you cannot have two resources that depend on each other. Instead, use the egress and ingress resources to declare these outbound and inbound rules, as shown in the following template example.
作成したテンプレートファイル
Resources:
ALBSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref vpcid
GroupName: security group for ALB
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
Description: Allow inbound HTTP access from all IPv4 addresses.
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: 0.0.0.0/0
Description: Allow inbound HTTPS access from all IPv4 addresses.
EC2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref vpcid
GroupName: security group for EC2
ALBEgress:
Type: AWS::EC2::SecurityGroupEgress
Properties:
Description: EC2 Security Group
DestinationSecurityGroupId: !GetAtt WebSecurityGroup.GroupId
GroupId: !GetAtt ALBSecurityGroup.GroupId
IpProtocol: -1
EC2Ingress:
Type: AWS::EC2::SecurityGroupIngress
Properties:
Description: Allow HTTP access from ALB
FromPort: 80
ToPort: 80
IpProtocol: tcp
SourceSecurityGroupId: !GetAtt ALBSecurityGroup.GroupId
GroupId: !GetAtt WebSecurityGroup.GroupId
あらかじめセキュリティグループの土台を作成(ALBSecurityGroup, EC2SecurityGroup)しておいて、
その後にルールを付け足していくよう設定します。
おわりに
この記事ではCloudFormationにてセキュリティグループを相互参照せず作成する方法について紹介しました。
この方法以外にもいくつかやり方はあるとは思いますが、個人的にきれいめな気がするのでこちらの方法を使っていきたいと思います。
何かしらどこかしらが参考になれば幸いです。
参考にさせていただいた記事
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html