- VPCのPrivateSubnetにLambdaを配置・実行する手順
- PrivateSubnetのLambdaからインターネット接続なしでS3にアクセスする方法
AWSのLambdaは、サーバーの準備など考えずにすぐにプログラム開発ができるので便利ですよね。
設定方法を知っていればすぐにプログラムを開発からリリースまでできてしまいます。
一方で、AWSのサービスでできることがわからないと急に詰まってしまいます。
特殊なケースであれば都度調べながら進めても良いのですが、よく使われる構成の場合は、調べずにサクサクと進めたいですよね。
今回紹介する構成も開発の現場では非常によく使われる構成のひとつです。
しかしAWSに慣れていないとどのように作れば良いかが見当がつきません。
そこでこの記事では、VPC上でLambdaを実行するために必要な各AWSサービスの設定方法をまとめました。
ラムダの作成からVPCのネットワーク設定に至るまで、まとめて解説しています。
VPCのPrivateSubnetに配置されているLamdbaから、S3へアクセスする方法まで解説していますので、ぜひ最後までご覧ください。
利用するAWSサービスの紹介
この記事で利用するAWSサービスを簡単に紹介します。
各サービスの詳細は、AWS公式ドキュメントを参照ください。
Lambda
AWSが提供しているサーバーレスプログラムです。サーバーやミドルウェアの準備なしでプログラムを公開できます。
VPC
AWSが提供している仮想のプライベートネットワークを構築するサービスです。
インターネットにアクセスできるPublicSubnet、インターネットからアクセスできないPrivateSubnetを構築できます。
VPCエンドポイント
VPCエンドポイントは、インターネットを介さずAWSサービス間で通信ができる機能です。
VPCエンドポイントには以下の二種類あります。
- インターフェースエンドポイント・・・プライベートIPが割り当てられ、ENIを利用して接続する。使うサービスによっては有料のものもある。
- ゲートウェイエンドポイント・・・プライベートIP不要で接続できる。無料だが、利用できるサービスが少ない。
今回の検証では、「ゲートウェイエンドポイント」を利用します。
S3
AWSが提供しているストレージサービスです。ファイルを管理することができます。
IAM
AWSでサービスを実行するための権限を管理するサービスです。AWSで作成するものには、AWSのサービスに対してどれほどの権限を与えるかを必ず設定します。
手順
VPC上でラムダを実行する全体ステップはこちらです。
- Step1VPCの作成
Lambdaを実行するネットワーク(箱)を作成していきます。LambdaからS3へのアクセス経路を設定します。
- Step2S3バケットの作成
Lambdaからファイルを操作するためのテスト用のバケットを作成します。
- Step3Lambdaに設定するIAMロールの作成
VPCを操作する権限を付与したロールを作成します。
- Step4Lambdaの作成
S3のファイルを操作するLambdaプログラムを作成します。併せてVPCに配置する設定をします。
順番に解説していきます。
VPCの作成
ラムダを配置するためのネットワークを作成します。
以下の設定で作成します。


VPCの作成は、まとめて必要なリソースを作成できるモード(作成時に「VPCなど」を選択)があります。
今回はこちらを使い、VPCの作成と同時にパブリックサブネットとプライベートサブネットも作成していきます。
VPCエンドポイントに「S3ゲートウェイ」を選択するとPrivateSubnetのLambdaからS3にアクセスできる設定も同時にされます。
今回はすでにあるVPCに対して設定する手順も解説したいため、ここでは「なし」を選択して作ります。

「VPCを作成」以ボタンを実行後、下の結果となればVPCの作成は完了です。

できあがったVPCの状態はこちら。

リソースマップを見ると、PublicSubnetとPrivateSubnetもVPCの作成と同時に行われています。
VPCエンドポイントの作成(ゲートウェイエンドポイント)
PrivateSubnetから、インターネットを介さずにS3へアクセスするには、VPCエンドポイントを利用します。

タイプ「Gateway」の対象リージョンのS3を選択します。

エンドポイントを設定するルートテーブルを選択します。
今回はPrivateSubnetのLambdaからS3にアクセスしたいので、PrivateSubnetのルートテーブルを選択します。

ポリシーは、フルアクセスを選択。

タグは任意で設定してください。

設定が完了すると、ルートテーブルに特殊なルートが追加されます。

これは、S3のIPアドレス群に送信されるトラフィックを、VPCエンドポイントに向ける設定です。
この設定により、PrivateSubnetからS3へのアクセスがVPCエンドポイントに向き、インターネットを介さずS3にアクセスできます。

セキュリティグループの作成
Lambdaに設定するセキュリティグループを作成します。
ファイアウォールのようなもので、どの通信からのアクセスを許可するかを設定するものです。
セキュリティグループは、AWSのリソースに設定し使用します。
今回作成したセキュリティグループは、後述するLambdaに設定します。

S3へのアクセスはHTTPS通信で行われます。
そのため、アウトバウンドルールを以下の設定にします。
- プロトコル;HTTPS(443)
- 送信先;S3のIPアドレス群(pl-xxxxx)


S3バケットの作成
Lambdaが操作するS3バケットを作成します。
バケット名「test-s3-for-vpc-lambda」で作成します。





S3バケットの設定は完了です。
IAMの作成
Lambdaに設定するIAMロールを作成します。
LambdaをVPC上で実行させる許可を追加する必要があります。
このポリシーを設定したIAMロールを作成していきます。

Lambda実行に適したポリシーを自動で設定してくれるので、ユースケース「Lambda」を選択し作成します。

ロール名は任意の名称を設定します。
私は「role-for-vpc-lambda」としました。

信頼されたエンティティは変更せずこのまま。

上の編集ボタンを押して「AWSLambdaVPCAccessExecutionRole」を追加します。

今回作成するラムダでは、S3にファイルを書き込むのでS3へのアクセス許可も追加します。
今回は検証なので「AmazonS3FullAccess」を設定しました。

設定後、以下の状態となります。

タグの設定は任意です。今回は何も設定しません。

これで、IAMロールの作成は完了です。
Lambdaの作成
Lambdaを設定するための準備が整ったので、実行するプログラムを作成していきます。
今回はPythonで作成しますが、どの言語でも問題ありません。


ロールのアタッチ
IAMロールをラムダに設定します。
「実行ロール」に、ここまでで作成したVPCとS3の操作が許可されたIAMロールを設定します。

プログラムの作成

AWSコンソール上で以下コードを貼り付けます。
import boto3
import json
def lambda_handler(event, context):
# S3クライアントを作成
s3 = boto3.client('s3')
# 書き込むデータ
data = {
'key1': 'value1',
'key2': 'value2'
}
# データをJSON形式に変換
json_data = json.dumps(data)
# S3バケット名とファイル名
bucket_name = 'test-s3-for-vpc-lambda'
file_name = 'test.json'
# S3にファイルを書き込む
s3.put_object(Bucket=bucket_name, Key=file_name, Body=json_data)
return {
'statusCode': 200,
'body': json.dumps('ファイルがS3に書き込まれました')
}
コードの内容は、S3バケット名は自身の環境の名称に書き換えてください。
VPCに配置
作成したラムダをVPCに配置します。
サブネットはPrivateSubnet、セキュリティグループは上で作成したS3へアクセスできるセキュリティグループを設定します。

セキュリティグループを設定すると、インバウンドルールとアウトバウンドルールが表示されます。
アウトバウンドルールに443ポートが開いていることを確認しておきましょう。

このようになればVPCへの配置完了です。

動作確認
作成したLambdaを実行してみます。AWS マネジメントコンソール上でテストします。

以下のようになれば成功です。

S3バケットにちゃんとファイルが作成されています。

まとめ
- PrivateSubnetからS3にアクセスするときはVPCエンドポイントを利用する
- VPCエンドポイントにはインターフェースエンドポイントとゲートウェイエンドポイントの二種類ある
- S3へのアクセスにはゲートウェイエンドポイントを使う
- VPCエンドポイントを利用することでインターネットを介さずセキュアにS3にアクセスできる
AWSのS3へのアクセスは、インターネット接続が必要と思われがちですが、VPCエンドポイントを利用することでインターネットを介さずにアクセスが可能です。
今回は、S3へのアクセスだったのでゲートウェイエンドポイントを利用しましたが、別のAWSサービスを利用する場合はインターフェースエンドポイントを利用してください。
インターフェースエンドポイントを利用した場合でも、今回と同様の考えが適用できますので、本記事の内容を参考にしてみてください。
本記事が皆様の参考になれば幸いです。
関連記事;AWS Glue を使った分散処理で処理時間を短縮する





コメント