将 Lambda 函数分配给 serverless.yml 中的特定 VPC ID

Posted

技术标签:

【中文标题】将 Lambda 函数分配给 serverless.yml 中的特定 VPC ID【英文标题】:Assign Lambda Function To Specific VPC ID in serverless.yml 【发布时间】:2018-02-23 05:49:48 【问题描述】:

我正在使用无服务器框架将 Python lambda 函数部署到 AWS。在我的 serverless.yml 文件中,我定义了一个函数,我需要将它部署到具有特定 ID 的 VPC,因为只有该 VPC 具有从 lambda 函数发出一些与业务相关的请求所需的网络连接。

  customer_callback:
    vpc:
      subnetIds:
        - subnet-something
    handler: myservice/event_stream.customer_callback

在文档中,上面的示例是他们提到的将函数附加到 VPC 的一种方式:

https://serverless.com/framework/docs/providers/aws/guide/functions/

但是,该功能根本没有部署到 VPC,例如我最终得到:

我尝试过像这样直接指定 VPC ID:

  customer_callback:
    vpc:
      id: vpc-something
    handler: myservice/event_stream.customer_callback

但这也无济于事。这个问题的文档基本上是不存在的,我尝试了很多,所以我最终不得不在这里发帖寻求帮助。

【问题讨论】:

你好,理查德,你找到解决方案了吗?我正在尝试将我的 lambda 函数附加到默认 vpc,但没有成功:( @ЕлинЙ。下面的答案不适合你吗? @dashmug 谢谢,确实有效。我还有其他一些错误,这就是为什么我一开始认为它不起作用。 你好理查德!您是否找到了使用特定 VPC id 部署功能的解决方案?我遇到了完全相同的问题,出现以下错误:“EC2 错误代码:InvalidGroup.NotFound。EC2 错误消息:安全组 'sg-cfd1ccbd' 不存在” 【参考方案1】:

来自https://serverless.com/framework/docs/providers/aws/guide/functions/#vpc-configuration:

此对象应包含为此函数构造 VPC 所需的 securityGroupIds 和 subnetIds 数组属性。

functions:
  customer_callback:
    handler: myservice/event_stream.customer_callback
    vpc:
      securityGroupIds:
        - sg-deadbeef
      subnetIds:
        - subnet-fadecafe

您还需要添加 VPC IAM 权限。

Lambda 函数执行角色必须具有创建、描述和删除弹性网络接口 (ENI) 的权限。提供 VPC 配置时,默认 AWS AWSLambdaVPCAccessExecutionRole 将与您的 Lambda 执行角色相关联。

为此,请在您的 serverless.yml 中添加以下内容:

resources:
  Resources:
    AWSLambdaVPCAccessExecutionRole:
      Type: AWS::IAM::ManagedPolicy
      Properties:
        Description: Creating policy for vpc connetion.
        Roles:
          - "Ref" : "IamRoleLambdaExecution"
        PolicyDocument:
            Version: '2012-10-17'
            Statement:
            - Effect: Allow
              Action:
                - ec2:CreateNetworkInterface
                - ec2:DescribeNetworkInterfaces
                - ec2:DeleteNetworkInterface
              Resource: "*"

【讨论】:

我相信 OP 是在询问有关部署到特定 VPC ID 的问题。我有同样的场景,我可以很好地部署到默认 VPC,但是当我指定存在于不同 VPC 中的安全组/子网组合时,它会引发错误“安全组 'xxx' 不存在” @lukiffer 您指的是专用租赁 VPC 吗? @lukiffer 你是对的。我的回答仅适用于默认 VPC。我还没有看到任何关于非默认 VPC 的信息。

以上是关于将 Lambda 函数分配给 serverless.yml 中的特定 VPC ID的主要内容,如果未能解决你的问题,请参考以下文章

将函数分配给变量

为啥我应该将函数分配给 javascript 中的变量? [复制]

将数据从一个函数分配给另一个函数

将 C++ 成员函数分配给 C 函数指针

将JavaScript函数分配给变量的效果[重复]

如何将函数分配给 Javascript 对象的属性?