in internal/aws/cfn/cfn.go [164:230]
func CreateChangeSet(template cft.Template, params []types.Parameter, tags map[string]string, stackName string) (string, error) {
templateBody, err := checkTemplate(template)
if err != nil {
return "", err
}
changeSetType := "CREATE"
exists, err := StackExists(stackName)
if err != nil {
return "", err
}
if exists {
changeSetType = "UPDATE"
}
changeSetName := stackName + "-" + fmt.Sprint(time.Now().Unix())
input := &cloudformation.CreateChangeSetInput{
ChangeSetType: types.ChangeSetType(changeSetType),
ChangeSetName: ptr.String(changeSetName),
StackName: ptr.String(stackName),
Tags: makeTags(tags),
Parameters: params,
Capabilities: []types.Capability{
"CAPABILITY_NAMED_IAM",
"CAPABILITY_AUTO_EXPAND",
},
}
if strings.HasPrefix(templateBody, "http://") {
input.TemplateURL = ptr.String(templateBody)
} else {
input.TemplateBody = ptr.String(templateBody)
}
_, err = getClient().CreateChangeSet(context.Background(), input)
if err != nil {
return changeSetName, err
}
for {
res, err := getClient().DescribeChangeSet(context.Background(), &cloudformation.DescribeChangeSetInput{
ChangeSetName: &changeSetName,
StackName: &stackName,
})
if err != nil {
return changeSetName, err
}
status := string(res.Status)
config.Debugf("ChangeSet status: %s", status)
if status == "FAILED" {
return changeSetName, errors.New(ptr.ToString(res.StatusReason))
}
if strings.HasSuffix(status, "_COMPLETE") {
break
}
time.Sleep(time.Second * 2)
}
return changeSetName, nil
}