【问题标题】:AWS CDK - how to grant invoke permissions on a Lambda to API Gateway before deployment?AWS CDK - 如何在部署之前将 Lambda 的调用权限授予 API Gateway?
【发布时间】:2020-09-23 20:55:47
【问题描述】:

这个问题与我在这里遇到的一个问题有关:AWS CDK how to create an API Gateway backed by Lambda from OpenApi spec?

我使用 OpenAPI 规范和 AWS CDK 创建了一个 API 网关。 API 由 Lambda 支持,APIG 需要权限才能调用 Lambda。

当我授予 APIG 调用我的 lambda 的权限时:

myLambda.addPermission("PermitAPIGInvocation", Permission.builder()
                                  .action("lambda:InvokeFunction")
                                  .principal(ServicePrincipal.Builder.create("apigateway.amazonaws.com")
                                     .build())
                                  .sourceArn(mySpecRestApi.arnForExecuteApi())
                                  .build());

然后,当我尝试调用 API 端点时,我收到 500 错误“Lambda 函数的权限无效”,直到我重新部署了 API。使用 APIG 控制台测试 lambda 时没有问题。

如何让 ApiGateway 自动运行而无需人工干预?即如何确保我的 lambda 具有必要的权限?

【问题讨论】:

  • 您能说明如何将 lambda 附加到 CDK 项目中的 apigw 吗?
  • 本身没有附件,APIG 是通过 SpecRestApi 创建的,并且在 OAS 规范的 x-amazon-apigateway-integration 节中,uri 属性指向 APIG 调用 ARN 和 credentials 属性具有允许调用所有 lambdas 的角色。
  • 使用 CDK 创建 APIGW 并将 lambda 附加到它时...据我所知,CDK 会为您添加 invokeFunction 权限。
  • 是的,当你使用RestApi时似乎是这样,但当你使用SpecRestApi时不是这样。
  • 这会很奇怪,因为 SpecRestApi 以及 RestApi 扩展了 RestApiBase。而且我在 RestApi 类中看不到任何特殊权限处理。对不起。无法帮助您解决这个问题,因为我没有可用的 APIGW 测试堆栈。

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


【解决方案1】:

使用 OpenAPI 规范配置 API 网关有点困难。您确实需要谨慎设置正确的 URI 和凭据。此外,凭证似乎无法替代。确保您的 lambda 和角色也已部署。

对我有用的是定义角色并在规范中设置以下内容:

const apiRole = new Role(scope, 'apiRole', {
  roleName: 'apiRole',
  assumedBy: new ServicePrincipal('apigateway.amazonaws.com'),
});

apiRole.addToPolicy(new PolicyStatement({
  resources: ['*'],
  actions: ['lambda:InvokeFunction'] }));

在规范中:

x-amazon-apigateway-integration:
    uri: "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:optionsApi/invocations"
    passthroughBehavior: "when_no_match"
    httpMethod: "POST"
    type: "aws_proxy"
    credentials: "arn:aws:iam::111111122222:role/apiRole"

【讨论】:

    猜你喜欢
    • 2016-10-27
    • 2017-02-15
    • 1970-01-01
    • 2019-04-29
    • 2022-10-13
    • 2017-04-13
    • 1970-01-01
    • 2020-07-17
    • 2019-12-28
    相关资源
    最近更新 更多