本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 HLC 端點將日誌傳送至 CloudWatch Logs
Amazon CloudWatch Logs 支援 HTTP Log Collector (HLC) 端點,可讓您使用簡單的 HTTP 型通訊協定將日誌直接傳送至 CloudWatch Logs。此功能可簡化應用程式和服務的記錄擷取,而不需要 AWS SDK 整合。
HLC 端點功能可讓您:
使用 HTTP 型通訊協定將日誌傳送至 CloudWatch Logs
使用 IAM 服務特定的登入資料進行驗證 (承載字符)
無需 AWS SDK 整合即可擷取日誌
使用來自任何應用程式或服務的簡單 HTTP POST 請求
注意
HLC 端點存取的 API 金鑰 (承載字符) 目前處於預覽狀態,可用於下列 AWS 區域:us-east-1、us-west-2、 us-west-1和 us-east-2。請檢查本文件,了解未來的更新。
先決條件
在使用 HLC 端點傳送日誌之前,您需要:
建立具有 CloudWatch Logs 許可的 IAM 使用者
產生服務特定的登入資料 (承載字符)
建立日誌群組和日誌串流
在日誌群組上啟用承載字符身分驗證
選項 1:使用 AWS 主控台簡化設定 (建議)
AWS 管理主控台提供簡化的工作流程,為 HLC 端點存取產生 API 金鑰。
使用主控台設定 HLC 端點存取
登入 AWS 管理主控台。
導覽至 CloudWatch > 設定 > 日誌。
-
在 API 金鑰區段中,選擇產生 API 金鑰。
-
對於 API 金鑰過期,請執行下列其中一項操作:
選取 1、5、30、90 或 365 天的 API 金鑰過期持續時間。
選擇自訂持續時間以指定自訂 API 金鑰過期日期。
選取永不過期 (不建議)。
-
選擇產生 API 金鑰。
主控台會自動:
建立具有適當許可的新 IAM 使用者
連接 CloudWatchLogsAPIKeyAccess 受管政策 (包含
logs:PutLogEvents和logs:CallWithBearerToken許可)產生服務特定的登入資料 (API 金鑰)
-
複製並安全地儲存顯示的登入資料:
API 金鑰 ID (服務特定的登入資料 ID)
API 金鑰秘密 (承載字符)
重要
立即儲存 API 金鑰秘密。它稍後無法擷取。如果遺失,您將需要產生新的 API 金鑰。
-
建立將存放日誌的日誌群組和日誌串流:
# Create the log group aws logs create-log-group \ --log-group-name /aws/hlc-logs/my-application \ --region us-east-1 # Create the log stream aws logs create-log-stream \ --log-group-name /aws/hlc-logs/my-application \ --log-stream-name application-stream-001 \ --region us-east-1 -
在日誌群組上啟用承載字符身分驗證:
aws logs put-bearer-token-authentication \ --log-group-identifier /aws/hlc-logs/my-application \ --bearer-token-authentication-enabled \ --region us-east-1驗證組態:
aws logs describe-log-groups \ --log-group-name-prefix /aws/hlc-logs/my-application \ --region us-east-1
包含的許可:自動建立的 IAM 使用者將具有下列許可:
logs:PutLogEvents– 將日誌事件傳送至 CloudWatch Logslogs:CallWithBearerToken– 使用承載字符進行驗證kms:Describe*、kms:GenerateDataKey*、kms:Decrypt– 存取 KMS 加密日誌群組 (具有限制為日誌服務的條件)
選項 2:手動設定
如果您偏好對 IAM 組態進行更多控制,或需要自訂許可,您可以手動設定 HLC 端點。
步驟 1:建立 IAM 使用者
建立將用於日誌擷取的 IAM 使用者:
登入 AWS 管理主控台並導覽至 IAM。
在左側導覽窗格中,選擇 Users (使用者)。
選擇 Create user (建立使用者)。
輸入使用者名稱 (例如
cloudwatch-logs-hlc-user)。選擇下一步。
-
連接下列其中一個 IAM 政策:
選項 A:使用 受管政策 (建議)
連接 CloudWatchLogsAPIKeyAccess 受管政策。
選項 B:建立自訂政策
建立並連接下列 IAM 政策:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "LogsAPIs", "Effect": "Allow", "Action": [ "logs:CallWithBearerToken", "logs:PutLogEvents" ], "Resource": "*" }, { "Sid": "KMSAPIs", "Effect": "Allow", "Action": [ "kms:Describe*", "kms:GenerateDataKey*", "kms:Decrypt" ], "Condition": { "StringEquals": { "kms:ViaService": [ "logs.*.amazonaws.com" ] } }, "Resource": "arn:aws:kms:*:*:key/*" } ] } 選擇下一步,然後選擇建立使用者。
注意
如果您計劃將日誌傳送至 KMS 加密的日誌群組,則需要 KMS 許可。條件限制 KMS 只能存取透過 CloudWatch Logs 服務使用的金鑰。
步驟 2:產生服務特定的登入資料 (API 金鑰)
使用 CreateServiceSpecificCredential API 產生 CloudWatch Logs API 金鑰。您也可以使用 create-service-specific-credential
若要產生過期 30 天的 API 金鑰:
aws iam create-service-specific-credential \ --user-name cloudwatch-logs-hlc-user \ --service-name logs.amazonaws.com \ --credential-age-days 30
回應是 ServiceSpecificCredential 物件。ServiceCredentialSecret 值是您的 CloudWatch Logs API 金鑰 (承載字符)。
重要
請妥善儲存 ServiceCredentialSecret 值,因為您之後將無法再擷取它。如果遺失,您將需要產生新的 API 金鑰。
步驟 3:建立日誌群組和日誌串流
建立將存放日誌的日誌群組和日誌串流:
# Create the log group aws logs create-log-group \ --log-group-name /aws/hlc-logs/my-application \ --region us-east-1 # Create the log stream aws logs create-log-stream \ --log-group-name /aws/hlc-logs/my-application \ --log-stream-name application-stream-001 \ --region us-east-1
步驟 4:啟用承載字符身分驗證
在日誌群組上啟用承載字符身分驗證:
aws logs put-bearer-token-authentication \ --log-group-identifier /aws/hlc-logs/my-application \ --bearer-token-authentication-enabled \ --region us-east-1
驗證組態:
aws logs describe-log-groups \ --log-group-name-prefix /aws/hlc-logs/my-application \ --region us-east-1
將日誌傳送至 HLC 端點
端點格式
HLC 端點 URL 遵循此格式:
https://logs.<region>.amazonaws.com/services/collector/event?logGroup=<name>&logStream=<name>[&entityName=<name>&entityEnvironment=<environment>]
必要參數:
<region>– AWS Region (例如,us-east-1、eu-west-1)logGroup– URL 編碼的日誌群組名稱logStream– URL 編碼的日誌串流名稱
選用參數:
您可以選擇性地將日誌事件與Service實體建立關聯,方法是包含下列查詢參數。由於透過 HLC 端點傳送的日誌是自訂遙測,因此不會自動與實體建立關聯。透過提供這些參數,CloudWatch Logs 會建立將 KeyAttributes.Type 設定為 的實體,Service並將其與您的日誌事件建立關聯。這可讓 CloudWatch 中的探索相關功能將這些日誌與來自相同服務的其他遙測 (指標、追蹤和日誌) 建立關聯,讓您更輕鬆地疑難排解和監控不同訊號類型的應用程式。如需實體和相關遙測的詳細資訊,請參閱將相關資訊新增至自訂遙測。
entityName– 要與日誌事件建立關聯的服務實體名稱。此值會儲存為實體KeyAttributes.Name(例如my-application或api.myservice.com)。entityEnvironment– 託管服務或其所屬的環境。此值會儲存為實體KeyAttributes.Environment(例如production、ec2:default或eks:my-cluster/default)。
要求格式
使用 HTTP POST 搭配下列標頭和內文來傳送日誌:
標頭:
Authorization: Bearer <your-bearer-token>Content-Type: application/json
內文格式:
請求內文應為 JSON 格式,其中包含事件陣列:
{ "event": [ { "time": 1730141374.001, "event": "Application started successfully", "host": "web-server-1", "source": "application.log", "severity": "info" }, { "time": 1730141374.457, "event": "User login successful", "host": "web-server-1", "source": "auth.log", "user": "john.doe" } ] }
欄位描述:
time– Unix epoch 時間戳記,含毫秒 (必要)event– 日誌訊息或事件資料 (必要)host– 來源主機名稱或識別符 (選用)source– 日誌來源識別符 (選用)
您可以視需要包含其他自訂欄位。
範例請求
curl -X POST \ 'https://logs.<region>.amazonaws.com/services/collector/event?logGroup=/aws/hlc-logs/my-application&logStream=application-stream-001' \ -H "Authorization: Bearer <your-bearer-token>" \ -H "Content-Type: application/json" \ -d '{ "event": [ { "time": 1730141374.001, "event": "Application started", "host": "web-server-1", "severity": "info" } ] }'
控制產生和使用 CloudWatch Logs API 金鑰的許可
CloudWatch Logs API 金鑰的產生和使用由 CloudWatch Logs 和 IAM 服務中的動作和條件金鑰控制。
控制 CloudWatch Logs API 金鑰的產生
iam:CreateServiceSpecificCredential 動作會控制產生服務特定的金鑰 (例如 CloudWatch Logs API 金鑰)。您可以將此動作的範圍限定為 IAM 使用者,以此限制可以為其產生金鑰的使用者。
您可以使用下列條件索引鍵,對 iam:CreateServiceSpecificCredential 動作的許可施加條件:
iam:ServiceSpecificCredentialAgeDays – 可讓您在條件中指定金鑰的過期時間,以天為單位。例如,您可以使用此條件索引鍵,僅允許建立有效期為 90 天的 API 金鑰。
iam:ServiceSpecificCredentialServiceName – 可讓您在條件中指定服務的名稱。例如,您可以使用此條件金鑰來僅允許為 CloudWatch Logs 建立 API 金鑰,而非其他 服務。
控制 CloudWatch Logs API 金鑰的使用
logs:CallWithBearerToken 動作控制 CloudWatch Logs API 金鑰的使用。若要防止身分使用 CloudWatch Logs API 金鑰,請將拒絕logs:CallWithBearerToken動作的政策連接至與金鑰相關聯的 IAM 使用者。
政策範例
防止身分產生和使用 CloudWatch Logs API 金鑰
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyCWLAPIKeys", "Effect": "Deny", "Action": [ "iam:CreateServiceSpecificCredential", "logs:CallWithBearerToken" ], "Resource": "*" } ] }
警告
此政策將防止為所有支援建立服務特定登入資料的 AWS 服務建立登入資料。如需詳細資訊,請參閱 IAM 使用者的服務特定憑證。
防止身分使用 CloudWatch Logs API 金鑰
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "logs:CallWithBearerToken", "Resource": "*" } ] }
只有在 CloudWatch Logs 金鑰在 90 天內過期時,才允許建立金鑰
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:CreateServiceSpecificCredential", "Resource": "arn:aws:iam::123456789012:user/username", "Condition": { "StringEquals": { "iam:ServiceSpecificCredentialServiceName": "logs.amazonaws.com" }, "NumericLessThanEquals": { "iam:ServiceSpecificCredentialAgeDays": "90" } } } ] }
處理遭入侵的 CloudWatch Logs API 金鑰
如果您的 API 金鑰已洩露,您應該撤銷使用它的許可。您可以使用下列 IAM API 操作來管理遭到入侵的金鑰:
UpdateServiceSpecificCredential – 將金鑰的狀態設定為非作用中。稍後可以重新啟用它們。
ResetServiceSpecificCredential – 重設金鑰。這會為金鑰產生新密碼。
DeleteServiceSpecificCredential – 永久刪除金鑰。
注意
若要透過 API 執行這些動作,您必須使用 AWS 登入資料進行驗證,而不是使用 CloudWatch Logs API 金鑰進行驗證。
變更 CloudWatch Logs API 金鑰的狀態
若要停用金鑰,請使用 update-service-specific-credential
aws iam update-service-specific-credential \ --user-name cloudwatch-logs-hlc-user \ --service-specific-credential-id ACCA1234EXAMPLE1234 \ --status Inactive
若要重新啟用金鑰,請將狀態變更為 Active。
重設 CloudWatch Logs API 金鑰
如果金鑰的值已洩露或您不再擁有,請使用 reset-service-specific-credential
aws iam reset-service-specific-credential \ --service-specific-credential-id ACCA1234EXAMPLE1234
刪除 CloudWatch Logs API 金鑰
如果您不再需要金鑰或金鑰已過期,請使用 delete-service-specific-credential
aws iam delete-service-specific-credential \ --service-specific-credential-id ACCA1234EXAMPLE1234
連接 IAM 政策以移除使用 CloudWatch Logs API 金鑰的許可
若要防止身分使用 CloudWatch Logs API 金鑰進行呼叫,請將下列政策連接至與金鑰相關聯的 IAM 使用者:
{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": "logs:CallWithBearerToken", "Resource": "*" } }
使用 CloudTrail 記錄 API 金鑰用量
您可以使用 AWS CloudTrail 記錄 CloudWatch Logs API 金鑰用量的資料事件。CloudWatch Logs 會發出CallWithBearerToken呼叫AWS::Logs::LogGroupAuthorization的資料事件,讓您稽核何時及如何使用 API 金鑰傳送日誌。
若要為 CloudWatch Logs API 金鑰用量啟用 CloudTrail 記錄: CloudWatch
注意
您為線索指定的 S3 儲存貯體必須具有允許 CloudTrail 將日誌檔案寫入其中的儲存貯體政策。如需詳細資訊,請參閱 CloudTrail 的 Amazon S3 儲存貯體政策。
-
建立線索:
aws cloudtrail create-trail \ --name cloudwatch-logs-api-key-audit \ --s3-bucket-name my-cloudtrail-bucket \ --region us-east-1 -
設定進階事件選取器以擷取 CloudWatch Logs 日誌群組授權事件:
aws cloudtrail put-event-selectors \ --region us-east-1 \ --trail-name cloudwatch-logs-api-key-audit \ --advanced-event-selectors '[{ "Name": "CloudWatch Logs API key authorization events", "FieldSelectors": [ { "Field": "eventCategory", "Equals": ["Data"] }, { "Field": "resources.type", "Equals": ["AWS::Logs::LogGroupAuthorization"] } ] }]' -
開始追蹤記錄:
aws cloudtrail start-logging \ --name cloudwatch-logs-api-key-audit \ --region us-east-1
最佳實務
批次處理事件
為了獲得更好的效能和效率:
盡可能在單一請求中批次處理多個事件
建議的批次大小:每個請求 10–100 個事件
請求大小上限:1 MB
錯誤處理
在應用程式中實作適當的錯誤處理。常見的 HTTP 狀態碼:
200 OK– 日誌已成功擷取400 Bad Request– 無效的請求格式或參數401 Unauthorized– 承載字符無效或過期403 Forbidden– 許可不足404 Not Found– 日誌群組或串流不存在429 Too Many Requests– 超過速率限制500 Internal Server Error– 服務錯誤 (以指數退避重試)
限制
事件大小上限:每個事件 256 KB
請求大小上限:1 MB
每個請求的事件上限:10,000
日誌群組名稱必須遵循 CloudWatch Logs 命名慣例
必須在日誌群組上啟用承載字符身分驗證