はじめに
従来のファイルシステムを扱う方法と課題
従来Cloud Runで大きなファイルを扱う場合システムは一時的なものです。永続化ストレージとしては設計されておらず、コンテナが停止したりスケールアウトしたりするとデータは失われます。
永続的なデータではないにせよ、一時的にファイルを利用する場合、Cloud Runではコンテナインスタンスに割り当てられたメモリ(/tmpなどにマップされる)を使用する必要がありました。
また、ファイルをメモリ内の一時領域に保存して利用する場合、特にサイズの大きなファイルを処理する際にファイルのサイズがそのままコンテナインスタンスのメモリ容量を圧迫します。特に大容量のファイルを扱う場合、Cloud Runに必要なメモリ容量が大量に必要となり、結果としてより高価なインスタンスタイプを選択する必要になります。
実施手順
それでは具体的な実施手順について記載します。まずはマウントするGCSのバケットを用意しましょう。設定で特に注意する点はありません。
今回は「cloudrun-example-test」というバケットを作成しました。
次にサンプルプログラムを作成します。
サンプルプログラム
Cloud Run上で動かすサンプルプログラムは下記になります。
サンプルプログラムはnodeで作成しています。
import express from 'express';
import fs from 'fs';
const app = express();
app.get('/', (req, res) => {
fs.appendFileSync('/mnt/gcs-test/sample-logfile.txt', 'Hello logs!', { flag: 'a+' });
const name = process.env.NAME || 'World';
res.send(`Hello ${name}!`);
});
const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
console.log(`helloworld: listening on port ${port}`);
});
Cloud Runを利用する場合、サンプルプログラムのようなローカルファイルシステムへの保存はできませんでしたが、Cloud RunにマウントすることでGCSに保存が可能になりました。
次に、Cloud Runへのデプロイコマンドを記述します。
gcloud run deploy --source . \
--add-volume name=VOLUME_NAME,type=cloud-storage,bucket=BUCKET_NAME \
--add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH
赤字部分がGCSのマウントに必要な部分になります。
各パラメータは下記になります。
- MOUNT_PATH: ボリュームをマウントする相対パス(/mnt/my-volume など)
- VOLUME_NAME: ボリュームに付ける名前
- VOLUME_NAME 値は、ボリュームをボリューム マウントにマッピングするために使用
- BUCKET_NAME: Cloud Storage バケットの名前
事前にGCS上にバケットは作成してください。また、MOUNT_PATHとプログラムのパスは同じにしてください。
では実際にデプロイしてみましょう。
作成したバケットとサンプルプログラムの例をもとにデプロイコマンドに値を入れてみると下記のようになります。
gcloud run deploy --source . \
--add-volume name=gcs-test,type=cloud-storage,bucket=cloudrun-example-test \
--add-volume-mount volume=gcs-test,mount-path=/mnt/gcs-test
デプロイ後下記のように表示されます。
コンソールから設定値を見てみましょう。
ボリュームに設定したバケットが追記されています。
「マウントされたボリューム」の設定で指定したマウントパスが設定されていることを確認しました。
それでは動作確認を行なってみます。Cloud Runに表示してある接続先URLをブラウザに記載してみましょう。
下記のように「Hello World!」と表示されれば成功です。
次に実際にGCSにファイルが作成されているか確認してみましょう。
ローカルファイルシステムを扱う関数でファイルが保存されることを確認できました!
終わりに
Cloud Runのボリュームマウント機能を活用することで、これまで課題とされていたコンテナ環境における永続ストレージの利用が可能となり、ローカルファイルシステムとの互換性を維持しつつ、Google Cloud Storage(GCS)上のデータを柔軟かつ効率的に扱えるようになりました。
今回ご紹介した手順を通じて、大容量のファイル処理などに本ブログの内容が活用できたら幸いです。
- カテゴリ:
- Cloud Storage