VPC中的AWS Lambda有时无法访问互联网

时间:2018-07-17 11:14:16

标签: amazon-web-services aws-lambda amazon-cloudformation

我有已部署到VPC的Lambda。

此deploymens具有下一个配置:

  • VPC(192.168.0.0/16)
  • 公共子网A(192.168.32.0/20)具有NAT网关,并且路由0.0.0.0/0到Internet网关
  • 专用子网A(192.168.48.0/20)的路由0.0.0.0/0到NAT网关
  • 私有子网B(192.168.64.0/20)

Lambda拥有自己的Securiy Group,并引用“私有子网A”和“私有子网B”

我有一个奇怪的问题: Lambda有时无法访问Internet 。第三方服务正常。

Lambda从子网(192.168.48.0/20和192.168.64.0/20)获得IP而不是从子网获得IP的另一个奇怪之处是127.0.0.1、169.254.76.13、169.254.79.1。

错误:

Error: connect ETIMEDOUT x.x.x.x:443
at Object._errnoException (util.js:1022:11)
at _exceptionWithHostPort (util.js:1044:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1198:14)

部署架构: enter image description here

这里有完整的CloudFormation模板:

    ---
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Base Infrastructure'
Metadata:
  'AWS::CloudFormation::Interface':
    ParameterGroups:
    - Label:
        default: 'VPC Parameters'
      Parameters:
      - VpcId
      - InternetGatewayId
Parameters:
  VpcId:
    Type: String
  InternetGatewayId:
    Type: String
Resources:
  SubnetAPublic:
    Type: 'AWS::EC2::Subnet'
    Properties:
      AvailabilityZone: !Select [0, !GetAZs '']
      CidrBlock: !Sub '192.168.32.0/20'
      MapPublicIpOnLaunch: true
      VpcId: !Sub '${VpcId}'
  SubnetAPrivate:
    Type: 'AWS::EC2::Subnet'
    Properties:
      AvailabilityZone: !Select [0, !GetAZs '']
      CidrBlock: !Sub '192.168.48.0/20'
      VpcId: !Sub '${VpcId}'
  SubnetBPrivate:
    Type: 'AWS::EC2::Subnet'
    Properties:
      AvailabilityZone: !Select [1, !GetAZs '']
      CidrBlock: !Sub '192.168.64.0/20'
      VpcId: !Sub '${VpcId}'
  RouteTablePublic:
    Type: 'AWS::EC2::RouteTable'
    Properties:
      VpcId: !Sub '${VpcId}'
  RouteTablePrivate:
    Type: 'AWS::EC2::RouteTable'
    Properties:
      VpcId: !Sub '${VpcId}'
  RouteTableBPrivate:
    Type: 'AWS::EC2::RouteTable'
    Properties:
      VpcId: !Sub '${VpcId}'
  RouteTableAssociationAPublic:
    Type: 'AWS::EC2::SubnetRouteTableAssociation'
    Properties:
      SubnetId: !Ref SubnetAPublic
      RouteTableId: !Ref RouteTablePublic
  RouteTableAssociationAPrivate:
    Type: 'AWS::EC2::SubnetRouteTableAssociation'
    Properties:
      SubnetId: !Ref SubnetAPrivate
      RouteTableId: !Ref RouteTablePrivate
  RouteTableAssociationBPrivate:
    Type: 'AWS::EC2::SubnetRouteTableAssociation'
    Properties:
      SubnetId: !Ref SubnetBPrivate
      RouteTableId: !Ref RouteTableBPrivate
  EIP:
    Type: 'AWS::EC2::EIP'
    Properties:
      Domain: vpc
  NatGateway:
    Type: 'AWS::EC2::NatGateway'
    Properties:
      AllocationId: !GetAtt 'EIP.AllocationId'
      SubnetId: !Ref SubnetAPublic
  RouteTablePublicInternetRoute:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref RouteTablePrivate
      DestinationCidrBlock: '0.0.0.0/0'
      NatGatewayId: !Ref NatGateway
  RouteTablePublicInternetRoute2:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref RouteTablePublic
      DestinationCidrBlock: '0.0.0.0/0'
      GatewayId: !Sub '${InternetGatewayId}'
  ServerlessSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: SecurityGroup for Serverless Functions
      VpcId: !Sub '${VpcId}'
  ServerlessSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: !Ref ServerlessSecurityGroup
      IpProtocol: -1
      SourceSecurityGroupId: !Ref ServerlessSecurityGroup

有什么想法我做错了吗?

P.S .:我发现了类似的问题AWS VPC Lambda Function keeps losing internet accessWhy AWS lambda functions In a VPC sometimes timeout and sometimes work fine?

UPD

添加了路线,现在可以使用

  RouteTableBPrivateInternetRoute:
    Type: AWS::EC2::Route
      Properties:
        RouteTableId: !Ref RouteTableBPrivate
        DestinationCidrBlock: '0.0.0.0/0'
        NatGatewayId: !Ref NatGateway

2 个答案:

答案 0 :(得分:1)

要使在VPC内运行的AWS Lambda函数能够访问VPC之外的资源(例如Internet),它必须位于具有NAT网关的专用子网中。在您的实例中,私有子网A是唯一具有适当配置的子网,以允许Lambda函数访问Internet。因此,您需要编辑Lambda函数的配置以仅在该子网中运行。

答案 1 :(得分:0)

您是否已选择公共子网作为运行lambda的子网之一?

当Lambda在私有子网中运行时,它只能访问Internet,因此请转到AWS控制台上的Lambda页面,取消选择公共子网并保存,并且该问题不应再次发生。