amazon-web-services - golang aws CreateChangeSet 验证错误

标签 amazon-web-services go aws-cloudformation

尝试更新现有 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,然后提交变更集?

最佳答案

我认为使用 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]

关于amazon-web-services - golang aws CreateChangeSet 验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63235899/

相关文章:

go - 在 Go 中获取图像的子图像时遇到问题

golang代码插入/替换

amazon-ec2 - EC2 云形成 - 错误消息

python - 需要将 lambda 函数(python)加入 YAML 中的 CloudFormation 模板,我怎样才能实现这一点?

amazon-web-services - 无法限制并发数

amazon-web-services - 获取一个 jar 及其源代码和 javadoc

amazon-web-services - 如何使用 Ansible Tower/AWX 将 Kubernetes YAML 文件应用到 AWS EKS?

amazon-web-services - Route 53 返回的响应没有显示错误,但是当我尝试在浏览器上访问时,没有响应

Golang,使用子包中主包的结构或函数

aws-lambda - 如何使用参数覆盖从输入工件动态分配代码参数中的 s3bucket 和 s3key 值?