CloudWatch Logs が Amazon ES ドメインにストリーミングされるようにトラブルシューティングする方法を教えてください。

最終更新日: 2020 年 10 月 6 日

Amazon CloudWatch Logs を Amazon Elasticsearch Service (Amazon ES) ドメインにストリーミングできません。この問題のトラブルシューティング方法を教えてください。

解決方法

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

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

Elasticsearch バージョン 6.0 以降では、マッピングタイプは 1 つのみ使用できます。Elasticsearch バージョン 5.x から 6.x にも同じルールが適用されます。Elasticsearch マッピングタイプの詳細については、Elasticsearch ウェブサイトの What are 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('.');

この構文は、Amazon ES ドメインにストリーミングするさまざまなロググループに対して複数のインデックスを作成します。次に、更新された Lambda 関数を保存して、Amazon ES ドメインにストリーミングする複数のロググループに対して個別のインデックスを作成します。

同じ AWS アカウントの VPC ベースの Amazon ES ドメインにストリーミングできない

重要: CloudWatch ロググループを VPC ベースの Amazon ES ドメインにストリーミングする前に、必ず 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 の Elasticsearch クラスターに書き込むことができます。

Lambda 関数にポリシーをアタッチしたら、VPC の Amazon ES ドメインへのログのストリーミングを開始します。

きめ細かなアクセスコントロールが有効になっている場合、CloudWatch ロググループを Amazon ES ドメインにストリーミングできない

きめ細かなアクセスコントロールを使用して Amazon ES ドメインに 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 関数ログからこのエラーメッセージを受け取った場合、ロールのマッピングが不完全であることを示します。

注意: デフォルトでは、Amazon ES によって AWS Lambda 関数が作成されます。 

エラーメッセージを解決するには、以下の手順を実行します。

1.    Kibana を開きます。Kibana へのリンクは、Amazon ES コンソールのドメイン概要にあります。

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

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

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

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

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

6.    [バックエンドロール] で、Lambda 関数の実行ロールを追加し、[送信] をクリックします。これで、ログが Amazon ES ドメインにストリーミングされます。

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

cluster_block_exception エラーが表示される

クラスターブロック例外は、以下によって発生します。

  • 空きストレージ容量の不足
  • 過剰な JVM メモリプレッシャー

クラスターブロック例外のトラブルシューティングの詳細については、ClusterBlockException を参照してください。</p


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


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