Qumulo LogoQumulo Logo

ブログ

QumuloとAWS Lambdaによるステートレスアプリケーションのための永続ストレージ

で構築されたサーバーレス・アプリケーションは、次のような特徴がある。 AWSラムダ Lambda関数は俊敏性、スケーラビリティ、効率性を提供するが、永続ストレージが組み込まれていない。Lambdaファンクションが、呼び出しにまたがってファイルにアクセスしたり、データを永続的に共有したりする必要がある場合、 クラウドネイティブQumulo(CNQ) がこのギャップを埋める。

このブログでは、AWS LambdaをCNQに接続する方法を説明します。 ネットワークファイルシステム サーバーレスアプリケーションのための永続的でスケーラブルなファイルアクセスを可能にします。

このブログでは

  • AWS Lambdaとは?

  • AWS Lambdaに永続ストレージが必要な理由

  • LambdaのCNQ NFSアクセスの設定

  • CNQと相互作用するラムダ関数の作成

  • ラムダのパッケージングとデプロイ

  • すべてを試す

 

AWS Lambdaとは?

AWS Lambdaはサーバーレス、イベントドリブンのコンピュートサービスで、HTTPリクエスト、ファイルのアップロード、データストリームの変更などのイベントに応じてコードを実行します。サーバーのプロビジョニングや管理は不要で、スケーリング、メンテナンス、ロギングを行います。関数はトリガーされたときだけ実行され、使用された計算時間に対してのみ課金されます。

ラムダは、迅速なスケーリングとイベント駆動型処理を必要とするシナリオに特に適している:

  • ファイル処理:Amazon S3へのファイルアップロード時にリアルタイムでワークフローをトリガー。

  • ストリーム処理:Amazon Kinesisのようなソースからのリアルタイムのストリーミングデータを分析、処理します。

  • Webアプリケーション:Lambdaを他のAWSサービスと統合することで、スケーラブルなWebアプリケーションを構築できます。

  • IoTバックエンド:サーバー管理なしでIoTデバイスのバックエンド操作を管理。

 

⚠️ しかし、Lambdaは設計上ステートレスだ。関数には永続ストレージが組み込まれていないため、ファイルの永続化には外部のソリューションが必要になる。

AWS Lambdaに永続ストレージが必要な理由

サーバーレス・コンピューティングは、開発者が複雑なサーバー・インフラストラクチャを必要とせずに拡張性の高い機能を構築できるようにすることで、アプリケーション開発に変化をもたらした。Lambda関数はAmazon S3などのオブジェクト・ストレージとネイティブにやり取りできるが、現実世界の多くのシナリオでは、レガシー・アプリケーションをサポートするためであれ、ファイル・ベースのストレージが提供する利点を活用するためであれ、従来のファイル・システムにアクセスする必要がある。

Amazonのビルトイン永続ストレージオプションであるElastic File System (EFS)は、SMBプロトコルのサポートがないため、NFSに依存するレガシーワークフローに使用が限定される。AWS LambdaとCloud Native Qumulo(CNQ)を統合することで、開発者はこのギャップをシームレスに埋めることができる。CNQのマルチプロトコル機能により、サーバーレスアプリケーションはスケーラビリティやシンプルさを損なうことなく、レガシーファイルシステムに直接アクセスできる。

CNQとAWS Lambdaにより、ステートフルなワークフローは完全にサーバーレスになり、比類のないスピード、使いやすさ、堅牢なストレージパワーを提供します。

実際のアプリケーションの多くは、永続的なファイル・ストレージを必要とする:

  • レポートの作成と保存

  • アップロードされたファイルの処理

  • 呼び出しやサービス間でデータを共有する

 

Lambdaの一時的な/tmpストレージは刹那的です。CNQは、永続的で高性能、マルチプロトコル、スケーラブルなNFSストレージを提供するため、このようなシナリオに最適です。

LambdaのCNQ NFSアクセスの設定

AWS VPCにCNQを導入する: Qumulo Web UIまたはCLIを使用して、数分でCNQをデプロイできます。

 

Qumulo NFSエクスポートを作成します:

UI、API、または qq CLI を使用して、Lambda のユースケース用のエクスポートを作成します。

NFS エクスポートを確認してください:

  • 読み取り/書き込み権限がある

  • ラムダと同じVPC/サブネット内でアクセスできる

  • root以外でのポート接続を許可する(Lambdaはrootとして実行されない)

 

CNQセキュリティを設定する:

ポート 2049/tcp (NFS)でのイングレスアクセスを確保する:

VPCセキュリティグループのイングレスルールにNFSを追加し、以下のCIDRをLambdaサブネットの実際のCIDR範囲に置き換えます。

aws ec2 authorize-security-group-ingress \--group-id sg-0a1b2c3d4e5f6g7h8 ¶--protocol tcp ¶--port 2049 ¶--cidr 192.168.0.0/24

ラムダ関数コードの作成

以下のコードで Python ハンドラファイル(例えば、test_cnq_access.py)を作成します。
Note: YOUR_CNQ_ADDRESS を CNQ クラスタの DNS 名(または IP アドレス)に、YOUR_NFS_EXPORT を実際の NFS エクスポートパス(例えば lambda-data)に置き換えてください。

import osimport sysfrom datetime import datetimeimport libnfsos.environ['LD_LIBRARY_PATH'] = "/var/task/lib:/var/task/libnfs:"+ os.environ.get('LD_LIBRARY_PATH', '')sys.path.append('/var/task')デフ ハンドラ(イベント, コンテキスト): 試す ⟦ = libnfs.NFS("nfs://YOUR_CNQ_ADDRESS/YOUR_NFS_EXPORT")ただし e.として例外: 戻る {"statusCode":500, "body":"NFSエクスポートへの接続エラー:" + str(e)}.試す ⟦ = datetime.now().isoformat()message = f "CNQ経由でAWS Lambdaからこんにちは! - f = nfs.open("/testing-from-lambda.txt", "w+")f.write(message)f.close()ただし e.として例外: 戻る {"statusCode":500, "body":"ファイルへの書き込みエラー:" + str(e)}.試す ⟦ = nfs.open("/testing-from-lambda.txt", "r")content = f.read()戻る {"statusCode":200, "body": content}ただし e.として例外: 戻る {"statusCode":500, "body":"ファイル読み込みエラー:" + str(e)}。

ラムダ関数のパッケージ化

AWS LambdaはFUSEをマウントしたり、カーネルレベルのNFSマウントを使用することができないため、ユーザ空間の代替を使用するために、Pythonコードと一緒にネイティブのlibnfs共有ライブラリをパッケージ化します。

重要:互換性のため、Amazon Linux 2環境でビルドしてテストしてください。

デプロイメント・パッケージ作成スクリプト - シェルスクリプトを作成します(または、これらのコマンドをステップごとに実行します)。必要に応じて環境に合わせて調整してください。

#AWS Lambda Deployment Package Creation Script## Amazon Linux 2 VM またはコンテナ上で以下の手順を実行します。##BUILD_DIR="/home/ec2-user/build "echo "Creating package directory... "mkdir -p "$BUILD_DIR/package/lib "echo "Installing prerequisite packages..."sudo yum -y install python3.8 python38-devel gcc libnfs-develsudo amazon-linux-extras enable python3.8echo "Installing libnfs using pip3.8... "pip3.8 install libnfs --target ./packageecho "AL2 ネイティブ libnfs 共有ライブラリをパッケージにコピー... "cp -L /usr/lib64/libnfs.so package/lib/echo "パッケージ内に libnfs シンムリンクを作成 (実行時に必要)... "cd package/libln -sf libnfs.so libnfs.so.8cd $BUILD_DIRecho "test_cnq_access.pyラムダハンドラスクリプトをコピー... "cp test_cnq_access.py package/echo "デプロイパッケージ(function.zip)をzip圧縮... "cd packagezip -r ../機能.zip .

IAMコンフィギュレーション

トラストポリシー(trust-policy.json)を作成する:

{"バージョン":"2012-10-17","Statement":[{"効果": "許可":"許可", "プリンシパル":{"サービス":"lambda.amazonaws.com"}, "Action":"sts:AssumeRole"}]}。

必要なポリシーを作成し、添付する:

aws iam create-role ˶--role-name LambdaCNQExecutionRole ˶--assume-role-policy-document file://trust-policy.aws iam attach-role-policy ︙-role-name LambdaCNQExecutionRole ︙-policy-arn arn⟦↪PH_0↩⟦⟧:サービスロール/AWSLambdaBasicEecutionRoleaws iam attach-role-policy ﹑--role-name LambdaCNQExecutionRole ﹑--policy-arn arn ﹑﹑PH_27E6 ﹑PH_27E7 ﹑PH_27E6 ﹑PH_27E7⟦⟧:⟦⟧/service-role/AWSLambdaVPCAccessExecutionRole

ラムダ関数の作成

123456789012 "をAWSアカウントIDに置き換えてください。

aws lambda create-機能 \--機能-name cnq-nfs-lambda ↪--runtime python3.8 ↪--role arn↪PH_0↩↪PH_27E6↩⟧⟧::123456789012⟦↪PH_2⟧/LambdaCNQExecutionRole ↪--handler test_cnq_access.handler ↪--zip-file fileb://function.zip

VPC設定の構成

LambdaファンクションがVPC内のリソースにアクセスできるようにするには、サブネットとセキュリティグループの詳細で設定を更新します。

awsラムダ更新機能-コンフィギュレーション機能-name cnq-nfs-lambda \--vpc-config '{"SubnetIds":["subnet-0a1b2c3d", "subnet-4e5f6g7h"],"SecurityGroupIds":["sg-0abc123def456ghi7"]}'

オプションユースケースに合わせたカスタムポリシーの添付

Lambda関数が(S3のような)追加サービスにアクセスする必要がある場合は、カスタムポリシーを作成します。例えば

{"バージョン":"2012-10-17","Statement":[{"シド":"AllowCloudWatchLogs", "効果":"許可", "アクション":["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],"Resource":"arn:aws:logs:*:*:*"},{"Sid":"AllowS3Access", "Effect":"許可", "アクション":["s3:GetObject","s3:PutObject","s3:ListBucket"],"Resource":["arn:aws:s3:::YOUR_BUCKET_NAME","arn:aws:s3:::YOUR_BUCKET_NAME/*"]}]}

注意:本番では、最小特権の原則を必ず使用すること。

テスト

すべての準備が整ったので、いよいよ実際に作業を見てみよう:
ラムダ関数をトリガーする:

aws lambda invoke機能-名前 cnq-nfs-lambda ¦ペイロード '{}' ¦cli-binary-format raw-で-base64-out \response.json

テストシステム上にCNQ NFSエクスポートをマウントし、ファイルを表示して機能を検証する:

$ sudo mkdir /mnt/test$ sudo mount -t nfs -o vers=3,tcp,nconnect=16 10.99.2.230:/lambdatest /mnt/test$ cat /mnt/test/testing-from-lambda.txtCNQ 経由で AWS Lambda からこんにちは! - 2025-04-03T21:01:21

デバッグ:エラーが発生した場合、デバッグのために出力を表示することができます:

aws logs filter-log-events --log-group-name /aws/lambda/cnq-nfs-lambda --limit 5なぜこれが重要なのか?

AWS LambdaとCNQを統合することで、サーバーレス機能が強化され、複雑さを追加することなくシームレスなステートフルワークフローが可能になります。CNQのマルチプロトコルのサポートは、レガシーシステムとの互換性を解き放ち、堅牢でスケーラブルなファイルストレージを、高速、シンプル、サーバーレスで提供します。

ハッピーなコーディングだ!

非ステータス・アプリケーションのための永続的な実装