如何为部分Lambda函数拦截VPN请求?(AWS环境)
实现仅拦截指定Lambda的VPN请求(AppSync + CDK)
核心思路
AWS托管的VPN拦截规则是全局生效的,无法直接修改其逻辑。要实现仅拦截部分Lambda的VPN请求,需通过自定义请求标识+规则优先级控制实现:给需要保护的Lambda请求打上标记,让托管规则只对带标记的请求生效,其余请求直接放行。
步骤1:给目标Lambda请求添加自定义标识
在AppSync的数据源配置中,给需要拦截VPN的Lambda请求添加自定义请求头(比如X-Protect-VPN: true),让WAF能识别这类请求。
CDK实现示例:
// 假设已创建AppSync实例appSyncApi和目标Lambda函数targetLambda const protectedLambdaDs = appSyncApi.addLambdaDataSource('ProtectedLambdaDs', targetLambda, { requestMappingTemplate: appsync.MappingTemplate.fromString(` { "version": "2018-05-29", "operation": "Invoke", "payload": { "arguments": $utils.toJson($context.arguments), "headers": { "X-Protect-VPN": "true" } } } `), });
若通过Resolver配置,也可在对应Resolver模板中添加该请求头。
步骤2:配置WAF规则优先级
- 先添加自定义放行规则:创建优先级高于托管VPN规则的自定义规则,放行所有不带
X-Protect-VPN头的请求。 - 保留托管VPN拦截规则:让托管规则仅处理带标记的请求,实现精准拦截。
CDK代码示例:
// 创建WAF WebACL并关联到AppSync const webAcl = new wafv2.CfnWebACL(this, 'AppSyncWebAcl', { defaultAction: { allow: {} }, scope: 'REGIONAL', rules: [ // 自定义放行规则:优先级1,放行不带X-Protect-VPN头的请求 { name: 'Allow-Non-Protected-Requests', priority: 1, action: { allow: {} }, statement: { notStatement: { statement: { byteMatchStatement: { fieldToMatch: { singleHeader: { name: 'X-Protect-VPN' } }, positionalConstraint: 'EXACTLY', searchString: 'true', textTransformations: [{ priority: 0, type: 'NONE' }], }, }, }, }, visibilityConfig: { cloudWatchMetricsEnabled: true, metricName: 'Allow-Non-Protected-Requests', sampledRequestsEnabled: true }, }, // 托管VPN拦截规则:优先级2,仅对带标记的请求生效 { name: 'AWSManagedRulesVPNRuleSet', priority: 2, statement: { managedRuleGroupStatement: { vendorName: 'AWS', name: 'AWSManagedRulesVPNRuleSet', }, }, action: { block: {} }, // 根据需求设置Block/Count visibilityConfig: { cloudWatchMetricsEnabled: true, metricName: 'AWSManagedRulesVPNRuleSet', sampledRequestsEnabled: true }, }, ], }); // 将WebACL关联到AppSync实例 new wafv2.CfnWebACLAssociation(this, 'AppSyncWebAclAssociation', { resourceArn: appSyncApi.arn, webAclArn: webAcl.attrArn, });
关键说明
- 为什么之前的
customRequestHandling无效?:AWS托管规则是预定义的,不支持修改其动作或添加请求头处理逻辑,customRequestHandling仅适用于自定义规则,因此直接在托管规则上配置不会生效。 - 优先级控制是核心:自定义放行规则优先级更高,先过滤掉不需要保护的请求,剩下的带标记请求才会进入托管VPN规则的检查流程。
内容的提问来源于stack exchange,提问作者Misho Radonjic
相关产品推荐
相关产品推荐

