如何使用 boto3 部署 SAM 模板

How to deploy SAM template using boto3

我正在尝试部署 https://s3.amazonaws.com/serverless-chatbot-code/chatbot.yaml 使用 boto3 库函数 create_stack 但出现错误

"CreateStack cannot be used with templates containing Transforms"

如何使用 boto3 部署此堆栈?

谢谢。

评论正确,您必须先创建一个变更集,然后在变更集创建完成后执行该变更集。代码大纲如下

client = boto3.client('cloudformation')

# Helper function to retrieve change set status
def changeSetStatus(change_set_name, client):
    response = client.describe_change_set(
      ChangeSetName=change_set_name,
    )
    return response['Status']

# Create change set
cs_response = client.create_change_set(
  StackName=stackname,
  TemplateURL=templateurl,
  Parameters=params,
  Capabilities=[capabilities],
  ChangeSetType="CREATE",
  ChangeSetName=stackname + "-cs"
)

#Remove print statements, here for illustration
print(str(cs_response))

change_set_name = cs_response['Id']

# Wait until change set status is CREATE_COMPLETE
while True:
  response = change_set_status(change_set_name, client)
  print(str(response))
  time.sleep(10)
  if response == 'CREATE_COMPLETE':
      break

# Execute change set
ex_response = client.execute_change_set(
  ChangeSetName=change_set_name
)

我认为你应该使用 Waiter 而不是下面的 while 循环;

from pprint import pprint

client = boto3.client('cloudformation')

change_set_name = stack_name + "-cs"
# Create change set
cs_response = client.create_change_set(
  StackName=stack_name,
  TemplateURL=templateurl,
  Parameters=params,
  Capabilities=[capabilities],
  ChangeSetType="CREATE",
  ChangeSetName=change_set_name
)

waiter = client.get_waiter('change_set_create_complete')

waiter.wait(
    ChangeSetName=change_set_name,
    StackName=stack_name,
    WaiterConfig={
        'Delay': 3,
        'MaxAttempts': 50
    }
)

desc_response = client.describe_change_set(
    ChangeSetName=change_set_name,
    StackName=stack_name,
)
print("describe_change_set response Changes:")
pprint(desc_response["Changes"], indent=4)


exec_response = client.execute_change_set(
    ChangeSetName=change_set_name,
    StackName=stack_name
)

print("execute_change_set Changes:")
pprint(execute_change_set, indent=4)

我的以下工作会有所帮助;