Search code examples
aws-lambdabotoaws-cloudformationboto3aws-cli

How to deploy SAM template using boto3


I am trying to deploy https://s3.amazonaws.com/serverless-chatbot-code/chatbot.yaml using boto3 library function create_stack but getting an error

"CreateStack cannot be used with templates containing Transforms"

How can I deploy this stack with boto3?

Thanks.


Solution

  • The comment is correct, you have to first create a change set and then execute the change set after change set creation is complete. Code outline is given below

    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
    )