はじめに
アノテーション株式会社の 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 アドレスに修正してください。
lambda_function.py
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サイトをご覧ください。