【问题标题】:Cross-Stack Lambda and API Gateway Permissions with AWS-CDK使用 AWS-CDK 的跨堆栈 Lambda 和 API 网关权限
【发布时间】:2019-04-29 17:53:26
【问题描述】:

我有两个代码库。其中一个定义了一项服务(服务 A),其中包含一个查询 dynamoDB 表的 AWS lambda。

另一个,定义了一个需要调用多个服务 lambda 的聚合 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'))

当我尝试部署服务时出现此错误:

错误:无法在构造 ID 中使用标记:Invoke{"Service":["${Token[TOKEN.139]}"]}

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation aws-api-gateway aws-cdk


    【解决方案1】:

    这是一个错误。作为一种解决方法,在您的服务 A 中,您可以执行以下操作:

    queryTracksFunction.addPermission('APIGateway', {
      principal: new iam.ServicePrincipal('apigateway.amazonaws.com')
    });
    

    【讨论】:

    • 这会使您的 lambda 暴露于通过 apigateway 从不同的 AWS 账户执行吗?
    • 这行得通吗?当我为导入的函数(从另一个堆栈)添加这个时,cdk 没有输出任何新资源,猜这是一个 cdk 错误..
    猜你喜欢
    • 2020-07-17
    • 2022-01-03
    • 2020-12-13
    • 1970-01-01
    • 2022-01-20
    • 2019-11-18
    • 2021-02-18
    • 1970-01-01
    • 2020-04-14
    相关资源
    最近更新 更多