【问题标题】:Cloudformation RDS template cannot resolve security group idCloudformation RDS 模板无法解析安全组 ID
【发布时间】:2026-01-12 03:35:01
【问题描述】:

我有一个将 MySql 数据库和一些资源部署到 AWS 的 CF。我希望脚本是通用的,并且应该能够将它用于不同的环境。对于其中一个资源(主数据库),我有一个不同的安全组配置,它是特定于环境的。我为每个有条件的环境创建安全组,称为 VaultSecurityGroupInEnv1、VaultSecurityGroupInEnv2 等。有一个地图可以保存每个环境的安全组的名称。这是我的配置:

Mappings:
  RegionMap:
    environment1:
      VaultSG: VaultSecurityGroupInEnv1
    environment2:
      VaultSG: VaultSecurityGroupInEnv2

Resources:
  VaultSecurityGroupInEnv1:
    Condition: IsEnv1Environment

  VaultSecurityGroupInEnv2:
    Condition: IsEnv2Environment

  MasterDB:
    Type: AWS::RDS::DBInstance
    Properties:
      VPCSecurityGroups:
        - !ImportValue DbSgId
        - !Sub
          - '${vGroup}'
          - vGroup: !FindInMap
            - RegionMap
            - !Ref Environment
            - VaultSG

我收到以下错误:

Invalid security group , groupId= vaultsecuritygroupinF.groupid, groupName=. (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterValue;

!Sub 的输出被检索并解析为名称字符串,而不是资源。使用 !Ref vaultsecuritygroupinF.GroupId 可以正常工作。知道如何正确使用地图和子吗?

谢谢

【问题讨论】:

  • VaultSG 是什么?它是 SG 的名称还是 group-id?
  • 是SG的名字
  • 你能提供更完整的例子吗?它使您想要实现的目标感到困惑。
  • 我认为如果您使用格式正确且完整的代码示例编辑您的问题会更好。
  • 是的,将编辑问题

标签: mysql templates amazon-cloudformation amazon-rds aws-security-group


【解决方案1】:

您不能以您尝试的方式使用FindInMap。它只会解析为 文字字符串 VaultSecurityGroupInEnv1VaultSecurityGroupInEnv2。它不会解析为同名的实际资源。

相反,我认为以下应该是可能的:

MasterDB:
  Type: AWS::RDS::DBInstance
  Properties:
    VPCSecurityGroups:
      - !ImportValue DbSgId
      - !If
        - IsEnv1Environment
        - !Ref VaultSecurityGroupInEnv1
        - !Ref "AWS::NoValue"
      - !If
        - IsEnv2Environment
        - !Ref VaultSecurityGroupInEnv2
        - !Ref "AWS::NoValue"

【讨论】:

  • 感谢这解决了我的问题,我已经尝试过了,但我错过了 !Ref for "AWS::NoValue"。
  • @Karos 没问题。如果答案有帮助,我们将不胜感激。