Lambda で NFS サーバにアクセスしてみた

libnfs と libnfs-python を使って Lambda から NFS サーバにアクセスしてみました
2023.07.04

はじめに

アノテーション株式会社の hato です。

Lambda から SMB アクセスする方法がAWS Blogで紹介されていますが NFS アクセスも可能なはずと思いやってみました。

やってみた

前提

  • NFS サーバ(EC2)は作成済

構成イメージ

※ Lambda は VPC に接続しています。

手順

  1. セキュリティグループの作成
  2. IAM ロールの作成
  3. Lambda 関数のコード作成
  4. Lambda 関数の作成
  5. テスト

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 クライアントとしてlibnfslibnfs-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())

piplibnfsをインストールします。

$ 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

次の値を指定して「関数の作成」を選択します。

  • VPC を有効化:有効
    • VPC:Lambda を実行する VPC
    • サブネット:プライベートサブネットを指定
    • セキュリティグループ:作成したセキュリティグループを指定(例:LambdaSG

Lambda 関数が正常に作成されたことを確認します。

作成したサンプルコードを設定します。 「アップロード元」から「.zipファイル」を選択

手順3で作成したサンプルコード(ZIP)を選択します。

Lambda 関数が正常に更新されたことを確認します。

5. テスト

テストファイルの読み書きテストを行います。
「テスト」タブを選択します。

「テスト」を選択します。

テストファイルの書き込みと読み込みに成功しました。

NFS サーバー側を確認すると、テストファイルが作成されています。

$ ls /nfs/
test.txt

$ cat /nfs/test.txt 
Hello world

最後に

この記事が誰かのお役にたてば幸いです。

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。