我想解决 AWS CloudFormation 中的自定义资源错误。
简短描述
自定义资源出现故障是因为与该资源关联的 AWS Lambda 函数在运行时遇到了问题。然后,自定义资源会向 CloudFormation 发送 FAILED(失败)状态。
当 CloudFormation 在预期的时间范围内未收到来自自定义资源的响应且超时时,自定义资源也会出现故障。
要对自定义资源问题进行故障排除,请运行 AWSSupport-TroubleshootCFNCustomResource 运行手册,或者手动对 CloudFormation 堆栈进行故障排除。
对于 Lambda 自定义资源,运行手册会检查 Lambda 是否能够访问 Amazon Simple Storage Service (Amazon S3),以便向 CloudFormation 发送响应。发送到 CloudFormation 的响应会检查 Lambda 网络配置和安全组。
解决方法
运行 AWSSupport-TroubleshootCFNCustomResource 运行手册
在开始之前,请确保您的 AWS Identity and Access Management (IAM) 用户或角色具有所需的 IAM 权限。
要运行自动化,请完成以下步骤:
- 打开 AWS Systems Manager 控制台。
- 在导航窗格中,选择 Documents(文档)。
- 在搜索栏中,输入 AWSSupport-TroubleshootCfnCustomResource。
- 选择 AWSSupport-TroubleshootCfnCustomResource 文档。
- 选择 Execute automation(执行自动化)。
- 对于输入参数,输入以下内容:
(可选)AutomationAssumeRole。输入允许 Automation(AWS Systems Manager 的一项功能)代表您执行操作的 IAM 角色的 ARN。如果您未指定角色,则 Automation 将使用启动运行手册的用户的权限。
StackName。输入自定义资源出现故障的 CloudFormation 堆栈的名称。
- 选择 Execute(执行)。
- 查看 Outputs(输出)部分,以获取以下详细的结果:
validateCloudFormationStack 步骤会验证 CloudFormation 堆栈是否存在于同一 AWS 账户和 AWS 区域中。
checkCustomResource 步骤会分析 CloudFormation 堆栈,检查出现故障的自定义资源,并提供有关如何对故障的自定义资源进行故障排除的信息。
手动对 CloudFormation 堆栈进行故障排除
查看 Amazon CloudWatch 日志
完成以下步骤:
- 打开 CloudFormation 控制台。
- 选择失败的堆栈,然后选择 Resources(资源)选项卡,以获取与该自定义资源关联的 Lambda 函数的物理 ID。
- 选择您的 Lambda 函数。
- 选择 Monitor(监控)选项卡,然后选择 View CloudWatch logs(查看 CloudWatch 日志)。
如果在 CloudFormation 回滚期间删除了 Lambda 函数,则日志组可能仍包含 CloudWatch 日志。
要获取日志,请完成以下步骤:
- 打开 CloudWatch 控制台。
- 在导航窗格中,选择 Log groups(日志组)。
- 在搜索字段中,运行以下命令:
/aws/lambda/LambdaPhysicalName
**注意:**请将 LambdaPhysicalName 替换为您的 Lambda 函数的名称。
如果找不到日志,请关闭回滚功能并重新部署堆栈,以对 Lambda 函数的行为进行故障排除。
对潜在的失败原因进行故障排除
解决“失败”状态
您可能会收到以下错误消息:
“从自定义资源收到“失败”的响应状态。返回了消息: <reason here>。”
当与自定义资源关联的 Lambda 函数遇到问题,且已设置异常处理逻辑时,您会收到上述错误消息。
要对此问题进行故障排除,请查看错误消息和 Lambda 的 CloudWatch 日志中包含的失败原因。
CloudFormation 未收到响应
堆栈失败是因为 CloudFormation 未收到来自自定义资源的响应。
要解决此问题,请执行以下操作:
-
确保您在自定义资源的 Lambda 函数中正确使用了 cfn-response module 模块,以向 CloudFormation 堆栈发送响应。
-
查看 CloudWatch 日志,以确定代码运行时是否出现错误。
-
增加 Lambda 函数的超时设置,以便该函数有足够的时间完成任务。您可以设置的最大时间为 15 分钟。
-
如果您的 Lambda 函数位于虚拟私有云 (VPC) 中,请确认它位于子网中。该子网必须允许通过 NAT 网关的出站流量。该子网还必须路由到 Amazon S3 端点访问,以便自定义资源可以访问预签名的 Amazon S3 URL。
-
如果响应在超时后发送,请检查您的 Lambda 指标,查看同一区域中是否存在大量的并发函数执行。要减少超时,请为您的函数使用预留的并发。
-
如果您的堆栈一直处于 IN PROGRESS(正在进行)状态,直到自定义资源超时,请使用 cURL 发出直接的 HTTP 请求。如果发出直接请求,有可能会避免出现超时。
curl 命令示例:
curl -H 'Content-Type: ''' -X PUT -d '{ "Status": "SUCCESS", "PhysicalResourceId": "test-CloudWatchtrigger-1URTEVUHSKSKDFF",
"StackId": "arn:aws:cloudformation:us-east-1:111122223333:stack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2
",
"RequestId": "e2fc8f5c-0391-4a65-a645-7c695646739",
"LogicalResourceId": "CloudWatchtrigger"
}' 'https://cloudformation-custom-resource-response-useast1.s3.us-east-1.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A111122223333%3Astack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2%7CMyCustomResource%7Ce2fc8f5c-0391-4a65-a645-7c695646739?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20170313T0212304Z&X-Amz-SignedHeaders=host&X-Amz-Expires=7200&X-Amz-Credential=QWERTYUIOLASDFGBHNZCV%2F20190415%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=dgvg36bh23mk44nj454bjb54689bg43r8v011uerehiubrjrug5689ghg94hb
'
注意:要发出请求,必须包含请求对象的详细信息。您可以在 CloudWatch 日志中找到 RequestID 和 Amazon S3 预签名 URL。有关详细信息,请参阅如何删除 CloudFormation 中卡在 DELETE_FAILED 状态或 DELETE_IN_PROGRESS 状态的 Lambda 支持的自定义资源?
相关信息
运行简单的自动化(控制台)
设置自动化
Systems Manager Automation 运行手册参考
使用 CloudFormation 实施由 Lambda 支持的自定义资源有哪些最佳实践?