17
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

vpc 内 Lambda から Lambda を呼ぶ( invoke する)場合、public subnet や private subnet などのパターン別に呼べるか検証してみた

Last updated at Posted at 2022-11-15

はじめに

LambdaからLambdaを呼ぶ時、以下のパターンでアクセス可能かどうか検証しました。

  • vpc 内の public 内にいる Lambda が呼ぶ / 呼ばれる
  • vpc 内の public 内にいる Lambda が呼ぶ / 呼ばれる (vpc endpointあり)
  • vpc 内の private 内にいる Lambda が呼ぶ / 呼ばれる
  • vpc 内の private 内にいる Lambda が呼ぶ / 呼ばれる (vpc endpointあり)
  • vpc 外にいる Lambda が呼ぶ / 呼ばれる

構成図

以下のようにLambdaを呼ぶ側のLambdaと呼ばれる側のLambdaをそれぞれの2つずつ作成しました。
スクリーンショット 2022-11-15 22.37.39.png

sg作成

まずsgを作成します。
作成するlambda用のsgをインバウンドで許可するsgを1つ作成します。
スクリーンショット 2022-11-15 22.41.33.png

vpc内のLambdaは、このsgをアタッチさせます。

vpcエンドポイント

private subnetに vpcエンドポイントを設置します。
sgは、先程作成したsgをアタッチさせます。
スクリーンショット 2022-11-15 23.02.18.png

Lambdaを作成

以下のように、sgは先ほど作成したsgをアタッチさせ、private subnet用のlambdaをpublic subnet用Lambdaを作成します。
スクリーンショット 2022-11-15 22.48.17.png

IAMロール

以下のIAMポリシーをIAMロールにアタッチします。

  • AWSLambdaRole
  • AWSLambdaVPCAccessExecutionRole

設定変更

タイムアウトを3秒から7秒に変更します。

Lambdaを呼ぶ側のコード

index.js
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();

exports.handler = async (event, context, callback) => {
	let payload = {
	    "message":"test"
	};
	
	// ペイロードをStringにする。
	payload = JSON.stringify(payload);
	
	let params = {
	    FunctionName:"test", // invokeするLambdaの名前
	    InvocationType:"RequestResponse",
	    Payload:payload
	 };
	
	try {
	    // Lambda関数呼び出し
	    let callLambda = await lambda.invoke(params).promise();
	    console.log(callLambda);
	
	 } catch (e) {
	    console.log("[ERROR]sendSMS/callLambda",e);
	 }
};

呼ばれる側のLambdaコード

index.js
exports.handler = async (event) => {
  return {
      statusCode: 200,
      body: JSON.stringify('invoke-success!'),
  };
};

テスト

呼ぶ側のLamdbdaを実行します。
7秒以内に正常なレスポンスが返れば、呼び出し成功です。
失敗の場合、タイムアウトになります。

テスト結果をこれから記載します。

vpc外のLambdaが呼ぶ時

結果

Lambda → リソース アクセス
Lambda → Lambda
Lambda → public内 Lambda
Lambda → private内 Lambda

スクリーンショット 2022-11-15 22.23.11.png

このパターンは、vpc endpointあり、なしに関わらず呼ぶことができました。
privateにいるLambdaも呼ぶことができました。

理由としては、呼ぶ側の Lambda が呼ばれる側の AWS Lambdaを呼んでおり、呼ばれる側の AWS Lambda呼ばれる側の Lambda 関数をコールしているためです。
詳細は、以下の記事が分かりやすいです。

vpcの public subnet 内の Lambdaが呼ぶ時

結果

Lambda → リソース アクセス
public内 Lambda → Lambda
public内 Lambda → public内 Lambda
public内 Lambda → private内 Lambda
Lambda → vpc endpoint →リソース アクセス
public内 Lambda → vpc endpoint → Lambda
public内 Lambda → vpc endpoint → public内 Lambda
public内 Lambda → vpc endpoint → private内 Lambda

スクリーンショット 2022-11-15 22.30.52.png

public subet 内の Lambda は、vpcエンドポイント経由でしかアクセスできませんでした。
理由としては、public subet 内の Lambda は、インターネットにアクセスすることができないためです。

ドキュメントにも記載がありました。

関数はインターネットにアクセスできません。
VPC エンドポイントを使用すると、インターネットアクセスなしで VPC 内から AWS のサービスに接続できます。

vpcの private subnet 内の Lambdaが呼ぶ時

結果

Lambda → リソース アクセス
private内 Lambda → Lambda
private内 Lambda → public内 Lambda
private内 Lambda → private内 Lambda
Lambda → vpc endpoint →リソース アクセス
private内 Lambda → vpc endpoint → Lambda
private内 Lambda → vpc endpoint → public内 Lambda
private内 Lambda → vpc endpoint → private内 Lambda

スクリーンショット 2022-11-15 22.29.22.png

public subnet 内の Lambda と全く同じ結果でした。
理由も同じです。

参考

17
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?