Amazon OpenSearch Service ドメインにストリーミングされるように CloudWatch Logs をトラブルシューティングするにはどうすればよいですか?

最終更新日:2021年11月22日

Amazon CloudWatch Logs を自分の Amazon OpenSearch Service (Amazon Elasticsearch Service の後継サービス) ドメインにストリーミングできません。この問題をトラブルシューティングするにはどうすればよいですか?

解決方法

複数の CloudWatch ロググループを同じ OpenSearch Service ドメインにストリーミングできない

デフォルトでは、Amazon CloudWatch は OpenSearch Service ドメインごとに 1 つの AWS Lambda 関数のみを作成します。ドメインにデータをインデックス化するように複数のロググループを設定した場合、すべての複数のロググループが同じ Lambda 関数を呼び出します。最初のロググループが Lambda 関数を呼び出すと、呼び出しによってドメインにインデックスとタイプフィールドが作成されます。

Elasticsearch 6.0.0 以降で作成されたインデックスには、1 つのマッピングタイプのみを含めることができます。複数のマッピングタイプを持つ 5.x で作成されたインデックスは、Elasticsearch 6.x でも以前と同じように機能します。Elasticsearch マッピングタイプの詳細については、Elasticsearch ウェブサイトの Removal of mapping types を参照してください。

他のロググループが同じ 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 ドメインにストリーミングできない

きめ細かなアクセスコントロールを使用して OpenSearch Service ドメインに CloudWatch Logs をストリーミングすると、次の許可エラーが発生することがあります。

"{\"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 Dashboards へのリンクは、OpenSearch Service コンソールのドメインの概要にあります。

2.    左のナビゲーションペインで、ロックアイコンを選択します。

3.    [ロールマッピング] を選択します。

4.    ロールとして [all_access] および [security_manager] を選択します。

注: all_access ロールは、クラスターへのアクセスのみを提供します。ユースケースに基づいて、クラスターにきめ細かなアクセスコントロールを追加することもできます。

5.    [all_access] のマッピングを編集します。

6.    [Backend Role] (バックエンドロール) で、Lambda 関数の実行ロールを追加し、[Submit] (送信) を選択します。これで、ログが OpenSearch Service ドメインにストリーミングされます。

ロールマッピングの詳細については、ユーザーへのロールマッピングを参照してください。

Amazon 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 を参照してください。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?