如何對 CloudWatch Logs 進行疑難排解,以便將其串流至 Amazon OpenSearch Service 網域?
上次更新日期:2022 年 12 月 13 日
我無法將 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 [
如要解決問題,首先使用下列語法更新您的 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 錯誤
我的 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 += [
您現在可以成功傳送索引請求。