跳至内容

如何解决 AWS CloudFormation 中的自定义资源故障?

2 分钟阅读
0

我想解决 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 权限

要运行自动化,请完成以下步骤:

  1. 打开 AWS Systems Manager 控制台
  2. 在导航窗格中,选择 Documents(文档)。
  3. 在搜索栏中,输入 AWSSupport-TroubleshootCfnCustomResource
  4. 选择 AWSSupport-TroubleshootCfnCustomResource 文档。
  5. 选择 Execute automation(执行自动化)。
  6. 对于输入参数,输入以下内容:
    (可选)AutomationAssumeRole。输入允许 Automation(AWS Systems Manager 的一项功能)代表您执行操作的 IAM 角色的 ARN。如果您未指定角色,则 Automation 将使用启动运行手册的用户的权限。
    StackName。输入自定义资源出现故障的 CloudFormation 堆栈的名称。
  7. 选择 Execute(执行)。
  8. 查看 Outputs(输出)部分,以获取以下详细的结果:
    validateCloudFormationStack 步骤会验证 CloudFormation 堆栈是否存在于同一 AWS 账户和 AWS 区域中。
    checkCustomResource 步骤会分析 CloudFormation 堆栈,检查出现故障的自定义资源,并提供有关如何对故障的自定义资源进行故障排除的信息。

手动对 CloudFormation 堆栈进行故障排除

查看 Amazon CloudWatch 日志

完成以下步骤:

  1. 打开 CloudFormation 控制台
  2. 选择失败的堆栈,然后选择 Resources(资源)选项卡,以获取与该自定义资源关联的 Lambda 函数的物理 ID。
  3. 选择您的 Lambda 函数。
  4. 选择 Monitor(监控)选项卡,然后选择 View CloudWatch logs(查看 CloudWatch 日志)。

如果在 CloudFormation 回滚期间删除了 Lambda 函数,则日志组可能仍包含 CloudWatch 日志。

要获取日志,请完成以下步骤:

  1. 打开 CloudWatch 控制台
  2. 在导航窗格中,选择 Log groups(日志组)。
  3. 在搜索字段中,运行以下命令:
    /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 支持的自定义资源有哪些最佳实践?