Как лучше всего с помощью Boto проверить, существует ли стек CloudFormation и не находится ли он в неисправном состоянии? Под «сломанным» я подразумеваю состояния «сбой» и «откат».
Я не хочу использовать try/except
решение, потому что boto регистрирует его как ошибку, и в моем сценарии он отправит журнал исключений в систему сигнализации.
На данный момент у меня есть следующие решения:
1) Используйте boto.cloudformation.connection.CloudFormationConnection.describe_stacks()
.
valid_states = '''\
CREATE_IN_PROGRESS
CREATE_COMPLETE
UPDATE_IN_PROGRESS
UPDATE_COMPLETE_CLEANUP_IN_PROGRESS
UPDATE_COMPLETE'''.splitlines()
def describe_stacks():
result = []
resp = cf_conn.describe_stacks()
result.extend(resp)
while resp.next_token:
resp = cf_conn.describe_stacks(next_token=resp.next_token)
result.extend(resp)
return result
stacks = [stack for stack in describe_stacks() if stack.stack_name == STACK_NAME and stack.stack_status in valid_states]
exists = len(stacks) >= 1
Это медленно, потому что у меня много стеков.
2) Используйте boto.cloudformation.connection.CloudFormationConnection.list_stacks()
.
def list_stacks(filters):
result = []
resp = cf_conn.list_stacks(filters)
result.extend(resp)
while resp.next_token:
resp = cf_conn.list_stacks(filters, next_token=resp.next_token)
result.extend(resp)
return result
stacks = [stack for stack in list_stacks(valid_states) if stack.stack_name == STACK_NAME]
exists = len(stacks) >= 1
Это занимает вечность, потому что сводки хранятся в течение 90 дней, а у меня много стопок.
Вопрос: Какое идеальное решение проверить, существует ли данный стек и не находится ли он в состоянии отказа или отката?