CloudWatch ログを OpenSearch Service ドメインにストリーミングするためのトラブルシューティング方法はありますか?
Amazon CloudWatch ログを Amazon OpenSearch Service ドメインにストリーミングできません。
解決方法
同じ OpenSearch Service ドメインに複数の CloudWatch ロググループをストリーミングできません。
デフォルトでは、Amazon CloudWatch は各 OpenSearch Service ドメインに 1 つの AWS Lambda 関数しか作成しません。ドメインにデータをインデックス化するために複数のロググループを設定した場合、すべての複数のロググループは同じ Lambda 関数を呼び出します。最初のロググループが Lambda 関数を呼び出すと、インデックスとタイプフィールドがドメインに作成されます。
OpenSearch Service 6.0.0 以降で作成されたインデックスは、単一のマッピングタイプのみを含むことができます。5.x で作成されたインデックスには複数のマッピングタイプがある場合、OpenSearch Service 6.xでも引き続き機能します。OpenSearch Service のマッピングタイプ非推奨に関する詳細は、Elastic ウェブサイトの マッピングタイプの削除 を参照してください。
他のロググループが同じ 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 関数が VPC 内のクラスターに CloudWatch ロググループを書き込むことを許可します。
ポリシーを Lambda 関数に添付した後、VPC 内のOpenSearch Service ドメインにログをストリーミングできます。
細かいアクセス制御が有効な場合、CloudWatch ロググループを OpenSearch Service ドメインにストリーミングできません
細かいアクセス制御が有効な OpenSearch Service ドメインに CloudWatch ログをストリーミングする場合、次のようなエラーが発生することがあります。
"{\"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 は Lambda 関数を作成します。
7.9 以降 の OpenSearch Service ドメイン (OpenSearch バージョン 1.x を含む)
エラーメッセージを解決するために、以下の手順を実行してください。
1. OpenSearch Dashboards を開きます。OpenSearch Service コンソールのドメインの概要に OpenSearch Dashboards へのリンクがあります。
2. ナビゲーションペインから、[セキュリティ] を選択します。
3. [ロール] を選択します。
4. [all_access] ロールを選択します。
5. [マップされたユーザー] タブを選択します。
6. [マップされたユーザー] ダイアログページで、[マッピングの管理] を選択します。
7. [バックエンドロール] の下に、Lambda 関数の実行ロールの ARN を入力します。
8. マップ] を選択します。これでログが OpenSearch Service ドメインにストリーミングされます。
ロールマッピングに関する詳細は、「ユーザーへのロールのマッピング」を参照してください。
OpenSearch Service ドメイン (バージョン 7.8 およびそれ以前)
エラーメッセージを解決するために、以下の手順を実行してください。
1. OpenSearch Dashboards を開きます。OpenSearch Service コンソールのドメインの概要に OpenSearch Dashboards へのリンクがあります。
2. ナビゲーションペインでロックアイコンを選択します。
3. [ロールマッピング] を選択します。
4. ロールとして all_access と security_manager を選択します。
注記: all_access ロールはクラスターへのアクセスのみを提供します。ユースケースに応じて、クラスターに細かいアクセス制御を追加することもできます。
5. all_access のマッピングを編集します。
6. バックエンドロールに Lambda 関数の実行ロールを追加し、[送信] を選択します。これでログが OpenSearch Service ドメインにストリーミングされます。
CloudWatch ログは OpenSearch Service ドメインに配信されません。
CloudWatch ログを OpenSearch Service ドメインにストリーミングするためにデフォルトの Lambda 関数を使用する際、以下のエラーが発生することがあります。
"errorMessage": "{\"statusCode\":200,\"responseBody\":{\"took\":42,\"errors\":true}}","
注記: デフォルトでは、Lambda のエラーは 200 OK の応答として返されます。
このエラーメッセージのトラブルシューティングには、以下の手順を実行してください。
1. デフォルトの Lambda 関数を開きます。
2. 次のコード行を見つけます。
"var logFailedResponses = false;"
3. var logFailedResponses の値を true に更新します。この更新により、Lambda 関数を使用する新しいインデックスリクエストに対して追加情報が提供されます。追加情報を使用して、インデックスの問題の原因を特定できます。
cluster_block_exception エラーが発生しています。
空きストレージスペースの不足または過剰なJVMメモリ圧力がクラスターブロック例外の原因です。
詳細については、「Amazon OpenSearch Service クラスターの高い JVM メモリ圧力のトラブルシューティング方法」を参照してください。
CloudWatch サブスクリプションフィルターがデフォルトの Lambda 関数 (OpenSearch Service 2.0 以降) を介してデータをクラスターに送信できません。
OpenSearch Service 2.xにデフォルトのLambda関数を使用して CloudWatch サブスクリプションフィルターでログを送信している場合、エラーが発生する可能性があります。サブスクリプションフィルターがログを取り込めず、以下のエラーが表示された場合、非アクティブなパラメーターがエラーの原因です。
"{\"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. コードで定義されている transform 関数を見つけます。この関数では、データが 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. transform 関数の下に、_type パラメーターを見つけます。ほとんどの場合、これは 79 行目にあります。_type パラメーターを追加するコード行を削除またはコメントアウトします。削除後、コードは次のコードのようになります。
var action = { "index": {} }; action.index._index = indexName; //action.index._type = payload.logGroup; action.index._id = logEvent.id; bulkRequestBody += [
これで正常にインデックスリクエストを送信できるようになります。
関連するコンテンツ
- 質問済み 4ヶ月前lg...
- 質問済み 8ヶ月前lg...