处理 Elastic Transcoder 中的错误 - Amazon Elastic Transcoder

通过以下方式节省成本并获得更多功能 AWS Elemental MediaConvert

MediaConvert 是一项较新的基于文件的视频转码服务,它提供了一套全面的高级转码功能,按需费率起价为每分钟 0.0075 美元。阅读更多

已经在使用 Amazon Elastic Transcoder? 迁移到很简单 MediaConvert。有关更多信息,请参阅本概述,其中包含有关迁移过程的重要信息以及指向其他资源的链接。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

处理 Elastic Transcoder 中的错误

当您通过 Elastic Transcoder API 发送请求和获取响应时,可能会遇到两种 API 错误:

  • 客户端错误:客户端错误由 4xx 形式的 HTTP 响应代码表示。客户端错误表明 Elastic Transcoder 发现客户端请求存在问题,例如身份验证失败或缺少必需参数。请修复客户端应用程序中存在的问题后再重新提交请求。

  • 服务器错误:服务器错误由 5xx 形式的 HTTP 响应代码表示,这种错误需要由 Amazon 解决。您可以重新提交/重试请求,直到操作成功。

对于每个 API 错误,Elastic Transcoder 将返回以下值:

  • 状态代码(例如,400

  • 错误代码(例如,ValidationException

  • 错误消息(例如,Supplied AttributeValue is empty, must contain exactly one of the supported datatypes

有关 Elastic Transcoder 针对客户端错误和服务器错误返回的错误代码的列表,请参阅 API 错误代码(客户端错误和服务器错误)

此外,Elastic Transcoder 处理您的任务时可能会遇到错误。有关更多信息,请参见 处理任务过程中出现错误

API 错误代码(客户端错误和服务器错误)

HTTP 状态代码可以指明某一操作是否成功。

如果响应代码为 200,则表明操作成功。其他错误代码表示客户端错误 (4xx) 或服务器错误 (5xx)。

下表列出了 Elastic Transcoder 返回的错误。某些错误只需重试同一请求即可解决。此表中会指出哪些错误只需连续重试就有可能解决。如果“重试”列的值为:

  • :再次提交同一请求。

  • :修复客户端的问题,然后再提交新请求。

有关重试请求的更多信息,请参阅 错误重试和指数回退

HTTP 状态代码 错误代码 消息 原因 重试
400 条件检查失败异常 有条件请求失败。 示例:预期值与系统中存储的值不匹配。
400 签名不完整异常 请求签名不符合 AWS 标准。 请求中的签名未包含所有必需的组件。请参阅 HTTP 标头内容
403 缺少身份验证令牌异常 请求必须包含有效(已注册)的 AWS 访问密钥 ID。 请求未包含所需的 x-amz-security-token。请参阅 向 Elastic Transcoder 发出 HTTP 请求
400 验证异常 多种。 请求中的一个或多个值缺失或无效;例如,值为空或大于最大有效值。
403 访问被拒绝异常
  • 不允许删除系统预设:账户=<accountId>,预设 ID=<presetId>。

  • 常规身份验证失败。客户端未正确签名请求。请参阅 签名请求

您尝试删除系统预设,Elastic Transcoder API 调用中的签名无效,或用户的凭证未获得执行该操作的授权。

404 找不到资源异常
  • 找不到指定的 <resource>:<resourceId>。

  • 找不到指定的任务:账户=<accountId>,任务 ID=<jobId>。

  • 找不到指定的管道:账户=<accountId>,管道 ID=<pipelineId>

  • 找不到指定的预设:账户=<accountId>,预设 ID=<presetId>

示例:您尝试为其添加任务的管道不存在或仍在创建中。
409 资源使用中异常
  • <resource> 已在使用中:账户 ID=<accountId>,资源 ID=<resourceId>。

  • 管道包含活动任务:账户=<accountId>,管道=<pipelineId>。

示例:您尝试删除当前正在使用中的管道。
429 超出限制异常
  • 账户已具有允许的最大数量的管道:账户=<accountId>,管道的最大数量=<maximum>

  • 账户已具有允许的最大数量的预设:账户=<accountId>,预设的最大数量=<maximum>

  • 账户中已存在缓冲区中每个管道的最大数量任务:账户=<accountId>,缓冲区中管道的最大数量任务=<maximum>

当前 AWS 账户已超出 Elastic Transcoder 对象的限制。有关更多信息,请参见 Elastic Transcoder 管道、任务和预设的数量限制
429 超出预配置吞吐量异常 超出预配置吞吐量上限。

示例:您的请求速率过高。Elastic Transcoder 的 AWS 开发工具包会自动对收到此异常的请求进行重试。除非您的重试队列太长以致无法完成,您的请求最终都会成功。请降低请求频率。有关更多信息,请参见 错误重试和指数回退

如果您通过轮询来确定请求的状态,请考虑使用通知来确定状态。有关更多信息,请参见 任务状态通知

429 限制异常 请求速率超出吞吐量上限。

您提交请求的速度太快;例如,创建新任务的请求。

如果您通过轮询来确定请求的状态,请考虑使用通知来确定状态。有关更多信息,请参见 任务状态通知

500 内部故障 服务器在尝试完成请求时遇到内部错误。 服务器在处理您的请求时遇到错误。
500 内部服务器错误 服务器在尝试完成请求时遇到内部错误。 服务器在处理您的请求时遇到错误。
500 内部服务异常 服务在尝试完成请求时遇到意外异常。
500 服务不可用异常 服务目前不可用或繁忙。 服务器在处理您的请求时出现意外错误。

错误响应示例

下面是一个 HTTP 响应,它表示 inputBucket 的值为 null (非有效值)。

HTTP/1.1 400 Bad Request x-amzn-RequestId: b0e91dc8-3807-11e2-83c6-5912bf8ad066 x-amzn-ErrorType: ValidationException Content-Type: application/json Content-Length: 124 Date: Mon, 26 Nov 2012 20:27:25 GMT {"message":"1 validation error detected: Value null at 'inputBucket' failed to satisfy constraint: Member must not be null"}

处理任务过程中出现错误

当 Elastic Transcoder 在处理任务过程中遇到错误时,它会通过两种方式报告错误:

  • 任务状态和输出状态:Elastic Transcoder 会将失败输出的 Job:Status 对象和 Outputs:Status 对象设置为 Error。此外,Elastic Transcoder 会将失败输出的 Outputs:StatusDetail JSON 对象设置为用于说明故障的值。

  • SNS 通知:如果您将管道配置为 Elastic Transcoder 在处理过程中遇到错误时发送 SNS 通知,Elastic Transcoder 会在通知中使用以下格式包含一个 JSON 对象:

    { "state" : "PROGRESSING|COMPLETED|WARNING|ERROR", "errorCode" : "the code of any error that occurred", "messageDetails" : "the notification message you created in Amazon SNS", "version" : "API version that you used to create the job", "jobId" : "value of Job:Id object that Elastic Transcoder returns in the response to a Create Job request", "pipelineId" : "value of PipelineId object in the Create Job request", "input" : { job Input settings }, "outputKeyPrefix" : "prefix for file names in Amazon S3 bucket", "outputs": [ { applicable job Outputs settings, "status" : "Progressing|Complete|Warning|Error" }, {...} ], "playlists": [ { applicable job playlists settings } ], "userMetadata": { "metadata key": "metadata value" } }
errorCode 的值 messageDetails 的值 原因
1000 验证错误 在处理任务时,Elastic Transcoder 确定请求中的一个或多个值无效。
1001 依赖性错误 Elastic Transcoder 无法生成播放列表,因为它的一个或多个播放列表依赖项遇到错误。
2000 无法代入角色 Elastic Transcoder 无法代入在管道的 AWS Identity and Access Management 对象中为该任务指定的 Role 角色。
3000 未分类存储错误
3001 输入不存在 不存在具有您在该任务的 Input:Key 对象中指定的名称的文件。该文件必须存在于在管道的 InputBucket 对象中为该任务指定的 Amazon S3 存储桶中。
3002 输出已存在 已存在具有您在该任务的 Outputs:Key(或 Output:Key)对象中指定的名称的文件。该文件不能存在于在管道的 OutputBucket 对象中为该任务指定的 Amazon S3 存储桶中。
3003 没有读取权限 在用于该任务的管道的 Role 对象中所指定的 IAM 角色没有读取其中包含要转码的文件的 Amazon S3 存储桶的权限。
3004 没有写入权限 在用于该任务的管道的 Role 对象中所指定的 IAM 角色没有要在其中保存已转码文件或缩略图文件的 Amazon S3 存储桶的写入权限。
3005 存储桶不存在 指定的 S3 存储桶不存在:存储桶={1}。
3006 没有写入权限 Elastic Transcoder 无法将密钥={1} 写入到存储桶={2} 中,因为密钥与存储桶不在相同区域中
4000 错误输入文件 您在该任务的 Input:Key 对象中所指定文件的格式当前不受 Elastic Transcoder 的支持。
4001 错误输入文件 您在该任务的 Input:Key 对象中所指定文件的宽度 x 高度超出允许的最大宽度 x 高度。
4002 错误输入文件 您在该任务的 Input:Key 对象中所指定文件的文件大小超出允许的最大文件大小。
4003 错误输入文件 Elastic Transcoder 无法解释您在该任务的其中一个 Outputs:Watermarks:InputKey 对象中指定的文件。
4004 错误输入文件 您在该任务的其中一个 Outputs:Watermarks:InputKey 对象中所指定文件的宽度 x 高度超出允许的最大宽度 x 高度。
4005 错误输入文件 您为其中一个 {1} 对象指定的文件的大小超出允许的最大大小:存储桶={2},密钥={3},大小={4},最大大小={5}。
4006 错误输入文件 Elastic Transcoder 无法将输入文件转码,因为格式不受支持。
4007 未处理的输入文件 Elastic Transcoder 遇到通常支持的文件类型,但无法正确处理该文件。此错误会自动打开一个支持案例,我们已开始研究问题的原因。
4008 错误输入文件

该问题的根本原因是预设和输入文件不匹配。示例包括:

  • 预设包括音频设置,但输入文件缺少音频。

  • 预设包括视频设置,但输入文件缺少视频。

4009 错误输入文件 Elastic Transcoder 无法将所有专辑封面插入输出文件中,因为已超出最大数量的艺术作品流。
4010 错误输入文件 Elastic Transcoder 无法解释您为 AlbumArt:Artwork:InputKey 指定的图像文件。
4011 错误输入文件 Elastic Transcoder 检测到嵌入式艺术作品流,但无法解释它。
4012 错误输入文件 AlbumArt:Artwork 指定的图像超出允许的最大宽度 x 高度:4096 x 3072。
4013 错误输入文件 嵌入式插图的宽度 x 高度超出允许的最大宽度 x 高度:4096 x 3072。
4014 错误输入 为剪辑开始时间指定的值晚于输入文件的结束时间。Elastic Transcoder 无法创建输出文件。
4015 错误输入 Elastic Transcoder 无法生成清单文件,因为生成的段不匹配。
4016 错误输入 Elastic Transcoder 无法使用 {2} 将来自 {1} 的输入文件解密。
4017 错误输入 AES 密钥使用 {2} 位加密密钥进行加密。AES 仅支持 128、192 和 256 位加密密钥。MD5={1}。
4018 错误输入 Elastic Transcoder 无法使用 MD5={1} 将密码密钥解密
4019 错误输入 Elastic Transcoder 无法使用 KMS 密钥 ARN {0} 生成数据密钥。
4020 错误输入 进行 AES-128 加密时,您的密钥必须是 128 位。MD5={1},{2} 位。
4021 错误输入 对于 PlayReady DRM,您的密钥必须是 128 位。MD5={1},强度={2} 位。
4022 错误输入 {1} 所指定媒体文件的组合大小超出允许的最大大小:存储桶={2},大小={3}。
4023 错误输入 指定要联接的 {1} 输入文件不会使用与指定预设一致的分辨率创建输出。使用具有不同 PaddingPolicySizingPolicyMaxWidthMaxHeight 设置的预设。
4024 错误输入 指定要联接的 {1} 输入文件不会使用与指定预设一致的分辨率创建缩略图。使用具有不同缩略图 PaddingPolicySizingPolicyMaxWidthMaxHeight 设置的预设。
4025 错误输入 至少有一个媒体文件(输入 #{1})与其他文件不匹配。所有媒体文件必须都包含视频或都不包含视频。
4026 错误输入 至少有一个媒体文件(输入 #{1})与其他文件不匹配。所有媒体文件必须都包含音频或都不包含音频。
4100 错误输入文件 Elastic Transcoder 检测到嵌入的字幕轨迹,但无法解释它。
4101 错误输入文件 Elastic Transcoder 无法解释为 Amazon S3 存储桶={1}、密钥={2} 指定的字幕文件。
4102 错误输入文件 Elastic Transcoder 无法解释指定的字幕文件,因为它不是 UTF-8 编码:Amazon S3 存储桶={1},密钥={2}。
4103 错误输入文件 Elastic Transcoder 无法处理所有字幕轨迹,因为已超出字幕轨迹的最大数量 {1}。
4104 错误输入文件 Elastic Transcoder 无法生成主播放列表,因为所需的输出包含 {1} 个嵌入式字幕,而最大值为 4。
4105 错误输入文件 Elastic Transcoder 无法嵌入字幕轨迹,因为对于 CEA-708 不支持帧速率 {1},仅支持帧速率 [29.97, 30]。
4106 错误输入文件 Elastic Transcoder 无法嵌入字幕轨迹,因为格式 {1} 仅支持 {2} 个字幕轨迹。
9000 内部服务错误
9001 内部服务错误
9999 内部服务错误

抓取错误

为了让您的应用程序平稳运行,您需要构建逻辑以捕获和响应错误。一种典型的方法是在 try 数据块或 if-then 语句中实施您的请求。

AWS 开发工具包自己也会重试和检查错误。如果您在使用某个 AWS 开发工具包时遇到错误,则您将会看到错误代码和错误描述。您还会看到一个 Request ID 值。Request ID 值可以帮助 Elastic Transcoder 支持人员排除错误。

以下示例使用适用于 Java 的 AWS SDK 删除 try 数据块中的一个项目,并使用 catch 数据块就错误给出响应。在本示例中,系统会发出请求失败的警告。该示例使用 AmazonServiceException 类检索有关操作错误的信息(包括 Request ID)。该示例还使用了 AmazonClientException 类,以处理请求因其他原因失败的情况。

try { DeleteJobRequest request = new DeleteJobRequest(jobId); DeleteJobResult result = ET.deleteJob(request); System.out.println("Result: " + result); // Get error information from the service while trying to run the operation } catch (AmazonServiceException ase) { System.err.println("Failed to delete job " + jobId); // Get specific error information System.out.println("Error Message: " + ase.getMessage()); System.out.println("HTTP Status Code: " + ase.getStatusCode()); System.out.println("AWS Error Code: " + ase.getErrorCode()); System.out.println("Error Type: " + ase.getErrorType()); System.out.println("Request ID: " + ase.getRequestId()); // Get information in case the operation is not successful for other reasons } catch (AmazonClientException ace) { System.out.println("Caught an AmazonClientException, which means"+ " the client encountered " + "an internal error while trying to " + "communicate with Elastic Transcoder, " + "such as not being able to access the network."); System.out.println("Error Message: " + ace.getMessage()); }

错误重试和指数回退

网络上的大量组件 (例如 DNS 服务器、交换机、负载均衡器等) 都可能在某个指定请求生命周期中的任一环节出现问题。

在联网环境中,处理这些错误响应的常规技术是在客户应用程序中实施重试。该技术可以提高应用程序的可靠性和降低开发人员的操作成本。

每个支持 Elastic Transcoder 的 AWS SDK 都将实施自动重试逻辑。适用于 Java 的 AWS SDK 会自动重试请求,您可以使用 ClientConfiguration 类配置重试设置。例如,有时候网页发出的请求采用最低延迟并且不想重试,您可能会希望关闭重试逻辑。您可以使用 ClientConfiguration 类,并且为 maxErrorRetry 提供 0 值,从而设置为不重试。

如果您没有使用 AWS SDK,则应当对收到服务器错误 (5xx) 的原始请求执行重试。但是,客户端错误(4xx,不是 ThrottlingExceptionProvisionedThroughputExceededException)表示您需要对请求本身进行修改,先修正了错误然后再重试。

注意

如果您通过轮询来确定请求的状态,并且 Elastic Transcoder 正在返回 HTTP 状态代码 429,错误代码为 Provisioned Throughput Exceeded ExceptionThrottling Exception,请考虑使用通知而不是轮询来确定状态。有关更多信息,请参见 任务状态通知

除了简单重试之外,我们还建议使用指数回退算法来实现更好的流程控制。指数回退的原理是对于连续错误响应,重试等待间隔越来越长。例如,您可能会允许经过 1 秒后进行第一次重试,经过 4 秒后进行第二次重试,经过 16 秒后进行第三次重试,以此类推。但是,如果一分钟后请求未成功,则问题可能在于硬限制而不是请求速率。例如,您可能已达到允许的最大管道数量。您可以设置最大重试次数,在大约一分钟的时候停止重试。

以下是显示重试逻辑的一个工作流程。该工作流程逻辑首先确定遇到的是不是服务器错误 (5xx)。如果遇到的是服务器错误,代码就会重试原始请求。

currentRetry = 0 DO set retry to false execute Elastic Transcoder request IF Exception.errorCode = ProvisionedThroughputExceededException set retry to true ELSE IF Exception.httpStatusCode = 500 set retry to true ELSE IF Exception.httpStatusCode = 400 set retry to false fix client error (4xx) IF retry = true wait for (2^currentRetry * 50) milliseconds currentRetry = currentRetry + 1 WHILE (retry = true AND currentRetry < MaxNumberOfRetries) // limit retries