如何解决aws-cdk LambdaRestApi:最终策略大小大于限制
嗨,我一直在尝试许多可能性,但现在我需要一些帮助。
我正在使用aws-cdk通过代码创建体系结构,到目前为止一切进展顺利。现在我遇到了这个问题:
The final policy size is bigger than the limit (20480)
了解它的含义,但我不知道如何解决。
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 举报,一经查实,本站将立刻删除。