You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为部分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规则优先级

  1. 先添加自定义放行规则:创建优先级高于托管VPN规则的自定义规则,放行所有不带X-Protect-VPN头的请求。
  2. 保留托管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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:52:16