AWS-CloudFormation

循環参照したセキュリティグループを作成する。【CloudFormation】

はじめに

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.

AWS Documentation | AWS::EC2::SecurityGroupIngress

作成したテンプレートファイル

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

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA