当我尝试在 CloudFormation 中创建或更新堆栈时,如何解决“内部故障”错误?

2 分钟阅读
0

我想解决 AWS CloudFormation 中的“内部故障”错误。

简短描述

当您创建或更新 CloudFormation 堆栈时,如果在某个资源上的操作失败,您可能会收到“内部故障”错误。如果堆栈部署失败,您也可能会收到此错误。

在资源上的操作可能因下列原因而失败:

  • 资源或属性的设置值不正确。要解决此问题,请执行部署测试堆栈以查找不正确的资源或属性值部分描述的步骤。
  • 内部工作流失败。要使用 AWS CloudTrail 解决此问题,请执行在 CloudTrail 事件日志中查找失败的 API 操作部分描述的步骤。

最后,如果您传递到 CloudFormation 模板输出部分的值不正确,堆栈的部署可能会失败。要解决此错误,请执行检查 CloudFormation 模板“输出”部分的值部分中的步骤。

注意: 以下步骤仅适用于您尝试在 CloudFormation 中创建或更新堆栈时收到的“内部故障”错误。

解决方法

部署测试堆栈以查找不正确的资源或属性值

要查找不正确的资源特性或属性值,请使用一个仅包含故障资源的 CloudFormation 模板部署一个测试堆栈。

如果测试堆栈部署成功,则执行在 CloudTrail 事件日志中查找失败的 API 操作部分描述的步骤。

如果测试堆栈部署失败,则继续从测试堆栈中移除不需要的特性和属性,直到您找到不正确的值为止。

在下面的示例情景中,当 CloudFormation 尝试使用 AWS Config 创建一个 AWS::Config::ConformancePack 资源时,您会收到“内部故障”错误。由于 DeliveryS3Bucket 属性使用的语法不正确,因此您收到错误讯息。DeliveryS3Bucket 属性仅接受将存储桶名称作为值(例如: bucketname)。包含存储桶名称的文件路径不是可接受的值(例如: s3://bucketname)。

AWSTemplateFormatVersion: 2010-09-09
Resources:
  CloudFormationCanaryPack:
    Type: AWS::Config::ConformancePack
    Properties:
      ConformancePackName: ConformancePackName
      DeliveryS3Bucket: s3://bucketname            # Incorrect value for DeliveryS3Bucket
      TemplateS3Uri: s3://bucketname/prefix

在 CloudTrail 事件日志中查找失败的 API 操作

1.    打开 CloudTrail 控制台

2.    在导航窗格中,选择事件历史记录

3.    对于时间范围,输入一个时间范围来隔离失败的 API 调用,然后选择应用

提示: 对于开始时间,请输入您的 CloudFormation 堆栈中资源进入 CREATE_IN_PROGRESS 或 UPDATE_IN_PROGRESS 状态的时间。对于结束时间,请输入 API 调用失败的时间。

4.    要在事件历史记录中的默认事件显示以外进行搜索,请使用属性筛选器

注意: 默认情况下,事件历史记录使用设为 false只读筛选器。只读筛选器结果仅显示 API 活动的写入事件,并从显示的事件列表中排除只读事件。

您可以使用 EventName 按返回的事件名称进行筛选。如果您了解用于创建或更新资源的 API 操作,则只能对特定 API 调用使用 EventName 筛选器。例如,CloudFormation 堆栈将于创建 AWS::Config::ConformancePack 资源时使用 AWS Config API 操作 PutConformancePack。这意味着您只能筛选 PutConformancePack API。您可以使用 EventSource 按发出 API 请求的 AWS 服务进行筛选。这意味着您可以滚动浏览事件源列表,然后选择 CloudFormation 模板中使用的适当资源。

5.    要确定发生故障的根本原因,请检查所返回事件的错误消息。

注意: 某些 API 操作故障需要您更新原始 CloudFormation 模板,然后再执行测试部署以确认错误得到解决。

检查 CloudFormation 模板“输出”部分的值

在 CloudFormation 模板中,确认输出部分中的值不含语法错误。例如,删除任何结尾空格。

如果您检索使用动态引用的资源属性,则必须确认属性在堆栈部署期间可用。要模拟 CloudFormation 的这一输出,请执行以下操作:

1.    对具有失败属性的资源类型发起 Create* 或 Update* API 调用(创建或修改)。

2.    在堆栈创建或更新过程中发起 Describe* API 调用以检索资源的当前属性。

下面的示例情景演示了将 AWS::DMS::ReplicationInstance 资源的 ReplicationInstancePrivateIpAddresses 属性传递到输出时堆栈将返回的内部错误。

在下例中,实例的私有 IP 属性仅在 ReplicationInstance 资源的状态已切换到可用后才可用。如果在处理输出时,ReplicationInstance 未处于可用状态,CloudFormation 堆栈将无法检索到该私有 IP 属性。部署也会因此失败。

AWSTemplateFormatVersion: 2010-09-09
Resources:
  BasicReplicationInstance:
    Type: AWS::DMS::ReplicationInstance
    Properties:
      ReplicationInstanceClass: dms.t2.small
Outputs:
  DmsInstanceIP:
    Value: !GetAtt BasicReplicationInstance.ReplicationInstancePrivateIpAddresses

相关信息

AWS CloudFormation 问题排查

使用 CloudTrail 事件历史记录查看事件

AWS 官方
AWS 官方已更新 3 年前