如何解决 AWS CloudFormation 中的“内部故障”错误?

上次更新时间:2020 年 6 月 23 日

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

简短描述

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

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

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

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

解决方法

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

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

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

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

在下面的示例情景中,当 AWS 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 调用,然后选择应用

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

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

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

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

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

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

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

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

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

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

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

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?