AWS CDK - 如何在部署之前向 API Gateway 授予 Lambda 上的调用权限?

Joh*_*ohn 4 amazon-web-services aws-cloudformation aws-lambda aws-api-gateway aws-cdk

这个问题与我在这里遇到的一个问题有关:AWS CDK 如何根据 OpenApi 规范创建由 Lambda 支持的 API 网关?

我使用 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());
Run Code Online (Sandbox Code Playgroud)

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

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

小智 8

使用 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'] }));
Run Code Online (Sandbox Code Playgroud)

并在规范中:

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"
Run Code Online (Sandbox Code Playgroud)