从VPC内部访问VPC之外的AWS资源 - 无服务器框架

时间:2017-02-24 21:34:45

标签: amazon-web-services aws-lambda serverless-framework aws-vpc

我正在尝试从VPC内的lambda函数访问VPC外部的kinesis流。目前,当执行写入kinesis流的代码时,它将挂起然后超时。当我将lambda从VPC中取出时,写入流的代码工作正常。但我需要访问VPC中的资源,然后写入流。有人知道怎么修这个东西吗?

这是我在VPC中的功能

functions:
  handleChanges:
    handler: functions/handlers.handleChanges
    timeout: 10
    package:
      include:
        - functions/utils/**
    events:
      - http:
          method: POST
          path: "/"
          integration: lambda
    vpc:
      securityGroupIds:
        - ${file(./private.yml):variables.securityGroup}
      subnetIds:
        - ${file(./private.yml):variables.subnetID}

这是我的政策

iamRoleStatements:
  - Effect: "Allow"
    Action:
      - "kinesis:PutRecord"
      - "kinesis:GetRecords"
      - "kinesis:GetShardIterator"
      - "kinesis:DescribeStream"
      - "kinesis:ListStreams"
    Resource:
      Fn::GetAtt:
        - KinesisStream
        - Arn
  - Effect: "Allow"
    Action:
      - "cognito-idp:AdminGetUser"
    Resource: "*"
  - Effect: "Allow"
    Action:
      - "logs:CreateLogGroup"
      - "logs:CreateLogStream"
      - "logs:PutLogEvents"
      - "ec2:CreateNetworkInterface"
      - "ec2:DescribeNetworkInterfaces"
      - "ec2:DeleteNetworkInterface"
    Resource: "*"

最后这是我的kinesis流资源

KinesisStream:
  Type: AWS::Kinesis::Stream
  Properties:
    Name: ${self:provider.environment.STREAM_NAME}
    ShardCount: 1

3 个答案:

答案 0 :(得分:4)

唯一的解决方案是向您的VPC添加NAT Gateway(或NAT instance),以便驻留在您的私有子网中的Lambda函数等资源可以访问VPC之外的资源。

答案 1 :(得分:1)

不需要NAT,您也可以使用VPC端点进行此操作: https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html 这就是对Kinesis进行的操作: https://docs.aws.amazon.com/streams/latest/dev/vpc.html

为我工作:)并便宜一些。 确保设置正确的安全组(私有VPC的Sg,而不是默认VPC的)

如果您将阅读NAT定价文档,他们也建议这样做: https://aws.amazon.com/vpc/pricing/ 阅读最后的注释:

<!-- ko with: user -->    
<button data-bind="click: $root.showData">POS User</button>
<!-- /ko -->

self.showData = function (user) { ... };

答案 2 :(得分:-3)

本文似乎对这个问题有完整的解决方案: https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/

我按照说明进行操作,并为现有的VPC创建了所有内容,而我在VPC中的lambda函数仍然无法访问我想要的外部资源(AWS识别)。但是,在我放弃现有的VPC并使用本文开头所述的“ VPC”向导创建了一个新的“具有公共子网和私有子网的VPC”之后,此方法便可以使用。我不知道为什么。