【问题标题】:Can't send parameters from a child CloudFormation template to another child template无法将参数从子 CloudFormation 模板发送到另一个子模板
【发布时间】:2017-03-04 04:56:19
【问题描述】:

我正在制作一个巨大的 CloudFormation 模板,它使用 AWS::CloudFormation::Stack 资源来生成其他嵌套堆栈。这样做的目的是经典的职责和管理分离。

总体目标是从头开始构建应用环境(从 VPC 开始,以应用实例结束)。

到目前为止,大部分都有效。但是我在引用子网 CF 模板和安全组 CF 模板的输出以用于创建 EC2 实例时遇到了障碍。

它是这样工作的:

主模板 --> 构建 VPC --> 调用子模板来构建子网 --> 调用子模板来构建安全组 --> 调用子模板来构建 EC2 实例

我需要将子网和安全组模板的输出传递到 EC2 实例模板,以便将实例预置到架构的正确部分。 VPC ID ref 和 KeyPairs 可以正常传递,但 subnetID 和 securitygroupID 不能。

这是调用安全组/子网模板的主模板部分:

"DevNetworkStack": {
        "Type": "AWS::CloudFormation::Stack",
        "DependsOn": [
            "SNVPC",
            "SNIGW"
        ],
        "Properties": {
            "TemplateURL": {
                "Fn::FindInMap": [
                    "TemplateURLs",
                    "DevNetworkStack",
                    "URL"
                ]
            },
            "TimeoutInMinutes": "30",
            "Parameters": {
                "VPCID": {
                    "Ref": "SNVPC"
                },
                "SNIGW": {
                    "Ref": "SNIGW"
                }
            }
        }
    },
    "DevSecurityGroupsStack": {
        "Type": "AWS::CloudFormation::Stack",
        "DependsOn": "DevNetworkStack",
        "Properties": {
            "TemplateURL": {
                "Fn::FindInMap": [
                    "TemplateURLs",
                    "DevSecurityGroupsStack",
                    "URL"
                ]
            },
            "TimeoutInMinutes": "30",
            "Parameters": {
                "VPCID": {
                    "Ref": "SNVPC"
                }
            }
        }
},

这些工作正常。他们创造,一切都很好。模板提供如下输出:

"Outputs": {
     "DevAdminSubnetID": {
        "Description": "DevAdminSubnetID",
        "Value": {
            "Ref": "DevAdminSubnet"
        }
},

...

"Outputs": {
     "DevAdminSecurityGroupID": {
        "Description": "DevAdminSecurityGroupID",
        "Value": {
            "Ref": "DevAdminSecurityGroup"
        }
},

我可以在 CF 控制台中看到输出。

现在,下一个模板尝试使用安全组 ID 和子网 ID。但它不起作用。

主模板将下一个子模板称为:

"DevAdminStack": {
       "Type": "AWS::CloudFormation::Stack",
        "DependsOn": [
            "DevNetworkStack",
            "DevSecurityGroupsStack",
            "EC2DevRoleInstanceProfile",
            "S3DevUserDataBucket",
            "S3DevHomeDirsDataBucket"
        ],
        "Properties": {
            "TemplateURL": {
                "Fn::FindInMap": [
                    "TemplateURLs",
                    "DevAdminStack",
                    "URL"
                ]
            },
            "TimeoutInMinutes": "30",
            "Parameters": {
                "AdminKeyPair": {
                    "Ref": "AdminServersKeyPair"
                },
                "VPCID": {
                    "Ref": "SNVPC"
                },
                "DevAdminSecurityGroupID": [
                    {
                        "Fn::GetAtt": [
                            "DevSecurityGroupsStack",
                            "Outputs.DevAdminSecurityGroupID"
                        ]
                    }
                ],
                "DevAdminSubnetID": [
                    {
                        "Fn::GetAtt": [
                            "DevNetworkStack",
                            "Outputs.DevAdminSubnetID"
                        ]
                    }
                ]
            }
        }
}

...子模板看起来像这样(为简洁起见删除了一些部分,因为我现在只是在测试)

{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "Dev-Admin",
"Mappings": {
    "RegionMap": {
        "DevAdminServer": {
            "AMI": "ami-6fc9770e",
            "InstanceType": "t2.micro"
        }
    }
},
"Parameters": {
    "AdminKeyPair": {
        "Type": "AWS::EC2::KeyPair::KeyName"
    },
    "VPCID": {
        "Type": "AWS::EC2::VPC::Id"
    },
    "DevAdminSecurityGroupID": {
        "Type": "AWS::EC2::SecurityGroup::Id"
    },
    "DevAdminSubnetID": {
        "Type": "AWS::EC2::Subnet::Id"
    }
},
"Resources": {
    "DevAdminServer": {
        "Type": "AWS::EC2::Instance",
        "Metadata": {
            "Comment": "Sets up administrative tools for the server",
            "AWS::CloudFormation::Init": {
                "config": {
                    "packages": {
                        "yum": {}
                    },
                    "files": {},
                    "services": {}
                }
            }
        },
        "Properties": {
            "ImageId": {
                "Fn::FindInMap": [
                    "RegionMap",
                    "DevAdminServer",
                    "AMI"
                ]
            },
            "SecurityGroupIds": [
                {
                    "Ref": "DevAdminSecurityGroupID"
                }
            ],
            "SubnetId": {
                "Ref": "DevAdminSubnetID"
            },
            "InstanceType": {
                "Fn::FindInMap": [
                    "RegionMap",
                    "DevAdminServer",
                    "InstanceType"
                ]
            },
            "KeyName": {
                "Ref": "AdminKeyPair"
            },
            "Tags": [
                {
                    "Key": "Application",
                    "Value": {
                        "Ref": "AWS::StackId"
                    }
                }
            ],
            "UserData": {
                "Fn::Base64": {
                    "Fn::Join": [
                        "",
                        []
                    ]
                }
            }
        }
    }
  }
}

但此资源在创建时失败并出现错误:

属性参数的值必须是具有字符串(或简单类型)属性的对象

我知道这是导致问题的最后两个变量(子网 ID 和安全组 ID),因为我删除了它们,并且子模板的配置工作正常。

我做错了什么?

【问题讨论】:

    标签: templates amazon-web-services amazon-cloudformation


    【解决方案1】:

    DevAdminSecurityGroupID 和 DevAdminSubnetID 的值在您的主模板中定义为 JSON 数组 [],但它们应该是字符串(在 Fn::GetAtt 内部函数扩展之后):

                "DevAdminSecurityGroupID":
                    {
                        "Fn::GetAtt": [
                            "DevSecurityGroupsStack",
                            "Outputs.DevAdminSecurityGroupID"
                        ]
                    },
                "DevAdminSubnetID":
                    {
                        "Fn::GetAtt": [
                            "DevNetworkStack",
                            "Outputs.DevAdminSubnetID"
                        ]
                    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 2016-10-22
      • 2020-07-13
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 2019-02-23
      相关资源
      最近更新 更多