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

上次更新日期:2022 年 1 月 20 日

我無法將 Amazon CloudWatch Logs 串流到 Amazon OpenSearch Service 網域。如何對此問題進行疑難排解?

解決方案

我無法將多個 CloudWatch 日誌群組串流至相同的 OpenSearch Service 網域

在預設情況下,Amazon CloudWatch 只會為每個 OpenSearch Service 網域建立一個 AWS Lambda 函數。如果您設定多個日誌群組,以便在網域中編製資料索引,則所有多個日誌群組都會叫用相同的 Lambda 函數。當第一個日誌群組叫用 Lambda 函數時,該叫用將會在您的網域中產生索引和類型欄位。

在 Elasticsearch 6.0.0 或更新版本中建立的索引只能包含單一映射類型。在具有多種映射類型的 5.x 中建立的索引將繼續像以前一樣在 Elasticsearch 6.x 中運行。如需有關 Elasticsearch 映射類型取代的詳細資訊,請參閱在 Elasticsearch 網站上的移除映射類型

當其他日誌群組嘗試叫用相同的 Lambda 函數時,叫用失敗會顯示下列錯誤訊息:

"reason": "Rejecting mapping update to [<index_name>] as the final mapping would have more than 1 type: [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_elasticsearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_elasticsearch_execution], requestedTenant=null]\"}],\"type\":\"security_exception\",\"reason\":\"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456789101:role/lambda_elasticsearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_elasticsearch_execution], requestedTenant=null]\"},\"status\":403}}"

如果您從 Lambda 函數日誌收到這個錯誤訊息,則代表角色映射不完整。

注意:在預設情況下,OpenSearch Service 會為您建立 AWS Lambda 函數。

執行 7.9 和更新版本的 Amazon OpenSearch 網域 (包括 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 和較早版本的 Amazon OpenSearch 網域

若要解決錯誤訊息,請執行下列步驟:

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 Logs (使用預設的 AWS Lambda 函數) 串流至 OpenSearch Service 網域時,您可能會遇到下列的索引錯誤:

"errorMessage": "{\"statusCode\":200,\"responseBody\":{\"took\":42,\"errors\":true}}",

注意:在預設情況下,AWS Lambda 錯誤會以 200 OK 回應的方式傳回。

若要對此錯誤訊息進行疑難排解,請執行下列步驟:

1.    開啟預設的 AWS Lambda 函數。

2.    尋找下列程式碼行:

"var logFailedResponses = true;"

3.    將 var logFailedResponses 的數值更新為 “true”。此更新為使用 AWS Lambda 函數的任何新索引請求提供其他資訊。您可以使用額外的資訊來識別索引問題的原因。

我遇到 cluster_block_exception 錯誤

叢集區塊的例外狀況是由下列原因所造成:

  • 缺乏可用的儲存空間
  • JVM 記憶體壓力過大

如需對叢集區塊例外狀況進行疑難排解的詳細資訊,請參閱 ClusterBlockException

Amazon OpenSearch Service 是 Amazon Elasticsearch Service 的後繼者。


此文章是否有幫助?


您是否需要帳單或技術支援?