golang aws Ошибка проверки CreateChangeSet - PullRequest
0 голосов
/ 03 августа 2020

Попытка обновить один ключ / значение параметра в существующем шаблоне 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 значение, но проверка шаблона облачной информации вызывает следующее: ValidationError: Параметры: [Key1, Key2, Key3, ...] должны иметь значения

Кажется, требуется ключ / значение для всех параметров облачной информации, существующих в шаблоне. Есть ли способ предоставить только новую / существующую пару ключ / значение, которую мне нужно обновить?

В документации golang aws я обнаружил, что структура * cloudformation.Parameter имеет UsePreviousValue для каждого значения. Однако я не вижу в этом другого применения, кроме как избежать изменения существующего значения, он по-прежнему требует, чтобы я предоставил те же ключи параметров в развернутом шаблоне cfn.

Я что-то упустил? Кажется, что это относительно простой подход к обновлению существующего значения в развернутой среде.

Интересно, как это делают другие. Следует ли мне запрашивать существующую среду, чтобы прочитать все ключи / значения параметров, изменить 1, который мне нужен, а затем отправить набор изменений?

1 Ответ

0 голосов
/ 04 августа 2020

Я думаю, что использование UsePreviousValue - единственный способ сделать это.

То же поведение для AWS CLI , где create-change-set или update-stack потребуют от вас чтобы снова перечислить все параметры и установить UsePreviousValue="true" для каждого из них.

Если вы не хотите делать это все время, вы можете создать обертку вокруг CreateChangeSet который автоматически подставит параметры.

Это ограничение проистекает непосредственно из CloudFormation REST API . Пример , предоставленный для API, также явно перечисляет все параметры и использует 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]
...