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'],
})
)

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

有人解开这个谜了吗?

干杯

正如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在展示

@Elliveny给出了正确答案。这里有一个Python的代码snitbit,它做了同样的事情(因为我不能在评论中发布格式化的代码(:

from aws_cdk import (
aws_lambda as _lambda,
aws_events as events,
aws_iam as iam,
core,
)
for child in self.node.children:
if isinstance(child, events.Rule):
for eventChild in child.node.children:
if isinstance(eventChild, _lambda.CfnPermission):
child.node.try_remove_child(eventChild.node.id)

请记住,如果您这样做,您仍然需要在lambda上为";events.amazonaws.com";ServicePrincipal。类似于:

my_lambda.add_permission(
"RuleInvoke",
principal=iam.ServicePrincipal("events.amazonaws.com"),
action="lambda:InvokeFunction",
source_arn=f"arn:aws:events:{core.Aws.REGION}:{core.Aws.ACCOUNT_ID}:rule/your-rule-name-here*",
)

我遇到了类似的问题。有一个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的通配符权限

您可以通过执行此来增加lambda的内存大小

Type: AWS::Serverless::Function
Properties:
CodeUri: src/promoCodes/
Role: !GetAtt FunctionRole.Arn
Handler: promoCodesListCsvPDF.promoCodesListCsvPDF
Policies:
- AWSLambdaExecute # Managed Policy
- AWSLambdaBasicExecutionRole # Managed Policy
MemorySize: 512
Layers:
- !Ref NodeDependenciesLayer
Events:
promoCodesListCsvPDFEvent:
Type: Api
Properties:
Path: /api/promo-codes/csv-pdf
Method: POST

最新更新