使用 AWS-CDK 的跨堆栈 Lambda 和 API 网关权限
Cross-Stack Lambda and API Gateway Permissions with AWS-CDK
我有两个代码库。一个定义了一个服务(服务 A),其中包括一个查询 dynamoDB table.
的 AWS lambda
另一个,定义了一个需要调用多个服务 lambdas 的聚合 API 网关。
API 网关使用跨堆栈引用导入在服务 A 中定义的 lambda,并为其创建 Lambda 集成:
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))
当 API 被调用时它失败了,大概是因为 apigateway 服务没有被赋予调用权限。
在服务 A 的 aws-cdk 项目中,我添加了以下内容:
queryTracksFunction.grantInvoke(new ServicePrincipal('apigateway.amazonaws.com'))
当我尝试部署服务时出现此错误:
Error: Cannot use tokens in construct ID: Invoke{"Service":["${Token[TOKEN.139]}"]}
这是一个错误。作为解决方法,在您的服务 A 中,您可以执行以下操作:
queryTracksFunction.addPermission('APIGateway', {
principal: new iam.ServicePrincipal('apigateway.amazonaws.com')
});
我有两个代码库。一个定义了一个服务(服务 A),其中包括一个查询 dynamoDB table.
的 AWS lambda另一个,定义了一个需要调用多个服务 lambdas 的聚合 API 网关。
API 网关使用跨堆栈引用导入在服务 A 中定义的 lambda,并为其创建 Lambda 集成:
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))
当 API 被调用时它失败了,大概是因为 apigateway 服务没有被赋予调用权限。
在服务 A 的 aws-cdk 项目中,我添加了以下内容:
queryTracksFunction.grantInvoke(new ServicePrincipal('apigateway.amazonaws.com'))
当我尝试部署服务时出现此错误:
Error: Cannot use tokens in construct ID: Invoke{"Service":["${Token[TOKEN.139]}"]}
这是一个错误。作为解决方法,在您的服务 A 中,您可以执行以下操作:
queryTracksFunction.addPermission('APIGateway', {
principal: new iam.ServicePrincipal('apigateway.amazonaws.com')
});