1

Mein Problem ist, dass eine Lambda-Funktion, die ich hinter NAT innerhalb einer VPC mit einem IGW ausführen, keinen Zugriff auf irgendetwas im Internet hat.AWS Lambda in VPC hat keinen Internetzugang hinter NAT

Was ich versuche, eine VPC zu tun ist, zu schaffen, hat:

  • Internet Gateway;
  • 2 private Subnetze (PrivateA und PrivateB) in den Verfügbarkeitszonen A bzw. B;
  • 1 public Subnetzes (PublicA) in Verfügbarkeit Zone A
  • NAT-Gateway in PublicA Subnetz
  • PrivateAPrivateB und haben eine Route-Tabelle, die Routen 0.0.0.0/0 zu dem NAT-Gateway.
  • PublicA verfügt über eine Routentabelle, die 0.0.0.0/0 an das Internet-Gateway weiterleitet.
  • Private Subnetze sowie das öffentliche Subnetz verfügen über Zugriffskontrolllisten, die den gesamten Ingress- und Egress-Datenverkehr zulassen.

Dieser Teil der Art funktioniert.

Als nächstes möchte ich eine Lambda-Funktion innerhalb der VPC erstellen. Ich gebe es in PrivateA und PrivateB ein und weise ihm eine Sicherheitsgruppe zu, die den gesamten Egress- und Ingress-Verkehr erlaubt.

Unten ist ein eigenständiges Beispiel (die gesamte Vorlage), das das Problem reproduziert. Ich habe alle möglichen Dokumente und Artikel im Internet gelesen und würde es sehr schätzen, wenn mir jemand in die richtige Richtung zeigen könnte.

{ 
    "AWSTemplateFormatVersion": "2010-09-09", 
    "Resources": { 

    "Vpc": { 
     "Type": "AWS::EC2::VPC", 
     "Properties": { 
     "CidrBlock": "10.0.0.0/16", 
     "EnableDnsSupport": true, 
     "EnableDnsHostnames": true, 
     "InstanceTenancy": "default" 
     } 
    }, 

    "InternetGateway": { 
     "Type": "AWS::EC2::InternetGateway" 
    }, 

    "VpcGatewayAttachment": { 
     "Type": "AWS::EC2::VPCGatewayAttachment", 
     "Properties": { 
     "VpcId": { "Ref": "Vpc" }, 
     "InternetGatewayId": { "Ref": "InternetGateway" } 
     } 
    }, 

    "ElasticIP":{ 
     "Type": "AWS::EC2::EIP", 
     "Properties": { 
     "Domain": "vpc" 
     } 
    }, 

    "NatGateway": { 
     "Type": "AWS::EC2::NatGateway", 
     "DependsOn": [ "VpcGatewayAttachment" ], 
     "Properties": { 
     "AllocationId": { "Fn::GetAtt": [ "ElasticIP", "AllocationId" ] }, 
     "SubnetId": { "Ref": "SubnetAPublic" } 
     } 
    }, 

    "SubnetAPublic": { 
     "Type": "AWS::EC2::Subnet", 
     "Properties": { 
     "AvailabilityZone": { "Fn::Select" : [ "0", { "Fn::GetAZs" : "" } ] }, 
     "CidrBlock": "10.0.0.0/19", 
     "MapPublicIpOnLaunch": true, 
     "VpcId": { "Ref": "Vpc" } 
     } 
    }, 

    "SubnetAPrivate": { 
     "Type": "AWS::EC2::Subnet", 
     "Properties": { 
     "AvailabilityZone": { "Fn::Select" : [ "0", { "Fn::GetAZs" : "" } ] }, 
     "CidrBlock": "10.0.64.0/19", 
     "VpcId": { "Ref": "Vpc" } 
     } 
    }, 

    "SubnetBPrivate": { 
     "Type": "AWS::EC2::Subnet", 
     "Properties": { 
     "AvailabilityZone": { "Fn::Select" : [ "1", { "Fn::GetAZs" : "" } ] }, 
     "CidrBlock": "10.0.96.0/19", 
     "VpcId": { "Ref": "Vpc" } 
     } 
    }, 

    "RouteTablePublic": { 
     "Type": "AWS::EC2::RouteTable", 
     "Properties": { 
     "VpcId": { "Ref": "Vpc" } 
     } 
    }, 

    "RouteTablePrivate": { 
     "Type": "AWS::EC2::RouteTable", 
     "Properties": { 
     "VpcId": { "Ref": "Vpc" } 
     } 
    }, 

    "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": "RouteTablePrivate" } 
     } 
    }, 

    "RouteTablePrivateInternetRoute": { 
     "Type": "AWS::EC2::Route", 
     "DependsOn": [ "VpcGatewayAttachment" ], 
     "Properties": { 
     "RouteTableId": { "Ref": "RouteTablePrivate" }, 
     "DestinationCidrBlock": "0.0.0.0/0", 
     "NatGatewayId": { "Ref": "NatGateway" } 
     } 
    }, 

    "RouteTablePublicInternetRoute": { 
     "Type": "AWS::EC2::Route", 
     "DependsOn": [ "VpcGatewayAttachment" ], 
     "Properties": { 
     "RouteTableId": { "Ref": "RouteTablePublic" }, 
     "DestinationCidrBlock": "0.0.0.0/0", 
     "GatewayId": { "Ref": "InternetGateway" } 
     } 
    }, 

    "NetworkAclPublic": { 
     "Type": "AWS::EC2::NetworkAcl", 
     "Properties": { 
     "VpcId": { "Ref": "Vpc" } 
     } 
    }, 

    "NetworkAclPrivate": { 
     "Type": "AWS::EC2::NetworkAcl", 
     "Properties": { 
     "VpcId": { "Ref": "Vpc" } 
     } 
    }, 

    "SubnetNetworkAclAssociationAPublic": { 
     "Type": "AWS::EC2::SubnetNetworkAclAssociation", 
     "Properties":{ 
     "SubnetId": { "Ref": "SubnetAPublic" }, 
     "NetworkAclId": { "Ref": "NetworkAclPublic" } 
     } 
    }, 

    "SubnetNetworkAclAssociationAPrivate": { 
     "Type": "AWS::EC2::SubnetNetworkAclAssociation", 
     "Properties":{ 
     "SubnetId": { "Ref": "SubnetAPrivate" }, 
     "NetworkAclId": { "Ref": "NetworkAclPrivate" } 
     } 
    }, 

    "SubnetNetworkAclAssociationBPrivate": { 
     "Type": "AWS::EC2::SubnetNetworkAclAssociation", 
     "Properties": { 
     "SubnetId": { "Ref": "SubnetBPrivate" }, 
     "NetworkAclId": { "Ref": "NetworkAclPrivate" } 
     } 
    }, 

    "NetworkAclEntryInPublicAllowAll": { 
     "Type": "AWS::EC2::NetworkAclEntry", 
     "Properties": { 
     "NetworkAclId": { "Ref": "NetworkAclPublic" }, 
     "RuleNumber": 99, 
     "Protocol": -1, 
     "RuleAction": "allow", 
     "Egress": false, 
     "CidrBlock": "0.0.0.0/0" 
     } 
    }, 

    "NetworkAclEntryOutPublicAllowAll": { 
     "Type": "AWS::EC2::NetworkAclEntry", 
     "Properties": { 
     "NetworkAclId": { "Ref": "NetworkAclPublic" }, 
     "RuleNumber": 99, 
     "Protocol": -1, 
     "RuleAction": "allow", 
     "Egress": true, 
     "CidrBlock": "0.0.0.0/0" 
     } 
    }, 

    "NetworkAclEntryInPrivateAllowVpc": { 
     "Type": "AWS::EC2::NetworkAclEntry", 
     "Properties": { 
     "NetworkAclId": { "Ref": "NetworkAclPrivate" }, 
     "RuleNumber": 99, 
     "Protocol": -1, 
     "RuleAction": "allow", 
     "Egress": false, 
     "CidrBlock": "0.0.0.0/16" 
     } 
    }, 

    "NetworkAclEntryOutPrivateAllowVpc": { 
     "Type": "AWS::EC2::NetworkAclEntry", 
     "Properties": { 
     "NetworkAclId": { "Ref": "NetworkAclPrivate" }, 
     "RuleNumber": 99, 
     "Protocol": -1, 
     "RuleAction": "allow", 
     "Egress": true, 
     "CidrBlock": "0.0.0.0/0" 
     } 
    }, 

    "LambdasSecurityGroup": { 
     "Type": "AWS::EC2::SecurityGroup", 
     "Properties": { 
     "GroupDescription": "Lambdas security group", 
     "SecurityGroupEgress": [ 
      { "CidrIp": "0.0.0.0/0", "IpProtocol": "-1" } 
     ], 
     "SecurityGroupIngress": [ 
      { "CidrIp": "0.0.0.0/0", "IpProtocol": "-1" } 
     ], 
     "VpcId": { "Ref": "Vpc" } 
     } 
    }, 

    "LambdaFunctionExecutionRole": { 
     "Type": "AWS::IAM::Role", 
     "Properties": { 
     "AssumeRolePolicyDocument": { 
      "Version": "2012-10-17", 
      "Statement": [ 
      { 
       "Effect": "Allow", 
       "Principal": { "Service": "lambda.amazonaws.com" }, 
       "Action": "sts:AssumeRole" 
      } 
      ] 
     }, 
     "ManagedPolicyArns": [ 
      "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", 
      "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole" 
     ] 
     } 
    }, 

    "LambdaFunction": { 
     "Type": "AWS::Lambda::Function", 
     "Properties": { 
     "Handler": "index.lambda_handler", 
     "Runtime": "python2.7", 
     "Role": { 
      "Fn::GetAtt": ["LambdaFunctionExecutionRole", "Arn"] 
     }, 
     "Code": { 
      "ZipFile": { 
      "Fn::Join": ["\n", [ 
       "import urllib2", 
       "def lambda_handler(event, context):", 
       "\tresponse = urllib2.urlopen('http://python.org/')", 
       "\treturn response.read()" 
      ]] 
      } 
     }, 
     "VpcConfig": { 
      "SecurityGroupIds": [ 
      { "Fn::GetAtt": [ "LambdasSecurityGroup", "GroupId"] } 
      ], 
      "SubnetIds": [ 
      { "Ref": "SubnetAPrivate" }, 
      { "Ref": "SubnetBPrivate" } 
      ] 
     } 
     } 
    } 
    } 
} 
+2

Haben Sie getestet, ob eine EC2-Instanz in den privaten Subnetzen auf das Internet zugreifen kann? –

Antwort

3

Die Ursache des ausgefallenen Konnektivität liegt in Ihrer ACL Config für "NetworkAclEntryInPrivateAllowVpc" und "NetworkAclEntryOutPrivateAllowVpc".

Wenn Sie diesen CIDR-Block von "0.0.0.0/16" bis "0.0.0.0/0" öffnen, kann Lambda auf das Internet zugreifen.

Ich bin nicht so gut informiert über NAT, aber es scheint, dass der NAT-Datenverkehr durch diese ACL-Regel blockiert wird.

+0

Haha, ich habe den ganzen Tag damit gekämpft und habe aufgehört so einfache Dinge wie diesen Tippfehler zu bemerken. Sollte angeblich '/ 0' sein. Es hat das Problem behoben, danke. Werde es auf dem echten Stapel versuchen. – ILya

Verwandte Themen