處理 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 返回的錯誤。有些錯誤只需您重試相同的請求即可解決。表中指出哪些錯誤可能在連續重試後解決。如果 Retry (重試) 欄位的值為:

  • Yes (是):重新提交相同的請求。

  • No (否):先修正用戶端的問題,再提交新的請求。

如需重試請求的詳細資訊,請參閱錯誤重試和指數退避

HTTP 狀態碼 錯誤代碼 訊息 原因 重試
400 條件式檢查失敗例外 條件式請求失敗。 範例:預期值與系統中存放的不符。
400 簽章不完整例外 請求簽章未符合 AWS 標準。 請求中的簽章未包含所有必要元件。請參閱 HTTP 標頭內容
403 缺少身分驗證權杖例外 請求必須包含有效 (已註冊) 的 AWS 存取金鑰 ID。 請求未包含所需的 x-amz-security-token。請參閱 向 Elastic Transcoder 提出 HTTP 請求
400 驗證例外 多種。 請求中一或多個值缺少或無效;例如,值為空白或是大於有效值上限。
403 AccessDenied 例外
  • 不允許刪除系統預設集:帳戶 =<accountId>,預設 ID =<presetId>。

  • 一般身分驗證失敗。用戶端未正確地簽署請求。請參閱 簽署請求

您嘗試刪除系統預設集、呼叫 Elastic Transcoder API 的簽章無效,或使用者未獲授權執行作業。

404 ResourceNot 發現異常
  • 找不到指定的 <resource>:<resourceId>。

  • 找不到指定的任務:帳戶 =<accountId>,任務 ID =<jobId>。

  • 找不到指定的管道:帳戶 =<accountId>,管道 ID =<pipelineId>。

  • 找不到指定的預設集:帳戶 =<accountId>,預設集 ID =<presetId>。

範例:您嘗試增加任務的管道不存在或仍在建立中。
409 資源 InUse 異常
  • <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 在處理工作時遇到錯誤時,它會以兩種方式報告錯誤:

  • 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的值 原因
1000 驗證錯誤 處理作業時,Elastic Transcoder 會判斷要求中的一或多個值無效。
1001 相依性錯誤 EElastic 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 錯誤的輸入檔案 EElastic 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},size = {3}。
4023 錯誤的輸入 為串連指定的 {1} 個輸入檔案不會建立與指定預設集具有一致解析度的輸出。您可以使用具有不同 PaddingPolicySizingPolicyMaxWidthMaxHeight 設定的預設集。
4024 錯誤的輸入 為串連指定的 {1} 個輸入檔案不會建立與指定預設集具有一致解析度的縮圖。您可以使用具有不同 PaddingPolicySizingPolicyMaxWidthMaxHeight 設定的縮圖。
4025 錯誤的輸入 至少有一個媒體檔案 (輸入 # {1}) 與其他媒體檔案不相符。所有媒體檔案都必須包含影片或不包含影片。
4026 錯誤的輸入 至少有一個媒體檔案 (輸入 # {1}) 與其他媒體檔案不相符。所有媒體檔案都必須包含音訊或不包含音訊。
4100 錯誤的輸入檔案 Elastic Transcoder 檢測到嵌入式字幕軌道,但無法解釋它。
4101 錯誤的輸入檔案 Elastic Transcoder 無法解譯 Amazon S3 儲存貯體 = {1} 的指定標題檔案,key = {2}。
4102 錯誤的輸入檔案 Elastic Transcoder 無法解釋指定的標題文件,因為它不是 UTF-8 編碼:Amazon S3 存儲桶 = {1},鍵 = {2}。
4103 錯誤的輸入檔案 Elastic Transcoder 無法處理您的所有字幕軌道,因為您超過了字幕軌道的最大數量 {1}。
4104 錯誤的輸入檔案 當最大值為 4 時,Elastic Transcoder 無法生成主播放列表,因為所需的輸出包含 {1} 個嵌入式字幕。
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 開發套件來刪除 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 開發套件都會實作自動重試邏輯。適用於 Java 的 AWS 開發套件會自動重試請求,而且您可以使用 ClientConfiguration 類別進行重試設定。例如,在某些情況下,網頁以最低延遲發出請求且不允許重試,您可能會想要關閉重試邏輯。使用 ClientConfiguration 類別並提供 maxErrorRetry 價值 0,即可關閉重試。

如果您不要使用 AWS 開發套件,則應該重試收到伺服器錯誤 (5xx) 的原始請求。不過,用戶端錯誤 (4xx,非 ThrottlingExceptionProvisionedThroughputExceededException) 指出您需要先修訂請求本身更正問題,然後再試一次。

注意

如果您要輪詢以確定請求的狀態,並且 Elastic Transcoder 返回錯誤代碼為Provisioned Throughput Exceeded Exception或的 HTTP 狀態碼 429Throttling 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