CloudFormation - 安全组 VPC 问题

Joh*_*ohn 3 amazon-web-services aws-cloudformation

我有一个创建 ELB 并在 VPC 中附加现有子网的模板。这很好,但是当我更新我的堆栈并添加一个具有 VpcId 属性的安全组时,该属性的值等于我的附加子网所属的现有 VPC ID,堆栈失败并显示以下错误:

“您指定了属于不同网络的两个资源”

如果我从我的安全组中删除 VpcId 属性,它会在我的默认 VPC 中创建它并且堆栈创建工作。我不明白为什么这可能是因为安全组在指定的入口规则中与 ELB 有关系 -

"IpProtocol": "tcp",
            "FromPort": "8000",
            "ToPort": "8010",
            "SourceSecurityGroupOwnerId": {
              "Fn::GetAtt": [
                "ElasticLoadBalancer",
                "SourceSecurityGroup.OwnerAlias"
              ]
            },
Run Code Online (Sandbox Code Playgroud)

我无法在 ELB 上明确说明 VPC ID,因为它没有这样的属性,只有子网或 AZ。

Joh*_*ohn 5

谢谢你们的帮助。我发现了问题并解决了问题。

问题是我试图在安全组定义中的安全组入口定义中从另一个安全组中引用一个安全组。正如文档所说:

如果您想在这些安全组的入口和出口规则中交叉引用两个安全组,请使用 AWS::EC2::SecurityGroupEgress 和 AWS::EC2::SecurityGroupIngress 资源来定义您的规则。不要在 AWS::EC2::SecurityGroup 中使用嵌入的入口和出口规则。如果这样做,则会导致循环依赖,这是 AWS CloudFormation 不允许的。

因此,我指定了我的两个安全组,然后在单独的资源中指定了一个 SecurityGroupIngress。这必须手动输入到模板中,因为此资源的左侧菜单中没有 CloudFormation 图标。花了一段时间才弄清楚,因为我创建堆栈时生成的错误消息并不明显。

"InstanceIngress": {
  "Type": "AWS::EC2::SecurityGroupIngress",
  "Properties": {
    "GroupId": {
      "Fn::GetAtt": [
        "InstanceSecurityGroup",
        "GroupId"
      ]
    },
    "IpProtocol": "tcp",
    "FromPort": "7997",
    "ToPort": "8100",
    "SourceSecurityGroupId": {
      "Fn::GetAtt": [
        "ELBSecurityGroup",
        "GroupId"
      ]
    }
  },
Run Code Online (Sandbox Code Playgroud)