使用现有策略的 AWS 网关中的无服务器白名单 IP

Serverless Whitelist IP in AWS Gateway using existing policy

我正在使用 AWS 基础设施(AWS API 网关 + Lambda)并且我想阻止对我的开发环境的外部访问,我已经使用 IAM 创建了一个策略来根据源过滤 IP IP:

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Deny",
        "Action": "execute-api:Invoke",
        "Resource": "*",
        "Condition": {
            "NotIpAddress": {
                "aws:SourceIp": [
                    "192.168.0.1"
                ]
            },
            "Bool": {
                "aws:ViaAWSService": "false"
            }
        }
    }
}

我现在要做的是将该策略附加到我使用无服务器部署的 lambda;我试过这个:

provider:
  name: aws
  runtime: nodejs12.x
  resourcePolicy:
    - arn:aws:iam::1234567890:policy/myCustomPolicy

但是没用...

我知道有些人按照无服务器文档直接创建和分配 resource policy during the lambda deployment,但我不想那样做,因为我想从 AWS 管理策略 (我不想每次更改策略时都重新部署无服务器。

有人对此有有效的示例/建议吗?

经过相当广泛的互联网研究后,显然无法从网关引用现有政策。

主要原因是网关策略是资源策略而不是 IAM 策略更多详细信息

作为替代解决方案,我最终做的是将该策略提取到一个公共文件中,我的存储库现在如下所示:

│
├── services
│   └── service-api
│     └── handler.js, serverless.yml
│
├── serverless-common.yml
└──.gitlab-ci.yml

在每个服务的 serverless.yml 文件中,我引用了无服务器中的策略-common.yml:

provider:
  name: aws
  runtime: nodejs12.x
  resourcePolicy: ${file(../../serverless.common.yml):custom.resourcePolicies.${opt:stage, 'none'}}

functions:
  hello:
    handler: handler.hello
    events:
      - http: 
          path: health
          method: get

而在无服务器中-common.yml

custom:
  resourcePolicies:
    dev:
      - Effect: Allow
        Principal: "*"
        Action: execute-api:Invoke
        Resource:
          - execute-api:/*/*/*
        Condition:
          IpAddress:
            aws:SourceIp: 
              - "176.25.129.133" # Whitelisted IP
    pro:
      - Effect: Allow
        Principal: "*"
        Action: execute-api:Invoke
        Resource:
          - execute-api:/*/*/*

这是我能找到的最清晰的解决方案,因为框架和AWS不允许你引用外部策略,至少这样你可以只在一个地方使用白名单IP并引用从无服务器部署到它。