当前位置: 首页 > 知识库问答 >
问题:

使用AWS-CDK实现跨栈Lambda和API网关权限

江飞白
2023-03-14

我有两个代码库。一个定义了一个服务(服务a),它包括一个查询dynamoDB表的AWS lambda。

另外,定义了一个需要调用多个服务lambda的聚合API网关。

API网关使用交叉堆栈引用导入服务A中定义的lambda并为其创建lambda集成:

null

    const queryTrackFunction = lambda.Function.import(this, 'TrackQueryServiceQueryTrackFunction', {
      functionArn: cdk.Fn.importValue('TrackQueryServiceStack:QueryTrackFunctionArn')
    })

    const customerApi = new api.RestApi(this, 'CustomerAPI')
    
    const tracks = customerApi.root.addResource('tracks')
    tracks.addMethod('GET', new api.LambdaIntegration(queryTrackFunction))

null

当API被调用时,它会失败,这可能是因为没有向apigateway服务授予invoke权限。

在服务A的aws-cdk项目中,我添加了以下内容:

null

queryTracksFunction.grantInvoke(new ServicePrincipal('apigateway.amazonaws.com'))

null

当我尝试部署服务时,我会遇到以下错误:

错误:无法在构造ID中使用令牌:Invoke{“service”:[“${token[token.139]}”]}

共有1个答案

岳正阳
2023-03-14

这是个窃听器。作为一种变通方法,在您的服务a中,您可以执行以下操作:

queryTracksFunction.addPermission('APIGateway', {
  principal: new iam.ServicePrincipal('apigateway.amazonaws.com')
});
 类似资料:
  • 我遵循的方法是,我为每组用户创建一个单独的Cognito用户池。 当用户登录时,他将通过适当的用户池进行身份验证。 为了调用后续的API,我计划使用Lambda Authorizer。 我遇到了下面的链接,以验证ID令牌。 https://github.com/awslabs/aws-support-tools/blob/master/cognito/decode-verify-jwt/decod

  • 我的WEB API托管在Docker中。我的Angular客户机将发送一个JWT令牌来访问这些API中的任何一个。我想利用AWS API网关特性在调用请求的API客户端之前添加一个授权检查。从文档中,我看到我们可以利用Lambda授权器的概念来实现这一点。但我又想了一下为什么要使用Lambda Authorizer,因为我可以想出一个可以验证用户的DOT NET CORE API。 我的Lambd

  • 我的(非常简单的)代码看起来是这样的: 我将构建好的jar上传到Lambda,并通过创建一个测试事件在AWS控制台中进行测试。它返回正确的响应,正如预期的那样。 但是,我希望API网关调用这个Lambda。我既使用了Lambda代理集成,也定义了自己的主体映射模板。我似乎无法使它工作,我一直得到: 我确定这是一件很简单的事情,我只是错过了一些东西...

  • 如何克服AWS CDK中的循环依赖问题:让我们假设我有一个用于ECS集群的堆栈和一个用于ECS服务的堆栈(其中的几个): 如果有一种方法可以强制ECS服务堆栈首先部署,这将解决问题,但AWS CDK似乎总是首先部署依赖项(在我的例子中是ECS集群),这将导致部署失败。那么有没有办法克服这一点呢?

  • 我试图创建一个集中的日志存储桶,然后使用lambda和AWS-cdk记录所有其他s3存储桶。已创建了集中式日志存储桶,但在使用lambda对其进行写入时出错。这是我的代码:导入boto3 S3=boto3.resource('s3') 注意:除了这个日志传递权限之外,一切都可以正常工作,因为当我通过aws控制台启用它时,它可以正常工作,但是,我需要以编程方式执行它!先谢谢你。