客户端错误:
客户端错误由 4xx 形式的 HTTP 响应代码表示。客户端错误表明 Elastic Transcoder 发现了客户端请求的问题,例如身份验证失败或缺少必需的参数。请修复客户端应用程序中存在的问题后再重新提交请求。
服务器错误:
服务器错误由 5xx 形式的 HTTP 响应代码表示,这种错误需要由 Amazon 解决。您可以重新提交/重试请求,直到操作成功。
对于每个 API 错误,Elastic Transcoder 都会返回以下值:
错误消息 (例如,
Supplied AttributeValue is empty, must
contain exactly one of the supported datatypes
)
有关 Elastic Transcoder 针对客户端和服务器错误返回的错误代码列表,请参阅
API 错误代码 (客户端错误和服务器错误)
。
此外,您可能在 Elastic Transcoder 处理您的任务时遇到错误。有关更多信息,请参阅
处理任务过程中出现错误
:
API 错误代码 (客户端错误和服务器错误)
HTTP 状态代码可以指明某一操作是否成功。
如果响应代码为
200
,则表明操作成功。其他错误代码表示客户端错误 (4xx) 或服务器错误 (5xx)。
下表列出了 Elastic Transcoder 返回的错误。某些错误只需重试同一请求即可解决。此表中会指出哪些错误只需连续重试就有可能解决。如果“重试”列的值为:
缺少身份验证令牌异常
请求中必须包含有效 (已注册) 的 AWS 访问密钥 ID。
请求未包含所需的
x-amz-security-token
。请参阅
向 Elastic Transcoder 发出 HTTP 请求
。
请求中的一个或多个值缺失或无效;例如,值为空或大于最大有效值。
AccessDenied 例外
<resource> 已在使用中:账户 ID=<accountId>,资源 ID=<resourceId>。
管道包含活动任务:账户=<accountId>,管道=<pipelineId>。
示例:您尝试删除当前正在使用中的管道。
超出限制异常
账户已具有允许的最大数量的管道:账户=<accountId>,管道的最大数量=<maximum>
账户已具有允许的最大数量的预设:账户=<accountId>,预设的最大数量=<maximum>
账户中已存在缓冲区中每个管道的最大数量任务:账户=<accountId>,缓冲区中管道的最大数量任务=<maximum>
当前 AWS 账户已超过 Elastic Transcoder 对象的限制。有关更多信息,请参阅
对Elastic Transcoder 管道、作业和预设数量的限制
:
超出预配置吞吐量异常
超出预配置吞吐量上限。
示例:您的请求速率过高。适用于 Elastic Transcoder 的 AWS SDK 自动重试收到此异常的请求。除非您的重试队列太长以致无法完成,您的请求最终都会成功。请降低请求频率。有关更多信息,请参阅
错误重试和指数回退
:
如果您通过轮询来确定请求的状态,请考虑使用通知来确定状态。有关更多信息,请参阅
任务状态通知
:
请求速率超出吞吐量上限。
您提交请求的速度太快;例如,创建新任务的请求。
如果您通过轮询来确定请求的状态,请考虑使用通知来确定状态。有关更多信息,请参阅
任务状态通知
:
服务器在尝试完成请求时遇到内部错误。
服务器在处理您的请求时遇到错误。
Internal Server Error
服务器在尝试完成请求时遇到内部错误。
服务器在处理您的请求时遇到错误。
内部服务异常
服务在尝试完成请求时遇到意外异常。
服务不可用异常
服务目前不可用或繁忙。
服务器在处理您的请求时出现意外错误。
错误响应示例
下面是一个 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 在处理您的任务时遇到错误时,它会通过两种方式报告错误:
Job 状态和输出状态:
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
的值
在处理任务时,Elastic Transcoder 确定请求中的一个或多个值无效。
依赖性错误
Elastic Transcoder 无法生成播放列表,因为它在一个或多个播放列表依赖关系中遇到了错误。
无法代入角色
Elastic Transcoder 无法代入该任务管道中的
Role
对象中指定的AWS Identity and Access Management角色。
未分类存储错误
输入不存在
不存在具有您在该任务的
Input:Key
对象中指定的名称的文件。该文件必须存在于在此任务管道中的
InputBucket
对象中指定的 Amazon S3 存储桶中。
输出已存在
已存在具有您在该任务的
Outputs:Key
(或
Output:Key
) 对象中指定的名称的文件。该文件不能存在于在此任务管道中的
OutputBucket
对象中指定的 Amazon S3 存储桶中。
没有读取权限
在管道中用于此任务的
Role
对象中指定的 IAM 角色无权读取包含您要转码的文件的 Amazon S3 存储桶。
没有写入权限
在您用于此任务的管道中的
Role
对象中指定的 IAM 角色无权写入您想要在其中保存转码文件或缩略图文件的 Amazon S3 存储桶。
存储桶不存在。
指定的 S3 存储桶不存在:bucket=
{
1}。
没有写入权限
Elastic Transcoder 无法将密钥=
{
1} 写入 bucket=
{
2},因为密钥与存储桶不在同一个区域
错误输入文件
您为此任务在
Input:Key
对象中指定的文件采用 Elastic Transcoder 目前不支持的格式。
错误输入文件
您在该任务的
Input:Key
对象中所指定文件的宽度 x 高度超出允许的最大宽度 x 高度。
错误输入文件
您在该任务的
Input:Key
对象中所指定文件的文件大小超出允许的最大文件大小。
错误输入文件
Elastic Transcoder 无法解释您在此任务的其中一个
Outputs:Watermarks:InputKey
对象中指定的文件。
错误输入文件
您在该任务的其中一个
Outputs:Watermarks:InputKey
对象中所指定文件的宽度 x 高度超出允许的最大宽度 x 高度。
错误输入文件
您为
{
1} 个对象之一指定的文件大小超过了允许的最大大小:bucket=
{
2}、key=
{
3}、size
{
4}、max size=
{
5}。
错误输入文件
Elastic Transcoder 无法对输入文件进行转码,因为不支持该格式。
未处理的输入文件
Elastic Transcoder 遇到了一种普遍支持的文件类型,但无法正确处理该文件。此错误会自动打开一个支持案例,我们已开始研究问题的原因。
错误输入文件
该问题的根本原因是预设和输入文件不匹配。示例包括:
为串联指定的
{
1} 输入文件将无法创建分辨率与指定预设一致的输出。使用具有不同
PaddingPolicy
、
SizingPolicy
、
MaxWidth
和
MaxHeight
设置的预设。
为串联指定的
{
1} 输入文件将无法创建分辨率与指定预设一致的缩略图。使用具有不同缩略图
PaddingPolicy
、
SizingPolicy
、
MaxWidth
和
MaxHeight
设置的预设。
至少有一个媒体文件(输入 #
{
1})与其他文件不匹配。所有媒体文件必须都包含视频或都不包含视频。
至少有一个媒体文件(输入 #
{
1})与其他文件不匹配。所有媒体文件必须都包含音频或都不包含音频。
错误输入文件
Elastic Transcoder 检测到嵌入式字幕曲目,但无法对其进行解释。
错误输入文件
Elastic Transcoder 无法解释 Amazon S3 bucket=
{
1},key=
{
2} 的指定字幕文件。
错误输入文件
Elastic Transcoder 无法解释指定的字幕文件,因为它不是 UTF-8 编码的:Amazon S3 bucket=
{
1},key=
{
2}。
错误输入文件
Elastic Transcoder 无法处理您的所有字幕曲目,因为您超过了字幕曲目的最大数量
{
1}。
错误输入文件
Elastic Transcoder 无法生成主播放列表,因为所需输出包含
{
1} 个嵌入式字幕,而最大值为 4。
错误输入文件
Elastic Transcoder 无法嵌入您的字幕曲目,因为 CEA-708 不支持帧频
{
1},仅支持帧率 [29.97,30]。
错误输入文件
Elastic Transcoder 无法嵌入您的字幕曲目,因为 format
{
1} 仅支持
{
2} 字幕曲目。
内部服务错误
内部服务错误
内部服务错误
为了让您的应用程序平稳运行,您需要构建逻辑以捕获和响应错误。一种典型的方法是在
try
数据块或
if-then
语句中实施您的请求。
AWS SDK 执行自己的重试和检查错误。如果您在使用 AWS SDK 时遇到错误,应当对错误代码和错误描述。您还会看到一个
Request ID
值。该
Request ID
值可以帮助解决与 Elastic Transcoder 支持有关的问题。
以下示例使用AWS SDK for Java 开发工具包删除
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 开发工具包都实现了自动重试逻辑。AWS SDK for Java 开发工具包会自动重试请求,您可以使用ClientConfiguration
类配置重试设置。例如,有时候网页发出的请求采用最低延迟并且不想重试,您可能会希望关闭重试逻辑。您可以使用 ClientConfiguration
类,并且为 maxErrorRetry
提供 0
这个值,从而设置为不重试。
如果您没有使用 AWS SDK,则应当对收到服务器错误 (5xx) 的原始请求执行重试。但是,客户端错误 (4xx,不是 ThrottlingException
或 ProvisionedThroughputExceededException
) 表示您需要对请求本身进行修改,先修正了错误然后再重试。
如果您正在轮询以确定请求的状态,并且如果 Elastic Transcoder 返回的错误代码为Provisioned Throughput Exceeded
Exception
或Throttling Exception
的 HTTP 状态代码 429,请考虑使用通知而不是轮询来确定状态。有关更多信息,请参阅任务状态通知:
除了简单重试之外,我们还建议使用指数退避算法来实现更好的流程控制。指数退避的原理是对于连续错误响应,重试等待间隔越来越长。例如,您可能会允许经过 1 秒后进行第一次重试,经过 4 秒后进行第二次重试,经过 16 秒后进行第三次重试,以此类推。但是,如果一分钟后请求未成功,则问题可能在于硬限制而不是请求速率。例如,您可能已达到允许的最大管道数量。您可以设置最大重试次数,在大约一分钟的时候停止重试。
以下是显示重试逻辑的一个工作流程。该工作流程逻辑首先确定遇到的是不是服务器错误 (5xx)。如果遇到的是服务器错误,代码就会重试原始请求。
currentRetry = 0
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)