📝

Elastic Beanstalk から FSx for NetApp ONTAP をマウントしてみた

に公開

Elastic Beanstalk 環境の EC2 インスタンスから FSx for NetApp ONTAP をマウントしてファイルを書き込んでみました。

FSx for NetApp ONTAP ファイルシステムの作成

以下以外はデフォルト設定で作成しました。

  • ファイルシステム名: 今回は test
  • SSD ストレージ容量: 1024 GiB

動作確認用 EC2 インスタンスの作成

以下の設定で EC2 インスタンスを作成しました。

  • AMI: Amazon Linux 2
  • VPC: デフォルト VPC
  • セキュリティグループ: デフォルト VPC
    • インバウンド、アウトバウンドはすべて開放
  • IAM インスタンスプロファイル: AdministratorAccess 権限を付与した IAM ロール

EC2 インスタンスからファイルシステムへのマウント

後述の動作確認のためにマウントしておきます。
svm の NFS DNS 名は以下の手順で確認できます。

  1. FSx for NetApp ONTAP コンソール
  2. 対象のファイルシステム
  3. ストレージ仮想マシン
  4. 対象の svm 名
  5. エンドポイント
$ sudo mkdir -p /fsx
$ sudo mount -t nfs <svm の NFS DNS 名>:/vol1
$ ls -l /fsx
# この時点ではファイルが存在しないことを確認

Elastic Beanstalk 環境用のアプリケーション

Tutorials and samples - AWS Elastic Beanstalk
上記ドキュメントから Node.js のサンプルアプリである nodejs.zip をダウンロードしてローカル端末などで解凍します。

解凍後、以下のディレクトリ・ファイル構成になるよう編集します。

nodejs/
├── .ebextensions/
│   └── logging.config
├── .platform/hooks/prebuild/
│   └── 01-mount-fsx.sh
├── app.js
├── cron.yaml
├── index.html
├── package.json

デフォルトアプリから追加する構成は .platform の部分です。
01-mount-fsx.sh には以下の内容を定義します。

01-mount-fsx.sh
#!/bin/bash

yum install -y nfs-utils

mkdir -p /mnt/fsx

# NFS のマウント
mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 \
<svm の NFS DNS 名>:/vol1 \
/mnt/fsx

# 書き込みテスト用のログファイル作成とパーミッション調整
touch /mnt/fsx/log.txt
chown -R webapp:webapp /mnt/fsx
chmod -R 775 /mnt/fsx

echo "FSx mounted and permissions set" >> /var/log/web.stdout.log

app.js には以下の内容を定義します。

app.js
const express = require("express");
const fs = require("fs");
const path = require("path");

const app = express();
const port = process.env.PORT || 8080;

const logPath = "/mnt/fsx/log.txt";

app.get("/", (req, res) => {
  const message = `Accessed at ${new Date().toISOString()}\n`;

  // マウント先に書き込み
  fs.appendFile(logPath, message, (err) => {
    if (err) {
      console.error("Failed to write log:", err);
      return res.status(500).send("Failed to write to FSx mount.");
    }
    res.send(`Hello from Elastic Beanstalk! Log written to FSx:\n${message}`);
  });
});

app.listen(port, () => {
  console.log(`App running on port ${port}`);
});

package.json には以下の内容を定義します。

package.json
{
  "name": "fsx-eb-app",
  "version": "1.0.0",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "^4.18.2"
  }
}

各種ファイル編集後、ルートディレクトリである nodejs を含めずに全ファイルを zip 化します。

Elastic Beanstalk 環境の作成

以下の設定で作成します。

  • プラットフォーム: Node.js 22 running on 64bit Amazon Linux 2023/6.5.1
  • コードは上記手順で作成した zip ファイルをアップロード
  • プリセット: 単一インスタンス
  • VPC: デフォルト VPC
  • CloudWatch ログへのインスタンスログのストリーミング: オン

数分でデプロイが完了します。
デプロイ完了後、Elastic Beanstalk のデフォルトドメインにアクセスして、以下の内容が表示されれば成功です。

Hello from Elastic Beanstalk! Log written to FSx: Accessed at xxx

エラーが発生した場合は CloudWatch Logs のログを確認してください。
主にセキュリティグループでのネットワーク疎通の問題や NFS DNS 名の指定ミスが考えられます。

書き込まれたファイル確認

FSx for NetApp ONTAP にマウント済みの EC2 インスタンスから書き込まれたファイルを確認してみます。

$ ls -l /fsx
total 4
-rwxrwxr-x 1 900 900 148 May 16 06:34 log.txt

$ cat /fsx/log.txt
Accessed at 2025-05-16T05:57:08.425Z
Accessed at 2025-05-16T06:02:30.424Z
Accessed at 2025-05-16T06:03:47.698Z
Accessed at 2025-05-16T06:34:02.593Z
Accessed at 2025-05-16T06:44:58.782Z

app.js から書き込んだ log.txt が存在し、書き込みされていることも確認できました。

まとめ

今回は Elastic Beanstalk から FSx for NetApp ONTAP をマウントしてみました。
どなたかの参考になれば幸いです。

参考資料

Discussion