john
john

Reputation: 2544

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.

Upvotes: 3

Views: 3301

Answers (2)

LittleWat
LittleWat

Reputation: 131

I think you should use Waiter instead of while loop like below;

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)

My work below would be helpful;

Upvotes: 1

vsnyc
vsnyc

Reputation: 2257

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
)

Upvotes: 8

Related Questions