【AWS使い方ガイド】手動で「APIGateway」→「VPC Lambda」→「EFS」の繋いだHello Worldをやってみる


2023/04/15
2023/04/19
Serverless FrameworkでもAWS で「APIGateway」→「VPC Lambda」→「EFS」を一発で構築してみる
蛸壺の技術ブログ|手動で「APIGateway」→「VPC Lambda」→「EFS」の繋いだHello Worldをやってみる

お久しぶりの純度100%のAWSネタです。

今回はLambdaの比較的新しい機能である
「VPC Lambda」をシンプルに理解する上で、CloudFormationのようなサーバレス構築ツール無しに、ダッシュボードから手動でポチポチと設定していきます。

構築するイメージとしては、近年個人開発での利用パターンとして注目も集まっている
「APIGateway → VPC Lambda → EFS」での連携パターンを作成してみます。

合同会社タコスキングダム|蛸壺の技術ブログ


作業手順と事前準備

それではVPC LambdaをAWSダッシュボードから手っ取り早く"Hello World"するための手順を示します。

            
            1. VPCの設定
2. EFSとアクセスポイントを生成
3. Lambdaの作成
4. APIGatewayに接続(オプション)
        
以降では順を追って作業の中身を細かく説明していきます。

LambdaのIAMロール

まず前提として、VPC LambdaをVPC内で生成するためのIAMロールが必要になってきます。

LambdaをVPCに配置するときにENI(Elastic Network Interface)が一つ付与されることで、LambdaがVPCのインスタンス等に通信が可能になります。

そこで、ENIを生成するポリシー・
AWSLambdaVPCAccessExecutionRoleがVPC Lamdbaに必要になります。

また、VPC Lambdaの用途や目的に応じて、EFSへの操作権限も細かく付与する必要があることも押さえておきましょう。

今回はHello World程度の練習ですので必要ないのですが、VPC LambdaからEFSへの読み書きに
AmazonElasticFileSystemClientReadWriteAccess相当のポリシーも必要になります。

独自ロールで書くと、だいたい下のようなものを割り当てます。

合同会社タコスキングダム|蛸壺の技術ブログ

企業の部署内などで、IAMユーザーのロールを直接編集できないのであればその旨を管理者に相談してください。


VPCの設定する

VPCは新しく作成しても良いですが、ここではデフォルトVPCにそのままLambdaをアタッチしていくことを考えます。

まずVPCで行うことは、
「セキュリティグループの設置」です。

セキュリティグループはネットワークでいうところの
VPC版ファイヤーウォールですので、本番環境で使う際にはしっかりとセキュリティグループの「インバウンドルール」と「アウトバウンドルール」を設計する必要があります。

なおここでは、"Hello World"を試したいだけですので、さほどたいしたフィルターの設置は検討しません。

セキュリティグループの設計は様々な考え方がありますが今回は、EFSを使うためのVPS Lambdaのセキュリティグループ・
lambda-sgと、EFS自体に使うセキュリティグループ・efs-sgを分けて作成します。

合同会社タコスキングダム|蛸壺の技術ブログ

まず
lambda-sgはインバウンドで送信元の全てのトラフィックを受け取り、送信先はEFS(ポート2049)に絞ってアウトバウンドのルールをつけてみました。

合同会社タコスキングダム|蛸壺の技術ブログ

次に
efs-sgでは、EFS用のポート・2049以外のTCPパケットは落とし、さらに送信元をlambda-sg限定に指定しています。アウトバウンドは特にフィルターするルールは設置していません。

合同会社タコスキングダム|蛸壺の技術ブログ

今回は必要最低限のファイヤーウォールとしてVPC Lambda/EFSにつけておけば良いでしょう。


EFSとアクセスポイントを生成する

では「EFS」のダッシュボードに移りを新規でファイルシステムを作成してみます。

合同会社タコスキングダム|蛸壺の技術ブログ

EFSの配置先のVPCを指定するほかは全てデフォルトの設定のまま
MyFileSystemという名前で作成します。

もう一つ、EFSのLinux側へのマウント設定に
「アクセスポイント」が必要になります。

アクセスポイントは、先程作成したファイルシステムにマウントされる時に作成される仮想のルートフォルダとして機能します。

例えばアクセスポイントを適当に一つ"Hello World"用に
hello-func-apというアクセスポイントを作ってみましょう。

合同会社タコスキングダム|蛸壺の技術ブログ

一つのアクセスポイントには、その実行プロセスを代表する
POSIXユーザーも作成されます。

ファイルシステムに対して、多数のアクセスポイントを作成することができるので、「EFS内で実現するマイクロコンテナシステム」と言っても良いでしょう。

よってアクセスポイントで、様々な用途別に切り分けるような使い方が可能です。

マウントターゲットのセキュリティグループには要注意

※2023/04/19更新分 ... マウントターゲットに指定するセキュリティグループが間違っていたので差し替えました。失礼しました。

個人的な経験上、VPC LambdaとVPC内部で通信がうまくいかない原因を探してえらく時間を取られてしまったポイントでもあります。

通常、EFSのファイルシステムをデフォルトで作成すると、ENIをはじめとするネットワーク設定が自動で割り当てされます。

[ファイルシステム] > 作成したFS > [ネットワーク]を覗くと、EFSに割り当てされたネットワークの諸元がリストとして確認できます。

合同会社タコスキングダム|蛸壺の技術ブログ

何も指定がない場合、リストの
セキュリティグループには、自動でデフォルトセキュリティグループがデフォルトで設定されます。

よって、先程独自にカスタマイズしたセキュリティグループ(ここでは
efs-sg)が自動では選択されないことに注意が必要です。

そこで、リストの右上の
[管理]のボタンを押し、各マウントターゲットのセキュリティグループを正しく指定し直します。

合同会社タコスキングダム|蛸壺の技術ブログ

これで、アクセスポイントにマウントされたVPC Lambdaのセキュリティグループが正しく紐つけされている状態になります。


Lambdaを作成する

次にいよいよ「VPC Lambda」を作成していきます。

Lambdaのダッシュボードから作業しますが、注意が必要なのは、
「VPC LambdaとEFSは同一のリージョンに設置する」必要があります。

異なるリージョンや他のVPCを超えてVPC Lambdaを通信したい場合には、別途、NATGatewayやEIPなどのパブリック設定を行わないといけなくなります。

合同会社タコスキングダム|蛸壺の技術ブログ

ここではランタイムを
node18に選択しています。

また、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の編集を設定していきます。

合同会社タコスキングダム|蛸壺の技術ブログ

Lambdaを設置するVPCを指定し、VPC Lambdaが利用するローカルIPのサブネットの範囲、そしてセキュリティグループ(ここでが
lambda-sg)を指定して、[保存]ボタンを押します。

エラーが出なければ、LambdaがVPC Lambdaとして認識され、ファイルシステムの割り当てが有効になります。

[設定] > [ファイルシステム]とたどり、[ファイルシステムの追加]をクリックしましょう。

合同会社タコスキングダム|蛸壺の技術ブログ

このVPC Lambdaに、先程作成したEFSとそのアクセスポイント、マウント先のLinuxインスタンスからみた絶対パスをそれぞれ設定します。

これで、このVPC Lambda・
myHelloVPCLambdaは、アクセスポイント・hello-func-apに属したプロセスで走ることになります。

セットアップができたら一度、
[テスト]でテストを実行してみましょう。

合同会社タコスキングダム|蛸壺の技術ブログ

問題がなければ、VPC Lambdaが仕上がっています。

もし、
Network ErrorなどでパケットがVPC内で送信・受信されていないようなら、セキュリティグループ周りの設定などを疑ってみてください。


APIGatewayとの紐付け

先程までで、VPC Lambdaが構築できましたが、ここからはAPIGatewayとVPC Lambdaを紐つけて、外部からアクセスする方法を簡単に試してみたいと思います。

従来型のREST APIでも呼び出せるかも知れませんが、ここでは
「HTTP API(APIGatewayV2)」を利用します。

APIGatewayのダッシュボードから
[APIの作成] > HTTP API [構築]をクリックします。

合同会社タコスキングダム|蛸壺の技術ブログ

まずはAPIの作成から設定します。

APIGatewayにLambdaを割り当てるには、
統合を作成する必要があります。

合同会社タコスキングダム|蛸壺の技術ブログ

統合のタイプから
Lambda、リージョンはVPC Lambdaと同一の地域、そして先程作成したVPC Lambdaを選択して、myHelloVPCLambdaAPIと名付けて[次へ]を押します。

次にAPIルートの設定をします。

合同会社タコスキングダム|蛸壺の技術ブログ

特に"Hello World"を返すだけなので
ANYメソッドを指定しておきます。

最後にデプロイするステージもシステムにおまかせ(
$default)します。

合同会社タコスキングダム|蛸壺の技術ブログ

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

合同会社タコスキングダム|蛸壺の技術ブログ

作成&デプロイが完了できたらAPIエンドポイント(ここでは
https://<hash値>.execute-api.ap-northeast-1.amazonaws.com/myHelloVPCLambda)にブラウザからアクセスしてみましょう。

合同会社タコスキングダム|蛸壺の技術ブログ

うまくレスポンスが返ってくればOKです!めでたしめでたし。


まとめ

ということで「VPC Lambda」でのHello Worldのまでの手順は以上で完了です。

とはいえ、肝心のマウントしたEFS自体にはアクセスしてはいないので、次回以降では「AWS Datasync」を使った簡単なファイルをVPC Lambdaから読み書きしてみたいと思います。

参考サイト

Lambda から共有ファイルストレージの EFS が利用可能になりました!