

# 为 Amazon MSK 事件源映射配置 Lambda 权限
<a name="with-msk-permissions"></a>

要访问 Amazon MSK 集群，您的函数和事件源映射需要具有执行各种 Amazon MSK API 操作的权限。为函数的[执行角色](lambda-intro-execution-role.md)添加这些权限。如果您的用户需要访问权限，请将所需权限添加到用户或角色的身份策略中。

[AWSLambdaMSKExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaMSKExecutionRole.html) 托管策略包含 Amazon MSK Lambda 事件源映射所需的最低权限。要简化权限流程，您可以执行以下操作：
+ 将 [AWSLambdaMSKExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaMSKExecutionRole.html) 托管策略附加到您的执行角色。
+ 让 Lambda 控制台为您生成权限。当您在[控制台中创建 Amazon MSK 事件源映射](msk-esm-create.md#msk-console)时，Lambda 会评估您的执行角色，并在发现任何权限缺失的情况时向您发出提醒。选择**生成权限**以自动更新您的执行角色。如果您手动创建或修改了执行角色的策略，或者这些策略被附加到多个角色上，则此方法将不起作用。请注意，在使用高级功能（例如[失败时的目标](kafka-on-failure.md)或 [AWS Glue 架构注册表](services-consume-kafka-events.md)）时，您的执行角色可能仍需要额外的权限。

**Topics**
+ [所需的权限](#msk-required-permissions)
+ [可选权限](#msk-optional-permissions)

## 所需的权限
<a name="msk-required-permissions"></a>

您的 Lambda 函数执行角色必须具备以下所需的 Amazon MSK 事件源映射权限。这些权限包含在 [AWSLambdaMSKExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaMSKExecutionRole.html) 托管策略中。

### CloudWatch Logs 权限
<a name="msk-basic-permissions"></a>

以下权限使 Lambda 能够在 Amazon CloudWatch Logs 中创建和存储日志。
+ [logs:CreateLogGroup](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogGroup.html)
+ [logs:CreateLogStream](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogStream.html)
+ [logs:PutLogEvents](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html)

### MSK 集群权限
<a name="msk-cluster-permissions"></a>

以下权限使 Lambda 能够代表您访问 Amazon MSK 集群：
+ [kafka:DescribeCluster](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn.html)
+ [kafka:DescribeClusterV2](https://docs.aws.amazon.com/MSK/2.0/APIReference/v2-clusters-clusterarn.html)
+ [kafka:GetBootstrapBrokers](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn-bootstrap-brokers.html)

我们建议使用 [kafka:DescribeClusterV2](https://docs.aws.amazon.com/MSK/2.0/APIReference/v2-clusters-clusterarn.html) 而不是 [kafka:DescribeCluster](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn.html)。v2 权限适用于预置集群和无服务器 Amazon MSK 集群。您的策略中只需其中一项权限即可。

### VPC 权限
<a name="msk-vpc-permissions"></a>

以下权限使 Lambda 能够在连接到您的 Amazon MSK 集群时创建和管理网络接口：
+ [ec2:CreateNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterface.html)
+ [ec2:DescribeNetworkInterfaces](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html)
+ [ ec2:DescribeVpcs](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcs.html)
+ [ ec2:DeleteNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInterface.html)
+ [ ec2:DescribeSubnets](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSubnets.html)
+ [ ec2:DescribeSecurityGroups](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroups.html)

## 可选权限
<a name="msk-optional-permissions"></a>

 您的 Lambda 函数还可能需要权限来：
+ 访问跨账户的 Amazon MSK 集群。要进行跨账户事件源映射，您在执行角色中需要 [kafka:DescribeVpcConnection](https://docs.aws.amazon.com/msk/1.0/apireference/vpc-connection-arn.html)。创建跨账户事件源映射的 IAM 主体需要 [kafka:ListVpcConnections](https://docs.aws.amazon.com/msk/1.0/apireference/vpc-connections.html)。
+ 访问您的 SCRAM 密钥（如果使用 [SASL/SCRAM 身份验证](msk-cluster-auth.md#msk-sasl-scram)）。这样，您的函数就可以通过用户名和密码来连接到 Kafka。
+ 如果您使用 SASL/SCRAM 或 [mTLS](msk-cluster-auth.md#msk-mtls) 身份验证，则请描述您的 Secrets Manager 密钥。这样，您的函数就可以检索安全连接所需的凭证或证书。
+ 如果您的 AWS Secrets Manager 密钥使用 AWS KMS 客户托管密钥加密，请访问您的 AWS KMS 客户托管密钥。
+ 如果您使用的是带身份验证的架构注册表，请访问您的架构注册表密钥：
  + 对于 AWS Glue 架构注册表：您的函数需要 `glue:GetRegistry` 和 `glue:GetSchemaVersion` 权限。这样，您的函数就可以查找和使用存储在 AWS Glue 中的消息格式规则。
  + 对于带有 `BASIC_AUTH` 或 `CLIENT_CERTIFICATE_TLS_AUTH` 的 [Confluent 架构注册表](https://docs.confluent.io/platform/current/schema-registry/security/index.html)：您的函数需要访问密钥（包含身份验证凭证）的 `secretsmanager:GetSecretValue` 权限。这样，您的函数就可以检索访问 Confluent 架构注册表所需的用户名/密码或证书。
  + 对于私有 CA 证书：您的函数需要访问密钥（包含证书）的 secretsmanager:GetSecretValue 权限。这样，您的函数就可以验证使用自定义证书的架构注册表的身份。
+ 如果您对事件源映射使用 IAM 身份验证，则可以访问 Kafka 集群的使用者组，并从指定的主题中轮询消息。

 这些密钥对应以下所需权限：
+ [kafka:ListScramSecrets](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn-scram-secrets.html) - 让您可以列出用于 Kafka 身份验证的 SCRAM 密钥
+ [secretsmanager:GetSecretValue](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html) - 让您可以从 Secrets Manager 中检索密钥
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) - 让您可以使用 AWS KMS 对加密数据进行解密
+ [glue:GetRegistry](https://docs.aws.amazon.com/glue/latest/webapi/API_GetRegistry.html) - 让您可以访问 AWS Glue 架构注册表
+ [glue:GetSchemaVersion](https://docs.aws.amazon.com/glue/latest/webapi/API_GetSchemaVersion.html) - 让您可以从 AWS Glue 架构注册表中检索特定的架构版本
+ [kafka-cluster:Connect](https://docs.aws.amazon.com/service-authorization/latest/reference/list_apachekafkaapisforamazonmskclusters.html)：授予连接和验证集群的权限
+ [kafka-cluster:AlterGroup](https://docs.aws.amazon.com/service-authorization/latest/reference/list_apachekafkaapisforamazonmskclusters.html)：授予加入集群上群组的权限，相当于 Apache Kafka 的 READ GROUP ACL
+ [kafka-cluster:DescribeGroup](https://docs.aws.amazon.com/service-authorization/latest/reference/list_apachekafkaapisforamazonmskclusters.html)：授予描述集群上的群组的权限，相当于 Apache Kafka 的 DESCRIBE GROUP ACL
+ [kafka-cluster:DescribeTopic](https://docs.aws.amazon.com/service-authorization/latest/reference/list_apachekafkaapisforamazonmskclusters.html)：授予描述集群上的主题的权限，相当于 Apache Kafka 的 DESCRIBE TOPIC ACL
+ [kafka-cluster:ReadData](https://docs.aws.amazon.com/service-authorization/latest/reference/list_apachekafkaapisforamazonmskclusters.html)：授予从集群上的主题中读取数据的权限，相当于 Apache Kafka 的 READ TOPIC ACL

 此外，如果您想将失败调用的记录发送到失败时的目标，则需要根据目标类型获得以下权限：
+ 对于 Amazon SQS 目标：[sqs:SendMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html) - 让您可以向 Amazon SQS 队列发送消息
+ 对于 Amazon SNS 目标：[sns:Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html) - 让您可以向Amazon SNS 主题发布消息
+ 对于 Amazon S3 存储桶目标：[s3:PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) 和 [s3:ListBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucket.html) - 让您可以在 Amazon S3 存储桶中写入和列出对象

有关身份验证和授权错误的故障排除，请参阅[Kafka 事件源映射错误的故障排除](with-kafka-troubleshoot.md)