首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为Lambda函数创建MSK事件源映射失败

为Lambda函数创建MSK事件源映射失败
EN

Stack Overflow用户
提问于 2022-01-18 18:47:23
回答 1查看 840关注 0票数 0

我正在使用AWS创建一个具有AWS集群的堆栈和一个应该在特定主题中可用的新消息时触发的Lambda函数。

我已经让它运行得很好了,然后我决定添加clientAuthentication,现在我被困住了。我使用SASL/SCRAM进行身份验证。我已经通过KMS服务创建了一个自定义加密密钥,并且在SecretsManager中的一个秘密中使用该密钥。我已经将这个秘密与我的MSK集群联系起来,并在那里打开了clientAuthentication。

我还在我的VPC中为Lambda创建了一个接口端点,以便该服务能够访问我的集群(同样,当我没有激活clientAuthentication时,这已经起作用了)。

现在,我正在定义Lambda侦听器处理程序函数,如下所示:

代码语言:javascript
运行
复制
const listener = new aws_lambda.Function(this, 'ListenerHandler', {
  vpc,
  vpcSubnets: { subnetGroupName: 'ListenerPrivate' },
  runtime: aws_lambda.Runtime.NODEJS_14_X,
  code: aws_lambda.Code.fromAsset('lambda'),
  handler: 'listener.handler'
});

listener.addToRolePolicy(new aws_iam.PolicyStatement({
  effect: Effect.ALLOW,
  actions: ['kafka:*', 'kafka-cluster:*', 'secretsmanager:DescribeSecret', 'secretsmanager:GetSecretValue'],
  resources: [cluster.ref]
}));

const secretsFromLambdaAccessRole = new aws_iam.Role(this, 'AccessSecretsFromLambdaRoles', {
  assumedBy: new aws_iam.ServicePrincipal('kafka.amazonaws.com')
});
secretsFromLambdaAccessRole.addToPolicy(new aws_iam.PolicyStatement({
  effect: Effect.ALLOW,
  actions: ['secretsmanager:DescribeSecret', 'secretsmanager:GetSecretValue'],
  resources: [KAFKA_ACCESS_SECRET_ARN]
}));

listener.role?.addManagedPolicy(
    aws_iam.ManagedPolicy
        .fromAwsManagedPolicyName("service-role/AWSLambdaVPCAccessExecutionRole")
);

listener.role?.addManagedPolicy(
    aws_iam.ManagedPolicy
        .fromAwsManagedPolicyName("service-role/AWSLambdaMSKExecutionRole")
);

const kafkaAccessSecret = aws_secretsmanager.Secret
    .fromSecretCompleteArn(this, 'kafkaAccessSecret', KAFKA_ACCESS_SECRET_ARN);

listener.addEventSource(new ManagedKafkaEventSource({
  clusterArn: cluster.ref,
  topic: "MyTopic",
  startingPosition: StartingPosition.LATEST,
  secret: kafkaAccessSecret,
}));

这个秘密也有政策分配给它:

代码语言:javascript
运行
复制
{
    "Version" : "2012-10-17",
    "Statement" : [ {
        "Sid" : "AWSLambdaResourcePolicy",
        "Effect" : "Allow",
        "Principal" : {
            "Service" : "lambda.amazonaws.com"
        },
        "Action" : [ "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret", "secretsmanager:ListSecretVersionIds" ],
        "Resource" : "arn:aws:secretsmanager:some-region:some-account:secret:AmazonMSK_some-secret"
    }, {
        "Sid" : "AWSKafkaResourcePolicy",
        "Effect" : "Allow",
        "Principal" : {
            "Service" : "kafka.amazonaws.com"
        },
        "Action" : "secretsmanager:GetSecretValue",
        "Resource" : "arn:aws:secretsmanager:some-region:some-account:secret:AmazonMSK_some-secret"
    } ]
}

现在,当我试图通过CDK部署lambda函数时,到了应该添加事件源映射的位置时,我得到了以下错误:

代码语言:javascript
运行
复制
Failed resources:
MskExampleStack | 17:23:22 | CREATE_FAILED        | AWS::Lambda::EventSourceMapping       | ListenerHandler/KafkaEventSource:MskExampleStackListenerHandler4711MyTopic (ListenerHandlerKafkaEventSourceMskExampleStackListenerHandler4711MyTopic0815) 
Resource handler returned message: "Invalid request provided: Cannot access secret manager value arn:aws:secretsmanager:some-region:some-account:secret:AmazonMSK_dev-some-secret.
Please ensure the role can perform the 'secretsmanager:GetSecretValue' action on your broker in IAM. (Service: Lambda, Status Code: 400, Request ID: 123456789, Extended Request ID: null)" (RequestToken: 987654321, HandlerErrorCode: InvalidRequest)

我不知道,我错过了什么。错误指的是什么角色?我需要在哪里添加“秘经理: action”这个动作?我的用户拥有完整的管理权限。

EN

回答 1

Stack Overflow用户

发布于 2022-04-25 23:54:40

你需要以下几点:

  1. kms权限对lambda角色的权限
  2. (我所缺少的) kms密钥策略中的lambda.amazonaws.com

我的设置:

lambda权限:

代码语言:javascript
运行
复制
    - Effect: "Allow"
      Action:
        - kms:Decrypt
        - kms:GenerateDataKey*
      Resource:
        - "*"
    - Effect: "Allow"
      Action:
        - secretsmanager:GetSecretValue
      Resource:
        - "your secret arn"

KMS政策:

代码语言:javascript
运行
复制
      {
            "Sid": "Decrypt",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "lambda.amazonaws.com"
                ]
            },
            "Action": [
                "kms:GenerateDataKey*",
                "kms:Decrypt",
            ],
            "Resource": "*"
        }

Amazon有一个技巧,可以编写大约500个不必要的文字来记录一个特性,并且从不用KMS记录与该功能相关的东西,尽管它似乎有很大的差异。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70760870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档