2016-02-16 7 views
17

Ich versuche, von AWS Lambda auf S3 und Ressourcen auf meiner VPC zuzugreifen, aber seit ich mein AWS Lambda für den Zugriff auf VPC konfiguriert habe, läuft es beim Zugriff auf S3 ab. Hier ist der CodeHinzufügen von AWS Lambda mit VPC-Konfiguration verursacht Zeitüberschreitung beim Zugriff auf S3

from __future__ import print_function 

import boto3 
import logging 
import json 

print('Loading function') 

s3 = boto3.resource('s3') 

import urllib 

def lambda_handler(event, context): 
    logging.getLogger().setLevel(logging.INFO) 
    # Get the object from the event and show its content type 
    bucket = event['Records'][0]['s3']['bucket']['name'] 
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8') 
    print('Processing object {} from bucket {}. '.format(key, bucket)) 
    try: 
     response = s3.Object(bucket, key) 
     content = json.loads(response.get()['Body'].read()) 
     # with table.batch_writer() as batch: 
     for c in content: 
      print('  Processing Item : ID' + str(c['id'])) 
      # ################## 
      # Do custom processing here using VPC resources 
      # ################## 
    except Exception as e: 
     print('Error while processing object {} from bucket {}. '.format(key, bucket)) 
     print(e) 
     raise e 

ich meine Subnetze und Sicherheitsgruppen mit entsprechenden Outbound-Regeln festgelegt habe Internet zuzugreifen, wie unten gezeigt, aber mein Lambda einfach mal aus, wenn S3 zugreifen.

enter image description here

enter image description here

Hier ist eine Probe von Testeingang als auch

# Test Event Configuration 
{ 
    "Records": [ 
    { 
     "awsRegion": "us-east-1", 
     "eventName": "ObjectCreated:Put", 
     "eventSource": "aws:s3", 
     "eventTime": "2016-02-11T19:11:46.058Z", 
     "eventVersion": "2.0", 
     "requestParameters": { 
     "sourceIPAddress": "54.88.229.196" 
     }, 
     "responseElements": { 
     "x-amz-id-2": "ljEg+Y/InHDO8xA9c+iz6DTKKenmTaGE9UzHOAabarRmpDF1z0eUJBdpGi37Z2BU9nbTh4p7oZg=", 
     "x-amz-request-id": "3D98A2325EC127C6" 
     }, 
     "s3": { 
     "bucket": { 
      "arn": "arn:aws:s3:::social-gauge-data", 
      "name": "social-gauge-data", 
      "ownerIdentity": { 
      "principalId": "A1NCXDU7DLYS07" 
      } 
     }, 
     "configurationId": "b5540417-a0ac-4ed0-9619-8f27ba949694", 
     "object": { 
      "eTag": "9c5116c70e8b3628380299e39e0e9d33", 
      "key": "posts/test/testdata", 
      "sequencer": "0056BCDCF1F544BD71", 
      "size": 72120 
     }, 
     "s3SchemaVersion": "1.0" 
     }, 
     "userIdentity": { 
     "principalId": "AWS:AROAIUFL6WAMNRLUBLL3K:AWSFirehoseDelivery" 
     } 
    } 
    ] 
} 

Antwort

29

Sobald Sie VPC Unterstützung in Lambda Ihre Funktion hat nicht mehr außerhalb Ihres VPC Zugriff auf alles ermöglichen, was beinhaltet S3. Mit S3 speziell können Sie VPC Endpoints verwenden, um dies zu lösen. Für so ziemlich alles andere außerhalb Ihrer VPC müssen Sie in Ihrer VPC eine NAT-Instanz oder ein verwaltetes NAT-Gateway erstellen, um den Datenverkehr von Ihren Lambda-Funktionen zu Endpunkten außerhalb Ihrer VPC zu leiten.

Ich würde lesen Sie die Lambda VPC support announcement, und achten Sie besonders auf die "Dinge zu wissen" Abschnitt am Ende.

+0

Dank Mark. Aber ich denke, es war eher ein Problem bei der Art, wie mein Lambda auftrat. Dieser Link gab mir ein besseres Verständnis dafür, was passieren könnte, wenn Lambda angerufen wird und ich es beheben konnte. https://aws.amazon.com/blogs/compute/container-reuse-in-lambda/ – blueskin

+1

blueskin, wäre schön zu wissen, wie Sie es "repariert" .... – Aaron

+1

mein RDS ist öffentlich verfügbar und Lambda ist nicht in VPC, noch Zeitüberschreitung. Irgendwelche Gedanken? – johnny

Verwandte Themen