Amazon web services 为什么自定义资源未能在AWS Cloudformation中的预期时间内稳定下来?

Amazon web services 为什么自定义资源未能在AWS Cloudformation中的预期时间内稳定下来?,amazon-web-services,aws-lambda,amazon-cloudformation,aws-cloudformation-custom-resource,Amazon Web Services,Aws Lambda,Amazon Cloudformation,Aws Cloudformation Custom Resource,我希望使用CloudFormation创建一个新的自定义资源,以获得当前日期减去X天的结果,当我创建lambda函数时,我获得错误: 资源未能在预期时间内稳定 我的代码是: AWST模板格式版本:2010-09-09 参数: 环境: 说明:环境 类型:字符串 默认值:dev 允许值: -发展 -试验 -刺激 -sbx DaysToSubstract: 描述:使用RedshiftLoader减去天数以计算摄取日期 类型:编号 默认值:1 资源: LambdateredShiftLoader: 类型

我希望使用CloudFormation创建一个新的自定义资源,以获得当前日期减去X天的结果,当我创建lambda函数时,我获得错误:

资源未能在预期时间内稳定

我的代码是:

AWST模板格式版本:2010-09-09
参数:
环境:
说明:环境
类型:字符串
默认值:dev
允许值:
-发展
-试验
-刺激
-sbx
DaysToSubstract:
描述:使用RedshiftLoader减去天数以计算摄取日期
类型:编号
默认值:1
资源:
LambdateredShiftLoader:
类型:“AWS::Lambda::Function”
德彭森:
-LambdateredShiftlLoaderRole
特性:
代码:
齐普菲尔:!潜艇|
从日期时间导入日期,时间增量
进口CFN应答
def lambda_处理程序(事件、上下文):
当前_delta=date.today()-timedelta(days=event['DaysToSubstract'])
current_delta_str=current_delta.strftime(“%Y-%m-%d”)
responseData['Dates']=当前的_delta_str
发送(事件、上下文、cfnresponse.SUCCESS、响应数据)
环境:
变量:
DaysToSubstract:!子“${DaysToSubstract}”
说明:>-
计算昨天日期以获取加载数据的开始和结束日期
带红移装载机
处理程序:index.lambda\u处理程序
记忆化:128
角色:!GetAtt lambdataredshiftloaderrole.Arn
运行时:python3.7
超时时间:30
LambdateredShiftLoaderRole:
类型:“AWS::IAM::角色”
特性:
罗莱娜:!子'a3m${Environment}-datesRL lambda角色'
假设政策文件:
版本:2012-10-17
声明:
-行动:
-“sts:假设角色”
效果:允许
负责人:
服务:
-lambda.amazonaws.com
路径:/service角色/
政策:
-保单名称:!子'a3m${Environment}-lambda datesRL lambda日志策略'
政策文件:
版本:2012-10-17
声明:
-行动:
-'日志:CreateLogGroup'
-'日志:CreateLogStream'
-“日志:PutLogEvents”
效果:允许
资源:
- !Sub>-
arn:aws:logs:eu-west-1:${aws::AccountId}:log group:/aws/lambda/lambda datesRL uyc:*
拉姆达尔:
类型:“自定义::值”
特性:
ServiceToken:!GetAtt LambdaateredShiftLoader.Arn
产出:
LambdaFunction输出:
值:!GetAtt lambdaRL.日期
说明:Lambda函数返回值(日期减去x天)
我正在使用
cfnresponse
成功
并使用
!输出中的GetAtt lambdaRL.Dates


提前感谢您

您的Lambda函数出现错误,因此它从未有机会调用
cfnresponse.send()
。这意味着CloudFormation一直在等待响应

以下是Lambda函数的更新版本:

from datetime导入日期,timedelta
导入CFN响应,操作系统
def lambda_处理程序(事件、上下文):
当前_delta=date.today()-timedelta(days=int(os.environ['DaysToSubtract']))
current_delta_str=current_delta.strftime(“%Y-%m-%d”)
响应数据={}
responseData['Dates']=当前的_delta_str
发送(事件、上下文、cfnresponse.SUCCESS、响应数据)
问题是:

  • 环境变量通过
    os.environ()
    ,而不是
    event()
  • DaysToSubtract
    值是作为
    string
    而不是
    int
    传递的,因此
    timedelta()
    函数失败(小心拼写
    Substract
    Subtract
  • responseData
    字典未初始化,因此它给出了一个
    NameError:name'responseData'未定义
    错误
我强烈建议您首先在控制台中开发Lambda功能。然后,在它们工作后,将它们移动到CloudFormation模板中。这使得调试更加容易

哦,还请注意,当创建、更新和删除堆栈时,会调用自定义资源。这可能会导致一些意外行为,尤其是在
Delete
操作期间。通常最好插入
if
语句,以便仅在
Create
阶段使用以下命令运行代码:

如果事件['RequestType']='Create':

是否存在lambda出现故障的CloudWatch日志错误?