如何對 CloudWatch Logs 進行疑難排解,以便將其串流至 Amazon OpenSearch Service 網域?
我無法將 Amazon CloudWatch Logs 串流到 Amazon OpenSearch Service 網域。如何對此問題進行疑難排解?
解決方案
我無法將多個 CloudWatch 日誌群組串流至相同的 OpenSearch Service 網域
在預設情況下,Amazon CloudWatch 只會為每個 OpenSearch Service 網域建立一個 AWS Lambda 函數。如果您設定多個日誌群組,以便在網域中編製資料索引,則所有多個日誌群組都會叫用相同的 Lambda 函數。當第一個日誌群組叫用 Lambda 函數時,該叫用將會在您的網域中產生索引和類型欄位。
在 Amazon OpenSearch Service 6.0.0 或更高版本中建立的索引只能包含單一映射類型。在具有多種映射類型的 5.x 中建立的索引繼續像以前一樣在 OpenSearch Service 6.x 中運行。如需有關 OpenSearch Service 映射類型取代的詳細資訊,請參閱 Elastic 網站上的移除映射類型。
當其他日誌群組嘗試叫用相同的 Lambda 函數時,叫用失敗會顯示下列錯誤訊息:
"reason": "Rejecting mapping update to [
] as the final mapping would have more than 1 type: [log-group-1, log-group-2]" (拒絕映射更新為 [
],因為最終映射會有超過 1 種類型:[log-group-1, log-group-2])
如要解決問題,首先使用下列語法更新您的 Lambda 函數:
var indexName = [ 'cwl-' + payload.logGroup.toLowerCase().split('/').join('-') + '-' + timestamp.getUTCFullYear(), ('0' + (timestamp.getUTCMonth() + 1)).slice(-2), ('0' + timestamp.getUTCDate()).slice(-2) ].join('.');
此語法會為串流至 OpenSearch Service 網域的不同日誌群組建立多個索引。
然後,儲存已更新的 Lambda 函數,以便為串流到網域的多個日誌群組建立獨立的索引。
我無法串流至同一個 AWS 帳戶中以 VPC 為基礎的 OpenSearch Service 網域
**重要事項:**將 CloudWatch 日誌群組串流至以 VPC 為基礎的 OpenSearch Service 網域之前,請務必更新您的 AWS Identity and Access Management (IAM) 角色政策。附加至對應的 Lambda 函數時,IAM 角色必須附有 AWSLambdaVPCAccessExecutionRole 政策。
以下是以 JSON 格式建立的 AWSLambdaVPCAccessExecutionRole 政策:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "ec2:CreateNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DeleteNetworkInterface" ], "Resource": "*" } ] }
**注意:**此受管政策可讓 Lambda 函數將 CloudWatch 日誌群組寫入 VPC 中的叢集。
將政策附加至 Lambda 函數之後,您就可以開始將日誌串流至 VPC 中的 OpenSearch Service 網域。
啟用精細存取控制時,我無法將 CloudWatch 日誌群組串流至 OpenSearch Service 網域
如果您將 CloudWatch Logs 串流至設有精細存取控制的 OpenSearch Service 網域,您可能會遇到下列許可錯誤:
"{"statusCode":403,"responseBody":{"error":{"root_cause":[{"type":"security_exception","reason":"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456789101:role/lambda_opensearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_opensearch_execution], requestedTenant=null]"}],"type":"security_exception","reason":"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456789101:role/lambda_opensearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_opensearch_execution], requestedTenant=null]"},"status":403}}"
如果您從 Lambda 函數日誌收到這個錯誤訊息,則代表角色映射不完整。
**注意:**在預設情況下,OpenSearch Service 會為您建立 AWS Lambda 函數。
執行 7.9 和更新版本的 OpenSearch Service 網域 (包括 OpenSearch 版本 1.x)
若要解決錯誤訊息,請執行下列步驟:
1. 開啟 OpenSearch Dashboards。您可以在 OpenSearch Service 主控台的網域摘要中找到 OpenSearch Dashboards 的連結。
2. 在導覽窗格中,選擇 Security (安全性)。
3. 選擇 Roles (角色)。
4. 選擇 all_access 角色。
5. 選擇 Mapped users (映射的使用者) 標籤。
6. 在 Mapped users (映射的使用者) 對話頁面上,選擇 Manage mapping (管理映射)。
7. 在 Backend roles (後端角色) 下,輸入 Lambda 函數執行角色 ARN。
8. 選擇 Map (映射)。現在,您的日誌應該會串流至 OpenSearch Service 網域。
如需有關角色映射的詳細資訊,請參閱使用者的角色映射。
執行 7.8 和較早版本的 OpenSearch Service 網域
若要解決錯誤訊息,請執行下列步驟:
1. 開啟 OpenSearch Dashboards。您可以在 OpenSearch Service 主控台的網域摘要中找到 OpenSearch Dashboards 的連結。
2. 在左側導覽窗格中,選擇鎖定圖示。
3. 選取 Role mappings (角色映射)。
4. 選擇 all_access 和 security_manager 作為您的角色。
**注意:**all_access 角色只提供叢集的存取權。根據您的使用案例,您也可以新增精細存取控制至叢集。
5. 編輯 all_access 的映射。
6. 在 Backend Role (後端角色) 中,新增 Lambda 函數的執行角色,並選擇 Submit (提交)。現在,您的日誌應該會串流至 OpenSearch Service 網域。
我的 CloudWatch Logs 未傳送到我的 OpenSearch Service 網域
將 CloudWatch 日誌 (使用預設的 AWS Lambda 函數) 串流至 OpenSearch Service 網域時,您可能會遇到下列的索引錯誤:
"errorMessage": "{"statusCode":200,"responseBody":{"took":42,"errors":true}}",
**注意:**在預設情況下,AWS Lambda 錯誤會以 200 OK 回應的方式傳回。
若要對此錯誤訊息進行疑難排解,請執行下列步驟:
1. 開啟預設的 AWS Lambda 函數。
2. 尋找下列程式碼行:
"var logFailedResponses = false;"
3. 將 var logFailedResponses 的數值更新為「true」。 此更新為使用 AWS Lambda 函數的任何新索引請求提供其他資訊。您可以使用額外的資訊來識別索引問題的原因。
我遇到 cluster_block_exception 錯誤
叢集區塊的例外狀況是由下列原因所造成:
- 缺乏可用的儲存空間
- JVM 記憶體壓力過大
如需對叢集區塊例外狀況進行疑難排解的詳細資訊,請參閱 ClusterBlockException。
我的 CloudWatch 訂閱篩選條件無法透過預設 Lambda 函數 (OpenSearch Service 2.0 及更高版本) 將資料傳送到我的叢集
如果您讓 CloudWatch 訂閱篩選條件使用預設的 Lambda 函數將日誌傳送到 Amazon OpenSearch Service 2.x,則可能會收到錯誤訊息。如果訂閱篩選條件無法擷取日誌,而您看到下列錯誤,則錯誤是因為停用的參數所造成:
"{"statusCode":400,"responseBody":{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"Action/metadata line [1] contains an unknown parameter [_type]"}],"type":"illegal_argument_exception","reason":"Action/metadata line [1] contains an unknown parameter [_type]"},"status":400}}"
在 OpenSearch Service 2.0 版及更高版本中,會從 API 端點移除 _type 參數。若要解決此錯誤,您也必須從 Lambda 函數的程式碼中移除參數。
1. 開啟 AWS Lambda 主控台。
2. 為您的訂閱篩選條件選取預設 Lambda 函數。
3. 請參閱程式碼來源下的函數程式碼。
4. 尋找程式碼中定義的轉換函數。在此函數中,資料會轉換成 OpenSearch Service 的 JSON 索引格式。此程式碼的第一行看起來類似下列內容:
function transform(payload) { if (payload.messageType === 'CONTROL_MESSAGE') { return null; } var bulkRequestBody = ''; payload.logEvents.forEach(function(logEvent) { var timestamp = new Date(1 * logEvent.timestamp);
5. 在轉換函數下,尋找 _type 參數。在大多數情況下,該參數將在第 79 行。移除新增 _type 參數的程式碼行或將其設為註解。移除之後,您的程式碼看起來類似下列內容:
var action = { "index": {} }; action.index._index = indexName; //action.index._type = payload.logGroup; action.index._id = logEvent.id; bulkRequestBody += [
您現在可以成功傳送索引請求。
相關內容
- 已提問 2 個月前lg...
- 已提問 1 年前lg...
- 已提問 2 個月前lg...
- AWS 官方已更新 4 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前