(AWS)Lambda からLambdaの実行
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) は使用できません。
環境変数を使うときは要注意ですね。

