本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
了解 HTTP 端點交付請求和回應規格
若要讓 Amazon Data Firehose 成功將資料交付至自訂 HTTP 端點,這些端點必須接受請求,並使用特定 Amazon Data Firehose 請求和回應格式傳送回應。本節說明 Amazon Data Firehose 服務傳送至自訂 HTTP 端點的 HTTP 請求格式規格,以及 Amazon Data Firehose 服務預期的 HTTP 回應格式規格。HTTP 端點有 3 分鐘的時間回應請求,Amazon Data Firehose 會逾時該請求。Amazon Data Firehose 會將未遵守適當格式的回應視為交付失敗。
要求格式
- 路徑和 URL 參數
-
這些是由您作為單一 URL 欄位的一部分直接進行設定。Amazon Data Firehose 會依設定傳送它們,無需修改。僅 https 目的地受支援。系統會在交付串流組態期間套用 URL 限制。
注意
目前,HTTP 端點資料交付僅支援連接埠 443。
- HTTP 標頭 – X-Amz-Firehose-Protocol-Version
-
此標頭用於指示請求/回應格式的版本。目前僅支援 1.0 版本。
- HTTP 標頭 – X-Amz-Firehose-Request-Id
-
此標頭的值是不透明的 GUID,可用於偵錯和重複資料刪除目的。如果可能,端點實作應該記錄此標頭的值,以滿足成功和不成功的請求。在相同請求的多次嘗試之間,請求 ID 保持不變。
- HTTP 標頭 – Content-Type
-
Content-Type 標頭的值永遠是
application/json
。 - HTTP 標頭 – Content-Encoding
-
Firehose 串流可設定為在傳送請求時使用 GZIP 壓縮內文。啟用此壓縮時,根據標準實務,Content-Encoding 標頭的值會設定為 gzip。如果未啟用壓縮,則 Content-Encoding 標頭完全不存在。
- HTTP 標頭 – Content-Length
-
以標準方式對其進行使用。
- HTTP 標頭 – X-Amz-Firehose-Source-Arn:
-
以 ASCII 字串格式表示的 Firehose 串流 ARN。ARN 會編碼區域、 AWS 帳戶 ID 和串流名稱。例如:
arn:aws:firehose:us-east-1:123456789:deliverystream/testStream
。 - HTTP 標頭 – X-Amz-Firehose-Access-Key
-
此標頭帶有 API 金鑰或其他憑證。您可以在建立或更新交付串流時建立或更新 API 金鑰 (也稱為授權記號)。Amazon Data Firehose 會將存取金鑰的大小限制為 4096 個位元組。Amazon Data Firehose 不會嘗試以任何方式解譯此金鑰。設定的金鑰會逐字複製到此標頭的值中。
內容可以是任意的,並且可能代表 JWT 記號或 ACCESS_KEY。如果端點需要多欄位憑證 (例如,使用者名稱和密碼),則所有欄位的值都應以端點理解的格式 (JSON 或 CSV) 儲存在單一存取金鑰中。如果原始內容是二進位,則此欄位可以是 base-64 編碼。Amazon Data Firehose 不會修改和/或編碼設定的值,並照原樣使用內容。
- HTTP 標頭 – X-Amz-Firehose-Common-Attributes
-
該標頭包含與整個請求和/或請求中的所有記錄有關的共同屬性 (中繼資料)。這些是由您在建立 Firehose 串流時直接設定。系統會將此屬性的值編碼為具有下列結構描述的 JSON 物件:
"$schema": http://json-schema.org/draft-07/schema# properties: commonAttributes: type: object minProperties: 0 maxProperties: 50 patternProperties: "^.{1,256}$": type: string minLength: 0 maxLength: 1024
範例如下:
"commonAttributes": { "deployment -context": "pre-prod-gamma", "device-types": "" }
- 主體 – 大小上限
-
壓縮之前,主體大小上限由您設定,最大可達 64 MiB。
- 主體 – 結構描述
-
主體包含具有下列 JSON 結構描述 (以 YAML 寫入) 的單一 JSON 文件:
"$schema": http://json-schema.org/draft-07/schema# title: FirehoseCustomHttpsEndpointRequest description: > The request body that the Firehose service sends to custom HTTPS endpoints. type: object properties: requestId: description: > Same as the value in the X-Amz-Firehose-Request-Id header, duplicated here for convenience. type: string timestamp: description: > The timestamp (milliseconds since epoch) at which the Firehose server generated this request. type: integer records: description: > The actual records of the Firehose stream, carrying the customer data. type: array minItems: 1 maxItems: 10000 items: type: object properties: data: description: > The data of this record, in Base64. Note that empty records are permitted in Firehose. The maximum allowed size of the data, before Base64 encoding, is 1024000 bytes; the maximum length of this field is therefore 1365336 chars. type: string minLength: 0 maxLength: 1365336 required: - requestId - records
範例如下:
{ "requestId": "ed4acda5-034f-9f42-bba1-f29aea6d7d8f", "timestamp": 1578090901599 "records": [ { "data": "aGVsbG8=" }, { "data": "aGVsbG8gd29ybGQ=" } ] }
回應格式
- 出現錯誤時的預設行為
-
如果回應不符合下列要求,Firehose 伺服器會將其視為具有 500 狀態碼,且不含內文。
- 狀態碼
-
HTTP 狀態碼必須在 2XX、4XX 或 5XX 的範圍內。
Amazon Data Firehose 伺服器不遵循重新導向 (3XX 狀態碼)。只將回應碼 200 視為成功將記錄交付至 HTTP/EP。會將回應碼 413 (大小已超出) 視為永久失效,如果已設定,則不會將記錄批次傳送至錯誤儲存貯體。會將所有其他回應碼視為可重試的錯誤,並受限於稍後解釋的輪詢重試演算法。
- 標頭 – 內容類型
-
唯一可接受的內容類型是應用程式/json。
- HTTP 標頭 – Content-Encoding
-
不能使用 Content-Encoding。必須對主體進行解壓縮。
- HTTP 標頭 – Content-Length
-
如果回應有主體,則 Content-Length 標頭必須存在。
- 主體 – 大小上限
-
回應主體的大小必須為小於或等於 1 MiB。
"$schema": http://json-schema.org/draft-07/schema# title: FirehoseCustomHttpsEndpointResponse description: > The response body that the Firehose service sends to custom HTTPS endpoints. type: object properties: requestId: description: > Must match the requestId in the request. type: string timestamp: description: > The timestamp (milliseconds since epoch) at which the server processed this request. type: integer errorMessage: description: > For failed requests, a message explaining the failure. If a request fails after exhausting all retries, the last Instance of the error message is copied to error output S3 bucket if configured. type: string minLength: 0 maxLength: 8192 required: - requestId - timestamp
範例如下:
Failure Case (HTTP Response Code 4xx or 5xx) { "requestId": "ed4acda5-034f-9f42-bba1-f29aea6d7d8f", "timestamp": "1578090903599", "errorMessage": "Unable to deliver records due to unknown error." } Success case (HTTP Response Code 200) { "requestId": "ed4acda5-034f-9f42-bba1-f29aea6d7d8f", "timestamp": 1578090903599 }
- 錯誤回應處理
-
在所有錯誤情況下,Amazon Data Firehose 伺服器會使用指數退避演算法重新嘗試交付相同批次的記錄。重試會使用初始退避時間 (1 秒) 和抖動係數 (15%) 進行退避,並且每次後續重試都會使用新增抖動的公式 (initial-backoff-time * (multiplier(2) ^ retry_count)) 來退避。退避時間受限於 2 分鐘的間隔上限。例如,在第 'n' 次重試後關閉時間為 = MAX(120, 2^n) * random(0.85, 1.15)。
在上一個方程式中所指定的參數可能會發生變更。如需確切的初始退避時間、最大退避時間、乘數和指數退避演算法中使用的抖動百分比,請參閱 AWS Firehose 文件。
在每次後續重試嘗試中,交付記錄的存取金鑰和/或目的地可能會根據 Firehose 串流的更新組態而變更。Amazon Data Firehose 服務在重試之間以最佳方式使用相同的 request-id。可將這最後一個功能用於 HTTP 端點伺服器的重複資料刪除目的。如果請求在允許的最長時間 (根據 Firehose 串流組態) 後仍未交付,則可根據串流組態選擇將批次記錄交付至錯誤儲存貯體。
範例
CWLog 來源請求的範例。
{ "requestId": "ed4acda5-034f-9f42-bba1-f29aea6d7d8f", "timestamp": 1578090901599, "records": [ { "data": { "messageType": "DATA_MESSAGE", "owner": "123456789012", "logGroup": "log_group_name", "logStream": "log_stream_name", "subscriptionFilters": [ "subscription_filter_name" ], "logEvents": [ { "id": "0123456789012345678901234567890123456789012345", "timestamp": 1510109208016, "message": "log message 1" }, { "id": "0123456789012345678901234567890123456789012345", "timestamp": 1510109208017, "message": "log message 2" } ] } } ] }