PR

【AWS Lambda】VPCのPrivateSubnetからS3にアクセスする

AWS
記事内に広告が含まれています。
この記事でわかること
  • 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上でラムダを実行する全体ステップはこちらです。

VPCでラムダを実行する全体ステップ
  • Step1
    VPCの作成

    Lambdaを実行するネットワーク(箱)を作成していきます。LambdaからS3へのアクセス経路を設定します。

  • Step2
    S3バケットの作成

    Lambdaからファイルを操作するためのテスト用のバケットを作成します。

  • Step3
    Lambdaに設定するIAMロールの作成

    VPCを操作する権限を付与したロールを作成します。

  • Step4
    Lambdaの作成

    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のルートテーブルを選択します。

以下のようにルートテーブルが表示されないことがあります。

その場合は、別にVPCを一つ作ると表示されます。(理由は不明)

別のVPCを作成するときは、作成するモードに「VPCなど」を選択。

VPCエンドポイント「S3ゲートウェイ」をオンの状態で作成してください。

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

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

追加された特殊なルート

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

これは、S3のIPアドレス群に送信されるトラフィックを、VPCエンドポイントに向ける設定です。

この設定により、PrivateSubnetからS3へのアクセスがVPCエンドポイントに向き、インターネットを介さずS3にアクセスできます。

セキュリティグループの作成

Lambdaに設定するセキュリティグループを作成します。

セキュリティグループとは

ファイアウォールのようなもので、どの通信からのアクセスを許可するかを設定するものです。

セキュリティグループは、AWSのリソースに設定し使用します。

今回作成したセキュリティグループは、後述するLambdaに設定します。

S3へのアクセスはHTTPS通信で行われます。

そのため、アウトバウンドルールを以下の設定にします。

  • プロトコル;HTTPS(443)
  • 送信先;S3のIPアドレス群(pl-xxxxx)

送信先のS3のIPアドレス群がわからない場合は、VPCのPrivateSubnetのルートテーブルを見てください。

ルートテーブルに設定されている「 pl-xxxx」がS3のIPアドレス群です。

S3バケットの作成

Lambdaが操作するS3バケットを作成します。

今回、S3に対して特別な要件はないので、全てデフォルトで作成します。

全てデフォルトの設定で作成することで、外部からアクセスできないセキュアなS3バケットが作成されます。

バケット名「test-s3-for-vpc-lambda」で作成します。

S3バケットの設定は完了です。

IAMの作成

Lambdaに設定するIAMロールを作成します。

LambdaをVPC上で実行させる許可を追加する必要があります

このポリシーを設定したIAMロールを作成していきます。

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

ロール名は任意の名称を設定します。

私は「role-for-vpc-lambda」としました。

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

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

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

今回は検証なので「AmazonS3FullAccess」を設定しました。

S3への書き込みには「S3PutObject」、「S3PutObjectAcl」の権限があればよいので、最小権限の設定が必要な場合はこれらのみを許可してください。

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

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

これで、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をVPCに配置するまでに少し時間がかかります。

動作確認

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

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

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

まとめ

  • PrivateSubnetからS3にアクセスするときはVPCエンドポイントを利用する
  • VPCエンドポイントにはインターフェースエンドポイントとゲートウェイエンドポイントの二種類ある
  • S3へのアクセスにはゲートウェイエンドポイントを使う
  • VPCエンドポイントを利用することでインターネットを介さずセキュアにS3にアクセスできる

AWSのS3へのアクセスは、インターネット接続が必要と思われがちですが、VPCエンドポイントを利用することでインターネットを介さずにアクセスが可能です。

今回は、S3へのアクセスだったのでゲートウェイエンドポイントを利用しましたが、別のAWSサービスを利用する場合はインターフェースエンドポイントを利用してください。

インターフェースエンドポイントを利用した場合でも、今回と同様の考えが適用できますので、本記事の内容を参考にしてみてください。

本記事が皆様の参考になれば幸いです。

関連記事;AWS Glue を使った分散処理で処理時間を短縮する

コメント

タイトルとURLをコピーしました