Lambda で NFS サーバにアクセスしてみた
はじめに
アノテーション株式会社の hato です。
Lambda から SMB アクセスする方法がAWS Blogで紹介されていますが NFS アクセスも可能なはずと思いやってみました。
やってみた
前提
- NFS サーバ(EC2)は作成済
構成イメージ
※ Lambda は VPC に接続しています。
手順
- セキュリティグループの作成
- IAM ロールの作成
- Lambda 関数のコード作成
- Lambda 関数の作成
- テスト
1. セキュリティグループの作成
Lambda 関数に設定するセキュリティグループを作成します。
Amazon VPC コンソール のナビゲーションペインから「セキュリティグループ」を選択して、「セキュリティグループを作成」を選択します。
次の値を指定して「セキュリティグループを作成」を選択します。
- セキュリティグループ名:任意の名前(例:
LambdaSG
) - VPC:Lambda を実行する VPC
セキュリティグループが正常に作成されたことを確認します。
2. IAM ロールの作成
Lambda に設定する IAM ロールを作成します。
VPC に接続する Lambda は通常の Lambda 関数の権限に加えて、追加の権限が必要です。
今回は必要な権限をまとめた AWS 管理ポリシーAWSLambdaVPCAccessExecutionRole
を使用します。
IAM コンソール を開き、ロールから「ロールを作成」をクリックします。
信頼されたエンティティタイプに「AWS のサービス」、ユースケースに「Lambda」を選択して、「次へ」をクリックします。
許可ポリシーからAWSLambdaVPCAccessExecutionRole
を選択して、「次へ」をクリックします。
ロール名に任意の名前(例:lambda_vpc_basic_execution
)を指定して、「ロールを作成」をクリックします。
IAM ロールが正常に作成されたことを確認します。
3. Lambda 関数のコード作成
NFS サーバにテストファイルを書き込み、書き込んだファイルを読む込むサンプルコードを作成します。
NFS クライアントとしてlibnfsとlibnfs-python
を使用しています。
なお、コード作成の作成は次の Ubuntu 環境(ami-0d52744d6551d851e
)で実施しました。
$ cat /etc/os-release PRETTY_NAME="Ubuntu 22.04.2 LTS" NAME="Ubuntu" VERSION_ID="22.04" VERSION="22.04.2 LTS (Jammy Jellyfish)"
作業用のディレクトリを作成します。
$ mkdir -p my-sourcecode-function/lib $ cd my-sourcecode-function
エディタで次のサンプルコードを作成します。
※4行目と8行目は NFS サーバーの IP アドレスに修正してください。
import libnfs def lambda_handler(event, context): a = libnfs.open('nfs://192.0.2.0/nfs/test.txt', mode='w+') a.write("Hello world") a.close() print (libnfs.open('nfs://192.0.2.0/nfs/test.txt', mode='r').read())
pip
やlibnfs
をインストールします。
$ sudo apt-get update $ sudo apt install python3-pip zip libnfs-dev $ cp -pa /usr/lib/x86_64-linux-gnu/libnfs.so* lib
pip
で周辺モジュールをインストールして、ZIP圧縮します。
$ pip install --target ./package libnfs ...(中略)... Successfully installed libnfs-1.0.post4 $ cd package $ zip -r ../my-deployment-package.zip . ...(中略)... adding: libnfs/_libnfs.cpython-310-x86_64-linux-gnu.so (deflated 66%) adding: libnfs/__init__.py (deflated 74%) $ cd .. $ zip -g my-deployment-package.zip lambda_function.py lib/* adding: lambda_function.py (deflated 23%)
4. Lambda 関数の作成
NFS サーバーにアクセスする Lambda 関数を作成します。
Lambda コンソールを開き、関数から「関数の作成」をクリックします。
次の値を指定し、「▼詳細設定」を選択します。
- 関数名:任意の名前(例:
Lambda-NFS-Access
) - ランタイム:Python 3.10
- デフォルトの実行ロールの変更:
既存のロールを使用する
- 作成した IAM ロールを指定(例:
lambda_vpc_basic_execution
)
- 作成した IAM ロールを指定(例:
次の値を指定して「関数の作成」を選択します。
- VPC を有効化:有効
- VPC:Lambda を実行する VPC
- サブネット:プライベートサブネットを指定
- セキュリティグループ:作成したセキュリティグループを指定(例:
LambdaSG
)
Lambda 関数が正常に作成されたことを確認します。
作成したサンプルコードを設定します。 「アップロード元」から「.zipファイル」を選択
手順3で作成したサンプルコード(ZIP)を選択します。
Lambda 関数が正常に更新されたことを確認します。
5. テスト
テストファイルの読み書きテストを行います。
「テスト」タブを選択します。
「テスト」を選択します。
テストファイルの書き込みと読み込みに成功しました。
NFS サーバー側を確認すると、テストファイルが作成されています。
$ ls /nfs/ test.txt $ cat /nfs/test.txt Hello world
最後に
この記事が誰かのお役にたてば幸いです。
参考資料
- Enabling SMB access for serverless workloads with Amazon FSx | AWS Storage Blog
- sahlberg/libnfs: NFS client library
- sahlberg/libnfs-python: Python bindings for libnfs
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。