2016-09-29 48 views
9

全体的に、私はVPC内でAWS Lambdaを使用するとかなり混乱します。問題は、S3バケットにアクセスしようとしているときにラムダがタイムアウトしてしまうことです。ソリューションはVPCエンドポイントのようです。VPC内のLambdaからAWS S3にアクセス

ラムダ関数をVPCに追加して、RDSホストデータベースにアクセスできるようにしました(以下のコードでは表示されていませんが、機能しています)。しかし、今は私はS3にアクセスすることはできません。

私はVPC S3エンドポイントを作成しようとしましたが、何も変更されていません。

VPCの設定

私は最初のEC2インスタンスを作った時はいつでも私は、デフォルトで作成されたシンプルなVPCを使用しています。これには4つのサブネットがあり、すべてデフォルトで作成されます。

VPCのルートテーブル

_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 

シンプルS3ダウンロードラムダ:

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エンドポイントには、ルートテーブルの設定とセキュリティポリシーの設定が必要です。これらの設定をどのように設定したらよいか分かります。このドキュメントは次の場所にあります:http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-endpoints.htmlまた、VPCの外部にあるすべてのものにラムダ機能がアクセスできるようにNATゲートウェイをVPCに追加することもできますS3サービスだけでなく、 –

+0

これはvpc設定の問題です。ルートテーブル上のnatゲートウェイを使用して、任意のsbunet assosiatioを設定します。まだ問題を探していますか? –

+0

VPC設定に関する情報を追加しました。私は問題がどこにあるのだろうと考えましたが、VPCは主に私にとってブラックボックスです。何が誤って構成されているかを確認するために何を確認するのか分かりません。 – noobiemcfoob

答えて

1

私の問題の原因は、適切に私のセキュリティグループの送信の規則を設定していないされていました。具体的には、宛先にpl-XXXXXXXXというカスタムプロトコルアウトバウンドルールを追加する必要がありました(S3サービス、実際の値はAWS Consoleによって提供されました)。

+3

私は同じ問題に直面しているのでこれを行う方法の例を挙げることができます – Lajpat

+0

'pl-xxx'はプレフィックスリストのように見えます。http://docs.aws.amazon。com/AmazonVPC/latest/UserGuide/vpc-endpoints.html#vpc-endpoints-basicsを参照してください。これはコマンドラインで 'aws ec2 describe-prefix-lists'で見つけることができます。 –

+0

最後に、私はちょうどそのラムダ関数のためのセキュリティグループを作った: 'aws ec2 create-security-group --group-name my-lambda --description '幸運' --vpc-id vpc-123456'そのグループと他のグループ。重要なのは出口ルールだけです。何も与えなければ、すべてが許可されます。私はそれに満足していませんでしたが、コードは小さく、監査可能であり、きちんとしたコントロールを動作させることができませんでした。コードがより複雑になるなら、私はこれを再訪する必要があります。 –

4

boto3の場合、S3 URLは仮想となります。インターネットにアクセスするには、地域固有のURLに解決する必要があります。これにより、タイムアウトまでラムダ関数のハングが発生します。通話中の領域がする領域でなければならないこと

import boto3 import botocore.config 

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

注:代わりにパスベースのS3のURLを作成するためにboto3指示しますクライアントを作成するときにこの問題を解決するには

Configオブジェクトを使用する必要がありますラムダとVPCエンドポイントを展開しています。

次に、Lambdaのセキュリティグループ内のVPCエンドポイントにpl-xxxxxxプレフィックスリストを使用して、S3にアクセスすることができます。

ここにはこれを実証する作業CloudFormation scriptがあります。 S3バケット、プライベートサブネットとVPCエンドポイントのみを含むVPC、および必要なIAMロールに関連付けられたラムダ(バケットにレコードを格納する)を作成します。

+1

この説明をありがとう!!私はそれについてとても怒っていた。 – Mat

関連する問題