2016-09-29 4 views
9

Insgesamt bin ich ziemlich verwirrt, wenn ich AWS Lambda in einer VPC verwende. Das Problem ist, dass Lambda beim Versuch, auf einen S3-Bucket zuzugreifen, Zeitlimits setzt. Die Lösung scheint ein VPC-Endpunkt zu sein.Zugriff auf AWS S3 von Lambda innerhalb von VPC

Ich habe die Lambda-Funktion zu einer VPC hinzugefügt, so dass sie auf eine RDS-gehostete Datenbank zugreifen kann (nicht im unten stehenden Code, aber funktional). Allerdings kann ich jetzt nicht auf S3 zugreifen und versuche es auch mal nicht.

Ich habe versucht, einen VPC S3-Endpunkt zu erstellen, aber nichts hat sich geändert.

VPC Konfiguration

ich standardmäßig eine einfache VPC verwenden erstellt, wenn ich eine EC2-Instanz gemacht zuerst. Es hat vier Subnetze, alle standardmäßig erstellt.

VPC-Routentabelle

_Destination - Target - Status - Propagated_ 

172.31.0.0/16 - local - Active - No 

pl-63a5400a (com.amazonaws.us-east-1.s3) - vpce-b44c8bdd - Active - No 

0.0.0.0/0 - igw-325e6a56 - Active - No 

Einfach S3 Herunterladen Lambda:

import boto3 
import pymysql 
from StringIO import StringIO 

def lambda_handler(event, context): 
    s3Obj = StringIO() 

    return boto3.resource('s3').Bucket('marineharvester').download_fileobj('Holding - Midsummer/sample', s3Obj) 
+2

VPC S3-Endpunkte erfordern die Konfiguration der Routentabelle und die Konfiguration der Sicherheitsrichtlinien. Sie müssten zeigen, wie Sie diese Einstellungen konfiguriert haben, wenn Sie Hilfe dabei benötigen. Die Dokumentation ist hier: http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-endpoints.html Alternativ könnten Sie der VPC ein NAT-Gateway hinzufügen, das der Lambda-Funktion Zugriff auf alles außerhalb der VPC geben würde nicht nur der S3-Service. –

+0

Dies ist VPC-Konfigurationsproblem. Konfigurieren Sie eine beliebige sbunet assosiatio mit dem nat-Gateway auf der Routentabelle. Hast du noch Probleme? –

+0

Ich habe einige Informationen zur VPC-Konfiguration hinzugefügt. Ich dachte mir, das wäre das Problem, aber die VPC ist für mich größtenteils eine Black Box. Ich weiß nicht, was ich damit prüfen soll, um zu sehen, was falsch konfiguriert ist. – noobiemcfoob

Antwort

1

Die Ursache für mein Problem war nicht richtig gewesen, die Ausgehende Regeln meiner Sicherheitsgruppe zu konfigurieren. Insbesondere musste ich die benutzerdefinierte Protokollausgangsregel mit einem Ziel von pl-XXXXXXXX (S3-Dienst) hinzufügen. Der tatsächliche Wert wurde von der AWS-Konsole bereitgestellt.

+3

können Sie Beispiel geben, wie dies zu tun ist, da sogar ich vor dem gleichen Problem bin – Lajpat

+0

Die 'pl-xxx' sieht aus wie eine Präfix-Liste, wie hier beschrieben: http: //docs.aws.amazon.com/AmazonVPC/neuste/UserGuide/vpc-endpoints.html # vpc-endpoints-basics und finden Sie in der Befehlszeile mit 'aws ec2 describe-prefix-lists'. –

+0

Am Ende habe ich nur eine Sicherheitsgruppe nur für diese Lambda-Funktion gemacht: 'aws ec2 create-security-group --groupname my-lambda --description 'Viel Glück' --vpc-id vpc-123456' Ich habe mich beworben diese Gruppe und keine andere. Die Ausgangsregeln sind die einzigen, die wichtig sind. Wenn Sie keine geben, ist alles erlaubt. Ich war nicht sehr glücklich damit, aber der Code ist klein und überprüfbar und ich konnte die strengen Kontrollen nicht zum Funktionieren bringen. Wenn der Code komplexer wird, muss ich dies noch einmal untersuchen. –

4

Mit boto3 sind die S3-URLs standardmäßig virtuell, die dann erfordern, dass der Internetzugriff auf regionsspezifische URLs aufgelöst wird. Dies verursacht das Aufhängen der Lambda-Funktion bis zum Timeout.

Um dies zu beheben Verwendung eines Config Objekt erfordert, wenn der Client-Erstellung, die boto3 sagt Pfad Urls basierend S3 statt zu erstellen:

import boto3 import botocore.config 

client = boto3.client('s3', 'ap-southeast-2, config=botocore.config.Config(s3={'addressing_style':'path'})) 

Beachten Sie, dass der Bereich, in dem Aufruf der Region sein muss dem Sie den Lambda und VPC-Endpunkt bereitstellen.

Dann können Sie die pl-xxxxxx Präfixliste für den VPC-Endpunkt innerhalb der Sicherheitsgruppe des Lambda verwenden und immer noch auf S3 zugreifen.

Hier ist eine funktionierende CloudFormation script, die dies demonstriert. Er erstellt einen S3-Bucket, ein Lambda (das Datensätze in den Bucket einfügt), die einer VPC zugeordnet sind, die nur private Subnetze und den VPC-Endpunkt enthält, sowie erforderliche IAM-Rollen.

+1

10 Danke für diese Erklärung !! Ich wurde so wütend darüber. – Mat

Verwandte Themen