【问题标题】:golang aws CreateChangeSet validation errorgolang aws CreateChangeSet 验证错误
【发布时间】:2020-08-04 11:04:35
【问题描述】:

尝试更新现有 Cloudformation 模板中参数的单个键/值。

...

svc := cloudformation.New(AWSSession)

// Add parameters. Used in AWS CreateStack/UpdateStack call
var params []*cloudformation.Parameter
for key, val := range cfnparamsOverrides {
    log.Printf("Adding parameter key-> %v value-> %v", key, val)
    param := &cloudformation.Parameter{}
    param.ParameterKey = aws.String(key)
    param.ParameterValue = aws.String(val)
    params = append(params, param)
}

CreateChangeSetInput := &cloudformation.CreateChangeSetInput{
    StackName:     aws.String(stackARN),      // required field.
    ChangeSetName: aws.String(ChangeSetName), // must be a unique value
    ChangeSetType: aws.String("UPDATE"),
    // TemplateBody:  aws.String(templateBody),
    UsePreviousTemplate: aws.Bool(true),
    Parameters:          params}

// Issue AWS CreateChangeSet API call
log.Println("Issuing AWS CreateChangeSet() API call")
_, errCreateChangeSet := svc.CreateChangeSet(CreateChangeSetInput)
if errCreateChangeSet != nil {
    return false, fmt.Errorf("Got error on CreateChangeSet: %v", errCreateChangeSet.Error())
}

只设置了 1 个值,但 cloudformation 模板验证会抛出以下内容: ValidationError: 参数: [Key1, Key2, Key3, ...] 必须有值

模板中存在的所有 cloudformation 参数似乎都需要键/值。有没有办法只提供我需要更新的新/现有键/值对?

在 golang aws 文档中,我发现 *cloudformation.Parameter 结构对每个值都有一个 UsePreviousValue。但是,除了避免修改现有值之外,我没有看到它的用途,它仍然需要我在部署的 cfn 模板中提供相同的参数键。

我错过了什么吗?在已部署的环境中更新现有值似乎是一种相对直接的方法。

想知道其他人是怎么做的。我是否应该查询现有环境以读取所有参数键/值,修改我需要的 1,然后提交变更集?

【问题讨论】:

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


    【解决方案1】:

    我认为使用UsePreviousValue 是您可以做到这一点的唯一方法。

    AWS CLI 的行为相同,其中create-change-setupdate-stack 将要求您再次列出所有参数并为每个参数设置UsePreviousValue="true"

    如果您想避免一直这样做,您可以在CreateChangeSet 周围创建一个包装器,它会自动填充参数。

    此限制直接源自CloudFormation REST API。为 API 提供的 example 也明确列出了所有参数,并使用 UsePreviousValue 表示对值的重用:

    https://cloudformation.us-east-1.amazonaws.com/
     ?Action=CreateChangeSet
     &ChangeSetName=SampleChangeSet
     &Parameters.member.1.ParameterKey=KeyName
     &Parameters.member.1.UsePreviousValue=true
     &Parameters.member.2.ParameterKey=Purpose
     &Parameters.member.2.ParameterValue=production
     &StackName=arn:aws:cloudformation:us-east-1:123456789012:stack/SampleStack/1a2345b6-0000-00a0-a123-00abc0abc000
     &UsePreviousTemplate=true
     &Version=2010-05-15
     &X-Amz-Algorithm=AWS4-HMAC-SHA256
     &X-Amz-Credential=[Access key ID and scope]
     &X-Amz-Date=20160316T233349Z
     &X-Amz-SignedHeaders=content-type;host
     &X-Amz-Signature=[Signature]
    

    【讨论】:

    • 嘿!谢谢你解释历史。我正在执行您建议的重构,并首先使用 svc.GetTemplateSummary() 调用以获取现有属性。 “值”的字段名称不符合要求,因此我不确定这是否是获取现有属性的正确 api 调用
    猜你喜欢
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 2015-11-09
    • 2021-03-17
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    相关资源
    最近更新 更多