Amazon MSK クラスターとセルフマネージド Apache Kafka クラスターからポーリングする Lambda トリガーに関するトラブルシューティング方法を教えてください。
AWS Lambda 関数を、Amazon Managed Streaming for Apache Kafka (Amazon MSK) クラスターまたはセルフマネージド Apache Kafka クラスターのレコードを処理するように設計しましたが、イベントソースマッピングで Lambda 関数が呼び出されません。
簡単な説明
Lambda 関数を呼び出すには、Apache Kafka のイベントソースマッピングが以下のアクションを実行できる必要があります。
- クラスターと通信する。
- トピックからのレコードをポーリングする。
- Lambda Invoke API と通信する。
- AWS Security Token Service (AWS STS) と通信する。
イベントソースマッピングのネットワーク、認証、または承認の設定によって上記のアクションを実行できない場合、イベントソースマッピングは関数を呼び出せず、エラーが発生します。
解決策
Amazon MSK トリガーまたはセルフマネージド Kafka トリガーで Lambda 関数を設定した後に、Lambda により、自動的に新しいイベントソースマッピングリソースが作成されます。このイベントソースマッピングは、Lambda 関数から独立したリソースです。イベントソースマッピングは Kafka クラスターのレコードをポーリングし、そのレコードをペイロードにバンドルします。次に、Lambda Invoke API が呼び出され、ペイロードが Lambda 関数に配信されて処理されます。発生したエラーごとに次のトラブルシューティング手順を実行し、ポーリングの失敗に関する問題をトラブルシューティングします。
重要: Lambda イベントソースマッピングは、Lambda 関数の仮想プライベートクラウド (VPC) ネットワーク設定を継承しません。Amazon MSK トリガーにも、セルフマネージド Kafka トリガーにも、これは当てはまります。Amazon MSK イベントソースマッピングは、ターゲット MSK クラスターに設定したサブネットとセキュリティグループの設定を使用します。セルフマネージド Kafka トリガーには、デフォルトでワイドエリアネットワーク (WAN) アクセスがあります。ただし、同じ AWS アカウントと AWS リージョンの VPC へのネットワークアクセスを設定することもできます。ネットワーク設定は分離されているため、Kafka クラスターへのルートがないネットワーク内で Lambda 関数を設定できます。
マルチ VPC プライベート接続を設定し、クロスアカウントの MSK クラスターからレコードをポーリングするように Amazon MSK イベントソースマッピングを設定します。別のアカウントの MSK クラスターから消費するセルフマネージド Kafka トリガーを作成できることに注意してください。ただし、このソリューションには欠点もあります。たとえば、ターゲットクラスターが MSK クラスターであっても、セルフマネージド Kafka トリガーで AWS Identity and Access Management (IAM) 認証を使用することはできません。VPC ピア接続で MSK クラスターに接続するには、VPC の回避策も設定する必要があります。アーキテクチャの例については、「ゴールドマン・サックスが、AWS PrivateLink を使用して Amazon MSK クラスターへのクロスアカウント接続を構築」を参照してください。
注: マルチ VPC 接続を使用するための要件を満たしていることを確認します。
トリガーとクラスター間のネットワーク通信に関する問題のトラブルシューティング
イベントソースマッピングは、クラスターブローカーのエンドポイントに複数の異なるリクエストを送信して、Lambda 関数の呼び出しを 1 回完了します。呼び出しの前に、イベントソースマッピングは、クラスターのメタデータ情報とトピックのレコードをクラスターブローカーのエンドポイントに問い合わせます。呼び出しが成功すると、イベントソースマッピングはブローカーのエンドポイントと通信して、処理されたレコードをコミットします。イベントソースマッピングがブローカーエンドポイントにリクエストを送信したが、応答を受け取らない場合、リクエストはタイムアウトします。次のエラーが発生します。
"問題: 接続エラー。イベントソースの接続設定を確認してください。イベントソースが VPC にある場合は、同じ VPC、サブネット、セキュリティグループ設定で新しい Lambda 関数または EC2 インスタンスをセットアップしてみてください。新しいデバイスを Kafka クラスターに接続し、メッセージを使用して、問題が VPC またはエンドポイントの設定に関連していないことを確認します。新しいデバイスがメッセージを使用できる場合は、Lambda カスタマーサポートに連絡して詳細な調査を依頼してください。"
ブローカーリクエストのタイムアウトは、リクエストがブローカーエンドポイントに到達する前または後に発生する可能性があります。ブローカーより前のタイムアウトは、ネットワークとセキュリティグループの設定により、イベントソースマッピングのブローカーエンドポイントへのリクエストがブロックされた場合に発生します。ブローカーより後のタイムアウトリクエストは、ブローカーがイベントソースマッピングのリクエストを受信したが、リクエストを完了できない場合に発生します。
障害発生時のブローカーの状態を確認し、ブローカーより後のタイムアウトリクエストを調査します。問題が発生したときにクラスターがオフラインだった場合は、クラスターが復帰して使用可能になった後に、イベントソースマッピングを再度アクティブ化します。リクエストのタイムアウトは、クラスターのディスク容量が不足している場合や、CPU 使用率が 100% に達した場合、またはブローカーエンドポイントに障害が発生した場合にも発生します。イベントソースマッピングのバッチサイズを 1 に設定してから、トリガーを再度アクティブにすることで、これらの問題を解決します。バッチサイズを大きい値に設定すると、クラスターの応答時間が長くなることに注意してください。
ブローカーのアクセスログとシステムログで詳細を確認し、タイムアウトしたエラーをトラブルシューティングします。
リクエストがブローカーエンドポイントに到達する前にリクエストがタイムアウトした場合は、ネットワーク設定を確認してください。
Amazon MSK イベントソースマッピングのネットワーク設定を確認する
MSK クラスターと通信するために、Amazon MSK イベントソースマッピングは、クラスターが使用する各サブネットにハイパープレーンエラスティックネットワークインターフェイスを作成します。イベントソースマッピングは Lambda が所有するリソースです。ただし、Amazon MSK イベントソースマッピングは Lambda 関数の VPC 設定を使用しません。代わりに、イベントソースマッピングは、ターゲット MSK クラスターで構成されているサブネットとセキュリティグループの設定を自動的に使用します。次に、Amazon MSK イベントソースマッピングにより、MSK クラスターが使用する各サブネット内にネットワークインターフェイスが作成されます。これらのネットワークインターフェイスは、MSK クラスターが使用するのと同じセキュリティグループを使用します。
次の手順を実行し、セキュリティグループが必要なトラフィックとポートを許可しているかどうかを確認します。
- AWS CLI コマンド describe-cluster を実行し、MSK クラスターが使用するすべてのセキュリティグループとサブネットを一覧表示します。
- describe-cluster コマンドの出力にリストされているセキュリティグループに対して describe-security-groups コマンドを実行し、インバウンドルールとアウトバウンドルールをすべて表示します。
- セキュリティグループと MSK クラスター間のトラフィックを許可するように、リストされているセキュリティグループのルールを設定します。また、ブローカーが使用する以下のオープン認証ポート経由のトラフィックを許可する必要があります。
9092 (プレーンテキスト)
9094 (TLS)
9096 (SASL)
9098 (IAM)
443 (アウトバウンドルール) (すべての構成)
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
セルフマネージド Kafka イベントソースマッピングのネットワーク設定を確認する
デフォルトでは、セルフマネージド Kafka イベントソースマッピングは WAN にアクセスできますが、VPC にはアクセスできません。Kafka クラスター内の特定のサブネットとセキュリティグループへの VPC アクセスを、手動で設定することができます。ただし、イベントソースマッピングがクラスターにアクセスできるのは、クラスターが Lambda 関数を含むアカウントにある場合のみです。次のいずれかの場所にある Kafka クラスターで、セルフマネージド Kafka イベントソースマッピングを作成できます。
- オンプレミスデータセンター
- 別のクラウドプロバイダー
- 別のアカウントの VPC にある Kafka クラスターの Amazon MSK ブローカー
初期化、ポーリング、呼び出し中に発生する問題のトラブルシューティング
初期化、ポーリング、または呼び出し中に問題が発生すると、次のエラーが表示されます。
"問題: 接続エラー。イベントソース VPC は、Lambda と STS、Secrets Manager (イベントソース認証が必要な場合)、OnFailure Destination (設定されている場合) に接続できる必要があります。PrivateLink または NAT ゲートウェイを設定することでアクセスを許可できます。VPC エンドポイント/NAT ゲートウェイの設定方法については、https://aws.amazon.com/blogs/compute/setting-up-aws-lambda-with-an-apache-kafka-cluster-within-a-vpc/ をご覧ください。
上記のエラーは、次のいずれかの理由で発生します。
- イベントソースマッピングが VPC で設定されており、AWS STS API への呼び出しが失敗またはタイムアウトする。
- イベントソースマッピングは Secrets Manager クラスター認証を使用するように設定されているが、Secrets Manager API への呼び出しが失敗またはタイムアウトする。
- イベントソースマッピングは Kafka クラスターにアクセスしてレコードを正常にポーリングできるが、Lambda API への呼び出しが失敗またはタイムアウトする。
- イベントソースマッピングは、Amazon Simple Storage Service (Amazon S3)、Amazon Simple Notification Service (Amazon SNS) などの障害発生時の宛先を使用して設定されているが、関数呼び出しがエラーで終了すると、障害発生時の宛先の API への呼び出しが失敗するか、タイムアウトする。
上記の問題は、セキュリティグループまたはルーティングテーブルの設定により、イベントソースマッピングが他のサービスに到達できない場合に発生します。このようなサービスには、AWS STS、Lambda、AWS Secrets Manager が該当します。VPC 設定を正しく設定するために、「VPC 内の Apache Kafka クラスターを使用して AWS Lambda を設定する」の手順を実行してください。
以下のアクションを実行し、セルフマネージド Kafka イベントソースマッピングにおけるこれらの問題を解決します。
- セルフマネージド Kafka イベントソースマッピングが使用するサブネットを含む VPC に、Lambda VPC エンドポイントと STS VPC エンドポイントを作成します。
- シークレットを使用してイベントソースマッピングを設定した場合は、Secrets Manager 用の VPC エンドポイントを作成します。
- 障害発生時の宛先を使用してイベントソースマッピングを設定した場合は、障害発生時の宛先用の VPC エンドポイントを作成します。宛先の例としては、Amazon SNS や Amazon S3 などがあります。
- セルフマネージド Kafka イベントソースマッピングのセキュリティグループからのポート 443 でのインバウンドトラフィックを許可するセキュリティグループを含め、VPC エンドポイントを設定します。
- セルフマネージド Kafka イベントソースマッピングのセキュリティグループを、ポート 443 の VPC エンドポイントのセキュリティグループへのアウトバウンドトラフィックを許可するように設定します。
次のアクションを実行し、Amazon MSK イベントソースマッピングにおけるこれらの問題を解決します。
- MSK クラスターを含む VPC に Lambda VPC エンドポイントと STS VPC エンドポイントを作成します。
- イベントソースマッピングがシークレットを使用する場合、またはクラスターが SASL IAM 認証を使用する場合は、Secrets Manager 用の VPC エンドポイントを作成します。このエンドポイントは、MSK クラスターを含む VPC 内にある必要があります。
- 障害発生時の宛先を使用してイベントソースマッピングを設定した場合は、障害発生時の宛先用の VPC エンドポイントを作成します。宛先の例としては、Amazon SNS や Amazon S3 などがあります。この VPC エンドポイントは、MSK クラスターを含む VPC 内にある必要があります。
- MSK クラスターが使用するセキュリティグループからのポート 443 でのインバウンドトラフィックを許可するセキュリティグループを使用して VPC エンドポイントを設定します。
重要: Lambda 関数のセキュリティグループではなく、MSK クラスターセキュリティグループからのインバウンドトラフィックを許可します。 - MSK クラスターのセキュリティグループを、ポート 443 の VPC エンドポイントのセキュリティグループへのアウトバウンドトラフィックを許可するように設定します。
VPC ポリシーまたは実行ロールに関する問題のトラブルシューティング
実行ロールに問題を確認する
STS VPC エンドポイントリソースポリシーに設定上の問題がある場合、次のエラーが表示されます。
"問題: Lambda は関数実行ロールを引き受けることができませんでした。"
次の操作を実行し、このエラーを解決します。
- IAM ロールの信頼ポリシーにおいて、lambda.amazonaws.com サービスプリンシパルが信頼されたサービスとして含まれていることを確認します。
- STS VPC エンドポイントポリシーによって、Lambda サービスプリンシパルが sts:AssumeRole の呼び出しを許可していることを確認します。VPC の設定方法の詳細については、「ネットワークセキュリティを設定する」を参照してください。
Lambda VPC エンドポイントに制限の厳しい VPC エンドポイントポリシーがある場合、次のエラーが表示されます。
"lambda:InvokeFunction アクションを許可する VPC エンドポイントポリシーがありません"
これらの問題を解決するために、Lambda VPC エンドポイントポリシーで Lambda サービスプリンシパルが lambda:InvokeFunction を呼び出すことを許可していることを確認します。
注: 障害発生時の宛先は、Amazon Simple Queue Service (Amazon SQS) キュー、Amazon SNS トピック、または Amazon S3 バケットに設定できます。これらの宛先を使用するときは、VPC エンドポイントポリシーが Lambda 実行ロールからの必要なアクションを許可していることを確認してください。
シークレットへのアクセスに関する問題を確認する
Secrets Manager シークレットへのアクセスに問題がある場合は、次のエラーが表示されます。
"問題: Lambda は secretsmanager:GetSecretValue を呼び出すことができません。理由: User: Lambda 実行ロールは、次の実行を許可されていません: secretsmanager:GetSecretValue リソース: Secrets Manager のシークレットにおいて、VPC エンドポイントポリシーで明示的に拒否されています。"
この問題を解決するには、VPC エンドポイントリソースポリシーにおいて、Lambda 実行ロールがシークレットの secretsmanager:GetSecretValue を呼び出すことを許可している必要があります。Secrets Manager からシークレットを取得するために、Lambda は Lambda サービスプリンシパルではなく実行ロールを使用します。
シークレットに関する問題のトラブルシューティング
シークレットの設定を確認する
シークレットがイベントソースマッピングで使用できる形式でない場合、次のエラーが表示されます。
"問題: 証明書、プライベートキーは PEM 形式である必要があります。"
この問題を解決するには、.pem 形式のキーが X.509 証明書ファイル内にあることを確認します。次のコマンドを実行し、証明書が正しい形式であることを確認します。
openssl x509 -in PEM FILE -text
注: PEM FILE は、お使いの .pem ファイル名に置き換えます。
さらに、秘密鍵の暗号化には PBES2 アルゴリズムではなく PBES1 アルゴリズムを使用していることを確認してください。
詳細については、「指定された証明書またはプライベートキーが無効になる」(Amazon MSK) または、「クライアント証明書のシークレットを設定する」(セルフマネージド Kafka) を参照してください。
シークレット値の形式を確認する
サーバーへのログインに失敗すると、次のエラーが表示されます。
"問題: SASL 認証を行えませんでした。"
Amazon MSK トピックが Lambda 関数を呼び出すときに、関数は Secrets Manager が SASL/SCRAM で保護しているユーザー名とパスワードにアクセスできます。Lambda がユーザー名とパスワードを有効なものとして認識しない場合に、上記のエラーが発生します。この問題を解決するためには、ブローカーにログインし、アクセスログを確認します。詳細については、「SASL/SCRAM 認証」(Amazon MSK) または、「SASL/SCRAM 認証」(セルフマネージド Kafka) を参照してください。
イベントソースマッピングのサーバー設定に関する問題のトラブルシューティング
イベントソースマッピングが DNS サーバーに到達できることを確認する
イベントソースマッピングでホスト名を IP アドレスに変換できない場合は、次のエラーが表示されます。
"問題: 提供された Kafka ブローカーエンドポイントを解決できません。"
この問題を解決するためには、イベントソースマッピングがホスト名を変換する DNS サーバーに到達できることを確認します。エンドポイントのホスト名がプライベートネットワークにある場合は、ホスト名を解決できる DNS 設定がある VPC を使用するようにイベントソースマッピングを設定します。
イベントソースマッピングサーバーの設定を確認する
サーバーがイベントソースマッピング設定で構成したサーバーと異なる場合、次のエラーが表示されます。
"問題: サーバーが Lambda を認証できなかったか、Lambda がサーバーの認証に失敗しました。"
設定内のサーバーホスト名が、接続先のサーバーの内部サーバー名と一致していることを確認し、この問題を解決します。
イベントソースマッピングに、クラスターのトピックからレコードをポーリングするアクセス許可があることを確認する
イベントソースマッピングがポーリングレコードにアクセスできない場合、次のエラーが表示されます。
"問題: クラスターが Lambda を認証できませんでした。"
MSK クラスターまたはセルフマネージド Kafka クラスターで Lambda を認証するために必要なアクセス許可を設定することで、この問題を解決します。
関連情報
関連するコンテンツ
質問済み 1年前
質問済み 1年前
