Lambda 実行ロールのアクセス許可の設定 - AWS Lambda

Lambda 実行ロールのアクセス許可の設定

Amazon MSK クラスターにアクセスするには、関数とイベントソースマッピングはさまざまな Amazon MSK API アクションを実行するアクセス許可を必要とします。これらのアクセス許可を、関数の実行ロールに追加します。アクセスを必要とするユーザーがいる場合、そのユーザーまたはロールのアイデンティティポリシーに必要なアクセス許可を追加します。

必要なアクセス許可をすべてカバーするには、AWSLambdaMSKExecutionRole のマネージドポリシーを実行ロールにアタッチします。または、各アクセス許可を手動で追加することもできます。

基本的なアクセス許可

CloudWatch Logs でログを作成して保存するには、Lambda 関数の実行ロールに次の必要なアクセス許可を付与してください。

クラスターのアクセス許可

Lambda がユーザーに代わって Amazon MSK クラスターにアクセスするには、Lambda 関数の実行ロールに次の許可が必要です。

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:GetRegistryglue: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 シークレットの設定」を参照してください。