如何對 CloudWatch Logs 進行疑難排解,以便將其串流至 Amazon OpenSearch Service 網域?

3 分的閱讀內容
0

我無法將 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_accesssecurity_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 += [

您現在可以成功傳送索引請求。


AWS 官方
AWS 官方已更新 1 年前