aws-cdk LambdaRestApi:最终策略大小大于限制

如何解决aws-cdk LambdaRestApi:最终策略大小大于限制

嗨,我一直在尝试许多可能性,但现在我需要一些帮助。

我正在使用aws-cdk通过代码创建体系结构,到目前为止一切进展顺利。现在我遇到了这个问题:

The final policy size is bigger than the limit (20480)

了解它的含义,但我不知道如何解决

我正在创建一个lambda函数来处理所有请求:

const router = new lambda.Function(this,apiName + '-handler-temp',{
      runtime: LambdaRuntime,// execution environment
      code: lambda.Code.fromAsset('bin/lambda'),// code loaded from "lambda" directory
      handler: 'index.handler',// file is "index",function is "handler"
      vpc: vpc,environment: {
        DB_HOST: props?.rdsEndpoint as string,DB_USER: props?.rdsDbUser as string,DB_PASS: props?.rdsDBPass as string,DB_PORT: props?.rdsPort as string,DB_DIALECT: props?.rdsDbSchema as string,DB_DATABASE: props?.rdsdbname as string,},layers: [layer],timeout: Duration.seconds(30),memorySize: 1024,})

和LambdaRestApi的定义如下:

const api = new LambdaRestApi(this,apiName,{
      handler: router,proxy: false,cloudWatchRole: false,description: 'API for Backend',deployOptions: {
        stageName: 'prod',domainName: domainProperties,})

我正在使用23次addMethod创建端点。

例如


const user = api.root.addResource('user')
user.addMethod(HttpMethod.POST)
user.addMethod(HttpMethod.GET)
user.addMethod(HttpMethod.PATCH)

由于仅从apigateway调用一个lambda,我很好奇,我如何才能控制仅一个用于lambda执行的策略,并且它不会每次都创建一个新的。

我也尝试添加属性 role: role到具有以下角色定义的lambda函数

const role = new Role(this,apiName + 'ApiGWPermissions',{
      assumedBy: new ServicePrincipal('apigateway.amazonaws.com'),})

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

但是后来我遇到了不同的错误

有人解决了这个难题吗?

欢呼

解决方法

我遇到了类似的问题。如果解决了CDK问题,则可能会帮助解决该问题,

https://github.com/aws/aws-cdk/issues/9327

还值得注意的是,默认情况下,lambda集成将allowTestInvoke设置为true,这几乎会使策略文档的大小增加一倍。

尽管我不确定是否可以使用LambdaRestApi来更改lambda的集成选项,但我是直接使用RestApi

一个短期解决方案可能是使用RestApi而不是LambdaRestApi并通过将allowTestInvoke选项设置为false直接创建lambda集成。

我做过的另一件事是创建了多个lambda,它们的工作方式相同,但是附加了不同的路由(例如,相同的代码,权限等,只是不同的逻辑ID),从而也减小了策略文档的大小一点。

我对开发时间有些压力,因此需要解决方法。就我个人而言,我认为正确的解决方案是将其修复在CDK中并提出PR,以使LambdaRestApi能够满足用户的期望,并对所有人的lambda进行通配符许可

,

正如 Ian Walters 提到的 CDK issue 所建议的,剥离生成的方法权限为我解决了这个问题。我正在使用 .Net,但我希望该方法适用于所有语言实现。此函数删除权限:

public void StripMethodPermissions(ConstructNode node) {
    foreach (var child in node.Children) {
        if (child is Amazon.CDK.AWS.APIGateway.Method) {
            var method = ((Amazon.CDK.AWS.APIGateway.Method)child);
            var permissions = method.Node.Children.Where(c => c is Amazon.CDK.AWS.Lambda.CfnPermission);
            foreach (var permission in permissions) {
                child.Node.TryRemoveChild(permission.Node.Id);
            }
        }
        if (child.Node.Children.Length > 0) StripMethodPermissions(child.Node);
    }
}

我正在使用这样的技术:

var api = new RestApi(this,"MyRestApi",new RestApiProps {
    RestApiName = "MyRestApiV1"
});

var handlerLambda = new Function(this,"RequestHandler",new FunctionProps {
    Runtime = Runtime.DOTNET_CORE_3_1,...
});

// Add resources and methods which use the handlerLambda here

// Remove all generated permissions
StripMethodPermissions(api.Root.Node);

// Add a single invoke permission for the lambda
handlerLambda.GrantInvoke(new ServicePrincipal("apigateway.amazonaws.com"));

感谢nija-at指路

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?