Lambda 実行ロールのアクセス許可の設定
Amazon MSK クラスターにアクセスするには、関数とイベントソースマッピングはさまざまな Amazon MSK API アクションを実行するアクセス許可を必要とします。これらのアクセス許可を、関数の実行ロールに追加します。アクセスを必要とするユーザーがいる場合、そのユーザーまたはロールのアイデンティティポリシーに必要なアクセス許可を追加します。
必要なアクセス許可をすべてカバーするには、AWSLambdaMSKExecutionRole のマネージドポリシーを実行ロールにアタッチします。または、各アクセス許可を手動で追加することもできます。
基本的なアクセス許可
CloudWatch Logs でログを作成して保存するには、Lambda 関数の実行ロールに次の必要なアクセス許可を付与してください。
クラスターのアクセス許可
Lambda がユーザーに代わって Amazon MSK クラスターにアクセスするには、Lambda 関数の実行ロールに次の許可が必要です。
-
kafka:DescribeVpcConnection: クロスアカウントのイベントソースマッピングにのみ必要です。
-
kafka:ListVpcConnections: 実行ロールには必要ありませんが、クロスアカウントのイベントソースマッピングを作成する IAM プリンシパルには必要です。
kafka:DescribeCluster または kafka:DescribeClusterV2 のうちいずれか一つを追加してください。プロビジョニングされた Amazon MSK クラスターの場合、どちらかのアクセス許可でも機能します。サーバーレス Amazon MSK クラスターの場合は kafka:DescribeClusterV2 を使用する必要があります。
注記
Lambda では今後、AWSLambdaMSKExecutionRole のマネージドポリシーから kafka:DescribeCluster のアクセス許可を削除する予定です。現在 kafka:DescribeCluster ポリシーを使用している場合、使用対象のアプリケーションを kafka:DescribeClusterV2 へ移行させてください。
VPC アクセス許可
Amazon MSK クラスターが VPC のプライベートサブネットにある場合、Lambda 関数が Amazon VPC リソースにアクセスするには追加のアクセス許可が必要です。対象となるリソースには、VPC、サブネット、セキュリティグループ、ネットワークインターフェイスが含まれます。関数の実行ロールには、次のアクセス許可が必要です。
オプションのアクセス許可
Lambda 関数には、以下を実行する許可も必要になる場合があります。
-
SASL/SCRAM 認証を使用している場合、SCRAM シークレットにアクセスします。これにより、関数はユーザー名とパスワードを使用して Kafka に接続できます。
-
SASL/SCRAM または mTLS 認証を使用している場合、Secrets Manager のシークレットを記述します。これにより、関数は安全な接続に必要な認証情報または証明書を取得できます。
-
フィルター条件を暗号化したい場合、AWS KMS カスタマーマネージドキーにアクセスします。これにより、メッセージフィルタリングルールを秘密に保持できます。
-
認証付きのスキーマレジストリを使用している場合、スキーマレジストリシークレットにアクセスします。
-
AWS Glue Glue スキーマレジストリの場合、関数には
glue:GetRegistry
とglue:GetSchemaVersion
のアクセス許可が必要です。これにより、関数は AWS Glue に保存されているメッセージ形式のルールを検索して使用できます。 -
BASIC_AUTH
またはCLIENT_CERTIFICATE_TLS_AUTH
を使用した Confluent スキーマレジストリの場合: 関数には、認証情報を含むシークレットに対する secretsmanager:GetSecretValue
アクセス許可が必要です。これにより、関数は Confluent スキーマレジストリにアクセスするために必要なユーザー名/パスワードまたは証明書を取得できます。 -
プライベート CA 証明書の場合: 関数には、証明書を含むシークレットに対する secretsmanager:GetSecretValue アクセス許可が必要です。これにより、関数はカスタム証明書を使用するスキーマレジストリの ID を検証できます。
-
この対象となるのは以下のアクセス許可です。
-
kafka:ListScramSecrets - Kafka 認証用の SCRAM シークレットのリストを許可します
-
secretsmanager:GetSecretValue - Secrets Manager からのシークレットの取得を有効にします
-
kms:Decrypt - AWS KMS を使用して暗号化されたデータの復号を許可します
-
glue:GetRegistry - AWS Glue スキーマレジストリへのアクセスを許可します
-
glue:GetSchemaVersion - AWS Glue スキーマレジストリから特定のスキーマバージョンを取得できるようにします
さらに、失敗した呼び出しのレコードを障害発生時の送信先に送信する場合、送信先タイプに応じて次のアクセス許可が必要です。
-
Amazon SQS 送信先の場合: sqs:SendMessage - Amazon SQS キューへのメッセージの送信を許可します
-
Amazon SNS 送信先の場合: sns:Publish - Amazon SNS トピックへのメッセージの発行を許可します
-
Amazon S3 バケット送信先の場合: s3:PutObject および s3:ListBucket - Amazon S3 バケット内のオブジェクトの書き込みと一覧表示を有効にします
一般的な認証および承認エラーのトラブルシューティング
Amazon MSK クラスターからのデータを消費するために必要な許可のいずれかが欠落している場合、Lambda は [LastProcessingResult] のイベントソースマッピングに以下のエラーメッセージのいずれかを表示します。それぞれのサポートされた認証方法に関する詳細については、「Lambda でのクラスターの認証方法の設定」を参照してください。
エラーメッセージ
クラスターが Lambda の認可に失敗した
SALS/SCRAM または mTLS の場合、このエラーは、指定されたユーザーが以下の必要とされる Kafka アクセスコントロールリスト (ACL) 許可のすべてを持っていないことを示します。
DescribeConfigs クラスター
グループを記述する
グループを読み取る
トピックを記述する
トピックを読み取る
IAM アクセスコントロールの場合、関数の実行ロールにグループまたはトピックへのアクセスに必要な許可が 1 つ、または複数不足しています。このページに記載された必要なアクセス許可のリストを確認してください。
必要な Kafka クラスター許可を使用して Kafka ACL または IAM ポリシーのいずれかを作成するときは、リソースとしてトピックとグループを指定します。トピック名は、イベントソースマッピングのトピックと一致する必要があります。グループ名は、イベントソースマッピングの UUID と一致する必要があります。
必要な許可を実行ロールに追加した後は、変更が有効になるまで数分間かかる場合があります。
SASL 認証に失敗した
SASL/SCRAM の場合、このエラーは指定されたユーザー名とパスワードが無効であることを示します。
IAM アクセスコントロールの場合、実行ロールに MSK クラスターに対する kafka-cluster:Connect
許可がありません。この許可をロールに追加して、クラスターの Amazon リソースネーム (ARN) をリソースとして指定します。
このエラーは断続的に発生する場合があります。クラスターは、TCP 接続の数が Amazon MSK サービスクォータを超過すると、接続を拒否します。Lambda は接続に成功するまでバックオフし、再試行します。Lambda がクラスターに接続してレコードをポーリングすると、最後の処理結果が OK
に変わります。
Server failed to authenticate Lambda (サーバーが Lambda の認証に失敗しました)
このエラーは、Amazon MSK Kafka ブローカーが Lambda の認証に失敗したことを示します。このエラーは、以下が原因で発生する可能性があります。
mTLS 認証用のクライアント証明書を提供していない。
クライアント証明書を提供したが、ブローカーが mTLS を使用するように設定されていない。
クライアント証明書がブローカーに信頼されていない。
Provided certificate or private key is invalid (提供された証明書またはプライベートキーが無効です)
このエラーは、Amazon MSK コンシューマーが提供された証明書またはプライベートキーを使用できなかったことを示します。証明書とキーが PEM 形式を使用しており、プライベートキーの暗号化が PBES1 アルゴリズムを使用していることを確認してください。詳細については「mTLS シークレットの設定」を参照してください。