当前位置: 首页 > 知识库问答 >
问题:

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

鲜于喜
2023-03-14

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

我使用aws-cdk通过代码创建架构,到目前为止一切顺利。现在我碰到这个问题:

最终策略大小大于限制(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,
    })

我在创建endpoint时使用了23次addMethod

例如


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

因为只有一个lambda用于从apigateway调用,所以我很好奇,我如何才能控制只有一个用于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'],
      })
    )

但是我遇到了不同的错误。

有人解开这个谜了吗?

干杯

共有2个答案

叶煌
2023-03-14

我碰到了类似的问题。有一个CDK问题如果得到解决可能会有助于解决,

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

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

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

短期修复方法可能是使用RestApi而不是LambdaRestApi,直接创建lambda集成,将allowTestInvoke选项设置为false。

我所做的另一件事是创建多个lambda,它们以相同的方式工作,但连接到不同的路由(例如,相同的代码、权限等,只是不同的逻辑id),以稍微减少策略文档的大小。

我的html" target="_blank">开发时间有点紧迫,因此需要解决问题。就我个人而言,我认为正确的解决方案是在CDK中修复它,并提出一个PR,这样LambdaRestApi就做了用户期望的事情,所有人都可以获得lambda的通配符许可

充子航
2023-03-14

正如Ian Walters提到的CDK问题中所建议的,剥离生成的方法权限为我解决了这个问题。我正在使用。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为我们指路

 类似资料:
  • 在hazelcast映射配置中,如果我们将逐出策略设置为“无”,并使用最大空闲秒数、生存时间秒数,如下所示, 有人能解释一下,在这种情况下,最大尺寸是否有效?

  • 问题内容: 我想限制a的最大大小,以对正在实现的各种哈希算法进行度量。我在的一个重载构造函数中查看了loadfactor 。 我尝试在构造函数中将loadFactor设置为0.0f(这意味着我不希望HashMap的大小从EVER增大),但将此无效: 还有另一种方法来限制它的大小,使其永远不会增长吗? 问题答案: 有时越简单越好。

  • 问题内容: 我正在使用JVM标志运行Java进程,并看到以下输出: 有没有办法解决这个问题? 问题答案: 当无法满足Java堆的分配或永久生成时,命令行选项告诉HotSpot VM生成堆转储。使用此选项运行不会产生任何开销,因此对于OutOfMemoryError需要很长时间才能浮出水面的生产系统很有用。 为了解决您面临的特定问题,可以使用以下纠正措施之一: 措施1: XX:HeapDumpSeg

  • 问题内容: 我有一个含含。该包含一组秒。我正在其中加载很多文本(大约8k-10k个字符)。 尽管滚动有点滞后,但布局工作正常。 真正的问题是,它似乎,和有硬32767大小的限制,所以当任何增长高于,不能滚动任何进一步显示文本的最后1/3。 在下面,您可以看到该问题的最小示例。我使用了NetBeans 设计器,因此它可能有点冗长,但是我从默认设置更改的唯一一件事是s是的直接子级,滚动条策略和稍大的字

  • 在Log4J2中,当大小超过指定阈值时,我希望修剪写入控制台附加器的消息的结尾。 知道吗?

  • 我正在运行一个WordPress站点(不是MU),我在php中设置了upload\u max\u filesize=50M,post\u max\u size=50M。伊尼。phpinfo()函数的结果显示该值为50M,但在WordPress Media uploader中,最大上载文件大小仍然为32M。 我也尝试在主题的functions.php写这段代码: @ini_设置(“上传最大尺寸”,“