Amazon OpenSearch Service ドメインにストリーミングされるように CloudWatch Logs をトラブルシューティングするにはどうすればよいですか。
Amazon CloudWatch Logs を自分の Amazon OpenSearch Service ドメインにストリーミングできません。この問題をトラブルシューティングするにはどうすればよいですか?
解決方法
複数の CloudWatch ロググループを同じ OpenSearch Service ドメインにストリーミングできない
デフォルトでは、Amazon CloudWatch は OpenSearch Service ドメインごとに 1 つの AWS Lambda 関数のみを作成します。ドメインにデータをインデックス化するように複数のロググループを設定した場合、すべての複数のロググループが同じ Lambda 関数を呼び出します。最初のロググループが Lambda 関数を呼び出すと、呼び出しによってドメインにインデックスとタイプフィールドが作成されます。
Amazon OpenSearch Service 6.0.0 以降で作成されたインデックスには、1 つのマッピングタイプしか含めることができません。5.x で複数のマッピングタイプを使用して作成されたインデックスは、OpenSearch Service 6.x でも以前と同様に機能します。Elasticsearch マッピングタイプの詳細については、Elasticsearch ウェブサイトの「Removal of mapping types」(マッピングタイプの削除) を参照してください。
他のロググループが同じ Lambda 関数を呼び出そうとすると、呼び出しは失敗し、次のエラーメッセージが表示されます。
"reason": "Rejecting mapping update to [
] 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_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 は AWS Lambda 関数を作成します。
7.9 以降を実行している OpenSearch Service ドメイン (OpenSearch バージョン 1.x を含む)
エラーメッセージを解決するには、次のステップを実行します。
1. OpenSearch Dashboards を開きます。OpenSearch Dashboards へのリンクは、OpenSearch Service コンソールのドメインの概要にあります。
2. ナビゲーションペインで、[セキュリティ] を選択します。
3. ロールを選択します。
4. [all_access] ロールを選択します。
5. [マッピングされたユーザー] タブを選択します。
6. [マップされたユーザー] ダイアログページで、[マッピングの管理] を選択します。
7. [バックエンドロール] で、Lambda 関数実行ロール ARN を入力します。
8. [マッピング] を選択します。これで、ログが OpenSearch Service ドメインにストリーミングされます。
ロールマッピングの詳細については、「ユーザーへのロールのマッピング」を参照してください。
7.8 以前を実行している OpenSearch Service ドメイン
エラーメッセージを解決するには、次のステップを実行します。
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 = false;"
3. var logFailedResponses の値を [true] に更新します。 この更新では、AWS Lambda 関数を使用した新しいインデックス作成リクエストに関する追加情報が提供されます。追加情報を使用して、インデックス作成の問題の原因を特定できます。
cluster_block_exception エラーが表示されます。
クラスターブロック例外は、以下によって発生します。
- 空きストレージ容量の不足
- 過剰な JVM メモリプレッシャー
クラスターブロック例外のトラブルシューティングの詳細については、「ClusterBlockException」を参照してください。
CloudWatch サブスクリプションフィルターが、デフォルトの Lambda 関数 (OpenSearch Service 2.0 以降) を使用してクラスターにデータを送信できない
デフォルトの Lambda 関数を使用して Amazon OpenSearch Service 2.x にログを送信する 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 以降では、 _type パラメータが API エンドポイントから削除されています。このエラーを解決するには、Lambda 関数のコードからパラメータも削除する必要があります。
1. AWS Lambda コンソールを開きます。
2. サブスクリプションフィルターのデフォルトの Lambda 関数を選択します。
3. [Code source] (コードソース) で関数のコードを参照してください。
4. コードで定義されている変換関数を探します。この関数内で、データは 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. 変換関数の下で、 _type パラメーターを探します。ほとんどの場合、これは 79 行目にあります。_type パラメータを追加するコード行を削除またはコメントアウトします。削除すると、コードは次のようになります。
var action = { "index": {} }; action.index._index = indexName; //action.index._type = payload.logGroup; action.index._id = logEvent.id; bulkRequestBody += [
インデックス作成リクエストを正常に送信できるようになりました。

関連するコンテンツ
- 質問済み 3ヶ月前lg...
- 質問済み 2ヶ月前lg...
- 質問済み 3年前lg...
- 質問済み 5年前lg...
- AWS公式更新しました 2年前