(AWS)Lambda からLambdaの実行

shimo
shimo
Aug 28, 2017 · 3 min read

Lambdaから同じVPC内のLambdaをコールした際に少しハマったので、その解決策を書かせてもらいます。

当初、同じVPCに設置したLambda同士ならboto3で実行できると考えていました。(Lambda はpython2.7で実行)
※boto3とはAWSが提供しているpython用のSDKで、AWSの各サービスを操作できるようになります。公式ドキュメントはこちら

まずはそのままCallしてみる

試しにCaller、Calleeと2つのLambdaを作成して、Caller -> Calleeを実行します。

Callerのコードは以下の通り。

# boto3でLambdaを使う宣言をします
clientLambda = boto3.client(“lambda”)
# Calleeを実行します
clientLambda.invoke(
# Calleeのarnを指定
FunctionName=arn:aws:lambda:ap-northeast-1:XXX:function:Callee,
# RequestResponse = 同期、Event = 非同期 で実行できます
InvocationType=’RequestResponse’,
# 引数をJSON形式で渡します
Payload= json.dumps()
)

Callerを実行するとTimeoutになります。

同じVPCでもLambdaからLambdaを実行と、インターネット経由でLambdaにアクセスします。
そして 、VPC 内部にある Lambda がインターネット接続を行うためには NAT gatewayが必要になります。

解決策として

Lambdaをprivate subnetに設置
NAT gatewayをpublic subnetに設置

構成図のイメージとしては下記になります。

VPC内に設置するかしないかは慎重に検討した方がよさそうです。
実際にはLambdaからAWSのどのサービスにアクセスするかで決まってきます。
例えば下記のようなパターンが考えられます。

VPC内に設置
・VPC内のRDSにアクセス
・VPC内のmemcachedにアクセス
VPC外に設置
・VPC外のmemcachedにアクセス
・S3やCloudFrontにアクセス
VPC内外どちらでも
・他サービスにアクセスなし

もう一つ。LambdaからLambdaを実行した際に呼び出された方のLambda(上記だとCallee)は、環境変数( Environment variables) は使用できません。
環境変数を使うときは要注意ですね。

VELTRA Engineering

)
shimo

Written by

shimo

VELTRA Engineering

Posts from the VELTRA Engineering team. www.veltra.com

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade