我有一个支持lambda的自定义资源,导致lambda永久导致了云形式“ CREATE_IN_PROGRESS”,无法删除
import pymysql
import os
import json
import boto3
from botocore.vendored import requests
def handler(event, context):
try:
if event['RequestType'] == 'Create' or event['RequestType'] == 'Update':
print("Create or Update")
# some database operation
respond_cloudformation(event, "SUCCESS")
else:
respond_cloudformation(event, "SUCCESS")
return
except:
respond_cloudformation(event, "SUCCESS")
def respond_cloudformation(event, status, data=None):
responseBody = {
'Status': status,
'Reason': 'See the details in CloudWatch Log Stream',
'PhysicalResourceId': 'Custom Lambda Function',
'StackId': event['StackId'],
'RequestId': event['RequestId'],
'LogicalResourceId': event['LogicalResourceId'],
'Data': data
}
print('Response = ' + json.dumps(responseBody))
requests.put(event['ResponseURL'], data=json.dumps(responseBody))
答案 0 :(得分:0)
好吧
首先,它不会永远存在。堆栈创建/更新最终将超时。为了加快速度,您可以联系aws支持人员,以便他们可以手动终止堆栈。但是对于自定义资源,我认为超时发生在1小时后。
第二,检查您的AWS CloudWatch日志。正在运行的lambda在那里生成所有日志。您肯定会在那看到崩溃。
第三,几乎可以保证您的lambda崩溃,因为它没有安装pymysql模块。如果要使用依赖项,请创建一个lambda部署程序包。
答案 1 :(得分:0)
当您在CloudFormation中部署自定义资源并且未能正确捕获错误时,鉴于Lambda调用失败,CloudFormation资源将在定义的超时时间(默认值:1小时)内保持“ CREATE_IN_PROGRESS”状态。时间。
您可以在部署Lambda并当场“修复”之后很快,以便当CloudFormation调用Lambda时不会返回错误,或者如果您来不及(尝试3次):修复Lambda功能并取消堆栈更新。回滚还会调用Lambda。如果Lambda损坏,那么这还将花费定义的超时时间。
如果您错过了所有机会,回滚将失败。您将必须继续回滚以保留失败的资源。
提示:定义合理的CFN超时;-)