AWS
YAML
SecurityGroup
,

【備忘録】yamlでSecurity Group作成時にスタックした部分

循環参照が発生している

An error occurred (ValidationError) when calling the ValidateTemplate operation: Circular dependency between resources: [ApSecurityGroup, DbSecurityGroup, SmtpSecurityGroupEgress, MngSecurityGroupEgress, DbSecurityGroupEgress, DsSecurityGroupEgress, MngSecurityGroup, SearchSecurityGroup, SearchSecurityGroupEgress, SokapSecurityGroupEgress, WebSecurityGroup, WebSecurityGroupEgress, ApSecurityGroupEgress, ElbWebSecurityGroupEgress, SmtpSecurityGroup

原因究明

  • ここではEgressを外だしさえすればOKなように見受けられたが...
    • 公式のドキュメントによると、相互のインスタンス間の通信においての設定は、Ingressも押し出さないと循環参照が生じるとのこと.

もっとはっきりと書いて!!

解決例 (抜粋)

こんな感じに 子グループを吐き出すとうまくいきます(Egressも然り)

---
AWSTemplateFormatVersion: "2010-09-09"

# Description: >


# Metadata:

# Parameters:

# Mappings:

# Conditions:

Resources:
  WebSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: String     # required
      # SecurityGroupEgress:                # optional, list of Egress
      #   - DestinationSecurityGroupId: !Ref ApSG     # optional
      #     FromPort: 80     # optional
      #     ToPort: 80     # optional
      #     IpProtocol: tcp     # required
      # SecurityGroupIngress:                # optional, list of Ingress
      #   - SourceSecurityGroupId: !Ref ApSG     # optional
      #     FromPort: 80     # optional
      #     ToPort: 80     # optional
      #     IpProtocol: tcp     # required
      VpcId: String     # optional

  WebSGIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      SourceSecurityGroupId: !Ref ApSG      # optional
      IpProtocol: tcp     # required
      FromPort: 80     # optional
      ToPort: 80     # optional
      GroupId: !Ref WebSG     # optional

  WebSGEgress:
    Type: AWS::EC2::SecurityGroupEgress
    Properties:
      DestinationSecurityGroupId: !Ref ApSG     # optional
      GroupId: !Ref WebSG     # required
      IpProtocol: tcp     # required
      FromPort: 80     # optional
      ToPort: 80     # optional

  ApSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: String     # required
      VpcId: String     # optional

  SecurityGroupEgress:                # optional, list of Egress
    - GroupId: String
      DestinationSecurityGroupId: !Ref WebSG     # optional
      FromPort: 80     # optional
      ToPort: 80     # optional
      IpProtocol: tcp     # required
  SecurityGroupIngress:                # optional, list of Ingress
    - GroupId: String
      SourceSecurityGroupId: !Ref WebSG     # optional
      FromPort: 80     # optional
      ToPort: 80     # optional
      IpProtocol: tcp     # required

securitygroupegress_name:
  Type: AWS::EC2::SecurityGroupEgress
  Properties:
    CidrIp: String     # optional
    CidrIpv6: String     # optional
    DestinationPrefixListId: String     # optional
    DestinationSecurityGroupId: String     # optional
    FromPort: Integer     # optional
    GroupId: String     # required
    IpProtocol: String     # required
    ToPort: Integer     # optional
# Outputs:

追記5/23 11:23

上記の表記だとCF流した時にError吐きます、修正中です
- ルールごとに子グループ作成する必要があるのか?

追記5/23 12:07

修正しました