Reputation: 2544
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
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
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