2016-02-16 21 views
17

AWS Lambdaから自分のVPCのS3とリソースにアクセスしようとしていますが、AWS Lambdaを設定してVPCにアクセスしてからS3にアクセスするとタイムアウトします。 はここで、以下のように私はインターネットにアクセスするための適切なアウトバウンドルールで自分のサブネットとセキュリティグループを設定したコードVPC設定でAWS Lambdaを追加すると、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 

だがS3にアクセスして、私のラムダは、単にタイムアウトします。

enter image description here

enter image description here

ここでは、ラムダにVPCのサポートを有効にすると、あなたの関数は、もはや含まれて、あなたのVPC外のものへのアクセス権を持つテスト入力のサンプルだけでなく

# 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" 
     } 
    } 
    ] 
} 

答えて

29

ませんS3。特にS3の場合はVPC Endpointsを使用して解決できます。あなたのVPC以外のものは、ラムダ機能からVPC外のエンドポイントにトラフィックをルーティングするために、VPCにNATインスタンスまたは管理NATゲートウェイを作成する必要があります。

私はLambda VPC support announcementを読んで、最後に「知っていること」セクションに特に注意してください。

+0

ありがとうございました。しかし、私はそれが私のラムダが行っていたやり方の問題であると思う。このリンクは、ラムダが呼び出されたときに何が起こる可能性があるのか​​をよりよく理解してくれました。 https://aws.amazon.com/blogs/compute/container-reuse-in-lambda/ – blueskin

+1

ブルースキンは、あなたがそれを「固定」していることを知っているといいですね。 – Aaron

+1

私のRDSは公に利用可能であり、ラムダはありませんvpcで、まだタイムアウトしています。何かご意見は? – johnny

関連する問題