カテゴリー
【AWS使い方ガイド】手動で「APIGateway」→「VPC Lambda」→「EFS」の繋いだHello Worldをやってみる
※ 当ページには【広告/PR】を含む場合があります。
2023/04/15
2024/01/11

お久しぶりの純度100%のAWSネタです。
今回はLambdaの比較的新しい機能である
近年サーバレスでの利用パターンとして注目も集まっている
簡略的な構築イメージとしては、以下のような構成を試します。
800x373

この記事では、VPC LambdaをAWSダッシュボードから手っ取り早く"Hello World"するための手順を順次確認していきます。
1. VPCの設定
2. EFSとアクセスポイントを生成
3. Lambdaの作成
4. APIGatewayに接続(オプション)
以降で順を追って作業の中身を細かく説明していきます。
VPC Lambdaを使うための事前準備
まずは本題に入る前に、事前に覚えておかなければならない用語や、VPC LammbdaからEFSを使うために理解しなければならない知識を復習しておきます。
EFSの仕組みをおさらい
EFSは一種の"外付けハードディスク"のような使い方をする仮想ファイルシステムです。
通常EFSは、EC2インスタンス(のファイルシステム)にデバイスマウントすることによって、EFSの保持するファイルの読み書き・実行を行うことができます。
ここでの「EC2にEFSをマウントする」というのは、一般にやるようなLinuxパソコンにUSBストレージをデバイスマウントさせることとは異なる仕組みを持ちます。
AWS公式の技術リファレンスから、一つのVPC内に存在するEC2とEFSの構成図の一例を拝借して説明すると、
800x588

まず、EFSは
一つのVPCに所属
EFS単体では、あくまでも「スケーラブルな拡張ファイルシステム」であり、そのままだと何もできない状態です。
そこで、このEFSをVPC内にあるEC2インスタンスに接続するためには、
MTはサブネットグループを担当する各アベイラビリティゾーン(AZ)に最低1つ設置することで、同一AZに存在するEC2インスタンスとの通信が可能となり、EFSへのアクセスが可能となります。
図を観てのとおり、MTはネットワークインターフェイス(ENI)の一種で、AZからサブネットIPが一つ割り当てられることが分かります。
ここでのポイントは、
これをしっかりと理解しておくと、後述する少々ややこしい
EFSのネットワーク設定
LambdaからEFSを使うためのアクセスポイントの必要性
かつてのEFSアクセスポイントが導入される以前の構成から説明していきましょう。
800x474

通常、Lambdaは特定のAZには所属せず、VPC内に作成されます。
逆にいうと、ユーザーが特定のサブネットIP制限しなければ
これがまずいことに、1つのLambdaであっても、VPC内に存在するAZ(MT)の数だけサブネットIPが割り当てられてしまうため、LambdaがすべてのMTへアタッチに時間(コールドスタート時間)と、Lambdaの処理実行時間が長くなってしまうおそれがあります。
また、VPCに存在するLambdaの数によっては、サブネットIPがあっという間に枯渇してしまうことも懸念されます。
こういったかつての課題を解決するために、Lambdaには
先程の構成例の図を現状の構成に修正したものが以下になります。
800x573

長くなるのでここでは深堀りしませんが
Hyperplane ENI
これらの仕組みを使うことで、VPC Lambdaへ紐付けされるAZ(サブネットグループ)を簡単に選択でき、Lambdaに割り当てるサブネットIPを制御できるようになります。
また、同一のVPC内に複数のVPC Lambdaが存在したとしても、
Hyperplane ENI
もう一つ大きな変更点として、
一つのVPC Lambdaには一つのセキュリティグループを、EFSアクセスポイントは各MTごとに一つのセキュリティグループをそれぞれ設定することができます。
具体的なセキュリティグループの設定に関しては後述しています。
アクセスポイントの「マウントパス」と「ルートパス」
後述する設定手順でも出てきますが、EFSアクセスポイントの設定の用法として注意したいのが、
この二つのパスの違いを詳しく解説されている海外の技術ブログから拝借しますと、
800x532

というように理解しやすく図解されております。
まず、
マウントパス
AWSダッシュボードからは
[Lambda] > [関数] > VPC Lamnda関数名 > [設定] > [ファイルシステム]
「ローカルマウントパス」
Lambdaの実体もEC2同様のLinuxインスタンスですので、Lambda自身も内部にローカルファイルシステムを保持しています。
そして、EFSのアクセスポイント接続先を内部のローカルファイルシステムにマウントする場所が、
「ローカルマウントパス」
ファイルパスはユーザーが自由に決めて良いのですが、この例では
/mnt/msg
/mnt
EFSがマウントされると、このLambdaは
/mnt/msg
他方、
ルートパス
これはEFSのルートディレクトリを直接外部に晒したくない場合や、フォルダごとにユーザーアクセスを制御したい場合に役に立つ設定です。
この例ではEFSの
/lambda
/foldfer1
つまり、この例をマウントすると、
/mnt/msg(VPC Lambdaマウントパス) <--> EFSルートパス /lambda
LambdaのIAMロール
まず前提として、VPC LambdaをVPC内で生成するためのIAMロールが必要になってきます。
LambdaをVPCに配置するときにENI(Elastic Network Interface)が一つ付与されることで、LambdaがVPCのインスタンス等に通信が可能になります。
そこで、ENIを生成するポリシー・
AWSLambdaVPCAccessExecutionRole
また、VPC Lambdaの用途や目的に応じて、EFSへの操作権限も細かく付与する必要があることも押さえておきましょう。
今回はHello World程度の練習ですので必要ないのですが、VPC LambdaからEFSへの読み書きに
AmazonElasticFileSystemClientReadWriteAccess
独自ロールで書くと、だいたい下のようなものを割り当てます。
635x500

企業の部署内などで、IAMユーザーのロールを直接編集できないのであればその旨を管理者に相談してください。
VPCにセキュリティグループを設定する
VPCは新しく作成しても良いですが、ここでは
デフォルトVPC
まずVPCで行うことは、
セキュリティグループはネットワークでいうところの
なおここでは、"Hello World"を試したいだけですので、さほどたいしたフィルターの設置は検討しません。
セキュリティグループの設計は様々な考え方がありますが今回は、EFSを使うためのVPS Lambdaのセキュリティグループ・
lambda-sg
efs-sg
1336x440

まず
lambda-sg
1000x379

次に
efs-sg
lambda-sg
1000x386

今回は必要最低限のファイヤーウォールとしてVPC Lambda/EFSにつけておけば良いでしょう。
EFSとアクセスポイントを生成する
では
800x641

EFSの配置先のVPCを指定するほかは全てデフォルトの設定のまま
MyFileSystem
もう一つ、EFSのLinux側へのマウント設定に
アクセスポイントは、先程作成したファイルシステムにマウントされる時に作成される仮想のルートフォルダとして機能します。
例えばアクセスポイントを適当に一つ"Hello World"用に
hello-func-ap
1490x1422

一つのアクセスポイントには、その実行プロセスを代表する
POSIXユーザー
ファイルシステムに対して、多数のアクセスポイントを作成することができるので、「EFS内で実現するマイクロコンテナシステム」と言っても良いでしょう。
よってアクセスポイントで、様々な用途別に切り分けるような使い方が可能です。
マウントターゲットのセキュリティグループには要注意
※2023/04/19更新分 ... マウントターゲットに指定するセキュリティグループが間違っていたので差し替えました。 失礼しました。
個人的な経験上、VPC LambdaとVPC内部で通信がうまくいかない原因を探してえらく時間を取られてしまったポイントでもあります。
通常、EFSのファイルシステムをデフォルトで作成すると、ENIをはじめとするネットワーク設定が自動で割り当てされます。
[ファイルシステム] > 作成したFS > [ネットワーク]
1000x353

何も指定がない場合、リストの
セキュリティグループ
デフォルトセキュリティグループ
よって、先程独自にカスタマイズしたセキュリティグループ(ここでは
efs-sg
そこで、リストの右上の
[管理]
1130x755

これで、アクセスポイントにマウントされたVPC Lambdaのセキュリティグループが正しく紐つけされている状態になります。
VPC Lambdaを作成する
次にいよいよ
Lambdaのダッシュボードから作業しますが、注意が必要なのは、
異なるリージョンや他のVPCを超えてVPC Lambdaを通信したい場合には、別途、NATGatewayやEIPなどのパブリック設定を行わないといけなくなります。
709x1256

ここではランタイムを
node18
node20
また、Lambdaの実行ロールに上述した事前準備していたロールを割り当てましょう。
Lambda生成後に
index.mjs
export const handler = async(event) => {
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify('こんにちは!はじめてのVPC Lambda!!'),
};
return response;
};
このままでは通常のLambdaですので、ここからVPC仕様に設定を続けます。
まず
[設定] > [VPC]
[編集]
VPCの編集
778x1066

Lambdaを設置するVPCを指定し、VPC Lambdaが利用するローカルIPのサブネットの範囲、そしてセキュリティグループ(ここでが
lambda-sg
[保存]
エラーが出なければ、LambdaがVPC Lambdaとして認識され、ファイルシステムの割り当てが有効になります。
[設定] > [ファイルシステム]
[ファイルシステムの追加]
1166x938

このVPC Lambdaに、先程作成したEFSとそのアクセスポイント、マウント先のLinuxインスタンスからみた絶対パスをそれぞれ設定します。
これで、このVPC Lambda・
myHelloVPCLambda
hello-func-ap
セットアップができたら一度、
[テスト]
925x868

問題がなければ、VPC Lambdaが仕上がっています。
もし、
Network Error
APIGatewayとの紐付け
先程までで、VPC Lambdaが構築できましたが、ここからはAPIGatewayとVPC Lambdaを紐つけて、外部からアクセスする方法を簡単に試してみたいと思います。
従来型のREST APIでも呼び出せるかも知れませんが、ここでは
APIGatewayのダッシュボードから
[APIの作成] > HTTP API [構築]
721x439

まずはAPIの作成から設定します。
APIGatewayにLambdaを割り当てるには、
統合
806x660

統合のタイプから
Lambda
myHelloVPCLambdaAPI
[次へ]
次にAPIルートの設定をします。
803x444

特に"Hello World"を返すだけなので
ANY
最後にデプロイするステージもシステムにおまかせ(
$default
804x454

内容を確認して、APIをそのまま以下の内容でデプロイさせます。
831x682

作成&デプロイが完了できたらAPIエンドポイント(ここでは
https://<hash値>.execute-api.ap-northeast-1.amazonaws.com/myHelloVPCLambda
811x180

うまくレスポンスが返ってくればOKです! めでたしめでたし。
まとめ
ということで「VPC Lambda」でのHello Worldのまでの手順は以上で完了です。
とはいえ、肝心のマウントしたEFS自体にはアクセスしてはいないので、次回以降では「AWS Datasync」を使った簡単なファイルをVPC Lambdaから読み書きしてみたいと思います。
参考サイト
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー