3

我试图从VPC内部的lambda函数访问VPC外部的Kinesis流。目前,当写入kinesis流的代码被执行时,它会挂起然后超时。当我从VPC中取出lambda时,写入流的代码正常工作。但我需要访问VPC内的资源,然后写入流。有人知道怎么修这个东西吗?从VPC内部访问VPC之外的AWS资源 - 无服务器框架

这里是我的功能就是在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: "*" 

最后这里是我的室壁运动流资源

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

回答

4

唯一的解决办法是向您的VPC添加NAT Gateway(或NAT instance),以便像y这样的资源我们驻留在私有子网中的Lambda函数将有权访问VPC之外的资源。

+0

是的,谢谢你的回答。我刚刚完成创建一个NAT网关,它现在似乎工作。我偶然发现了解释这个过程的要点:https://gist.github.com/reggi/dc5f2620b7b4f515e68e46255ac042a7 –

+0

你知道这样做是否有任何潜在的安全隐患吗? –

+3

@realseanp VPC NAT网关只允许内部启动的连接,不允许外部启动的连接,因此您的内部资源不会使用此设置公开。基本上没有办法用本质上不安全的配置来建立NAT网关。 –