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

上次更新日期:2021 年 11 月 22 日

我無法將 Amazon CloudWatch Logs 串流到 Amazon OpenSearch Service (Amazon Elasticsearch 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 函數。

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

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


此文章是否有幫助?


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