世界を統治する手始めに CloudShell から S3 をマウントした。ってはなし

記事タイトルとURLをコピーする

大量の re:Invent 2023 のレポート投稿に追いつけ追い越せ。と Advent Calendar の方も盛り上げていきましょう。

qiita.com

こんにちは、アプリケーションサービス部の千葉@4日目担当です。

コロナウイルスのニュースがめっきり減ったと思ったら、次はインフルエンザが流行っているみたいですね。
ウチのチビが通っている幼稚園では、30名のクラスのうち12名が体調を崩してお休みをしていました。
『子供は風の子』なんて簡単には言ってはイケない世の中みたいです。

あわただしい年の暮れですが、皆様どうぞお健やかにお過ごしください。

さて今回のタイトルについてですが、いつか私が世界を統治したなら戦争と貧困と二日酔いをなくしたいな。と、飲んだ翌日に妄想しています。

ご賛同・ご興味を頂けましたら、ぜひ以下のサイトをご確認ください。

www.serverworks.co.jp

そんな素晴らしい未来に向けての Day One ってコトで、今日は手始めに CloudShell から S3 をマウントしてみたいと思います。

AWS CloudShell について

AWS CloudShell の概要については 公式: What is AWS CloudShell? をご確認ください。
2020年の re:Invent で発表があり、無料で利用できることから当初は CloudShell でどれだけ面白いことができるか。を多くのエンジニアが発信していた記憶です。

とてもユニークなサービスなのですが、いくつかの制限があります。

  1. 1 vCPU (仮想 CPU) / 2 GiB メモリ
  2. 各シェルセッションが終了した後にリサイクルされるエフェメラルな環境
  3. HOMEディレクトリのみ永続的ストレージとして利用可能(1GB)
  4. 最後のセッション終了から120日間アクセスがなければ HOME ディレクトリは自動的に削除

ほかにもインバウンド通信の遮断、VPC内のリソースへのアクセスは不可等の制約がありますが、すこし複雑なことをやろうとチャレンジしたが 3 のストレージ制限で詰んでしまい断念した。って事例を幾つかみてきました。
↓わたしもそのひとりです。

blog.serverworks.co.jp

S3 のマウントについて

S3 をローカルのファイルシステムとしてマウントしたい。って要望は、AWS 初期の頃から多くの声があり s3fs をはじめとする多くのツールが 3rd party からリリースされてきました。
AWS からは EFS がリリースされ、ローカルのファイルシステムとしてマウントできるストレージはココに落ち着くんだろうな。と思っていたんです。(CloudShell から EFS は利用できません)

そしたら今年の8月に↓こんな記事が流れてきたではありませんか。

aws.amazon.com

Advent Calendar の投稿に8月の記事を引っ張ってきて言うのも何ですが、早速試してみましょうじゃありませんか。

インストール、マウント

以下の例では S3 バケット example_s3_bucket をローカルディレクトリ ~/mnt にマウントしています。

$ wget https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.rpm
$ sudo yum install -y mount-s3.rpm
$ mkdir ~/mnt
$ mount-s3 example_s3_bucket ~/mnt --allow-delete

マウント状況の確認

$ mount --types fuse
mountpoint-s3 on /home/cloudshell-user/mnt type fuse (rw,nosuid,nodev,noatime,user_id=1000,group_id=997,default_permissions)

検証1: ストレージ 1GB 制限を回避できるのか?

HOMEディレクトリの制限が 1GB なので、試しに 3GB のファイルを生成してみてストレージの状況を確認してみましょう。
実行前に確認した /home/cloudshell-user の利用率は 3% です。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          16G  3.5G   12G  24% /
tmpfs            64M     0   64M   0% /dev
shm              64M     0   64M   0% /dev/shm
/dev/nvme1n1     16G  3.5G   12G  24% /home
/dev/loop0      974M   24M  883M   3% /home/cloudshell-user
/dev/nvme0n1p1   30G  5.1G   25G  17% /aws/mde/mde

3GB のファイルを /home/cloudshell-user/mnt/3G.dummy に作成します。

$ dd if=/dev/zero of=~/mnt/3G.dummy bs=1M count=3000
$ ls -lh ~/mnt/
total 3.0G
-rw-r--r--. 1 cloudshell-user cloudshell-user 3.0G Dec  3 16:16 3G.dummy

3GB のファイル作成後も /home/cloudshell-user の利用率が 3% のままであることを確認します。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          16G  3.5G   12G  24% /
tmpfs            64M     0   64M   0% /dev
shm              64M     0   64M   0% /dev/shm
/dev/nvme1n1     16G  3.5G   12G  24% /home
/dev/loop0      974M   24M  883M   3% /home/cloudshell-user
/dev/nvme0n1p1   30G  5.1G   25G  17% /aws/mde/mde

実際に S3 に 3G.dummy オブジェクトが作成されていることを確認します。

Management Console - S3

検証2: ファイル操作

公式: Mountpoint for Amazon S3 - Configuration and usage にて以下の一文があります。

Mountpoint for Amazon S3 intentionally does not implement the full POSIX standard specification for file systems.

意図的にPOSIX標準仕様に準拠していない。とのことです。
基本的なファイル操作でみるとファイルの作成・削除はOK、移動・編集はNGのようです。
(vim でファイルを編集しようもんならヒドい状態になりました)

$ echo "abc" > ~/mnt/foo.txt

$ echo "def" >> ~/mnt/foo.txt
-bash: /home/cloudshell-user/mnt/foo.txt: Operation not permitted

$ mv ~/mnt/foo.txt ~/mnt/bar.txt
mv: cannot move ‘/home/cloudshell-user/mnt/foo.txt’ to ‘/home/cloudshell-user/mnt/bar.txt’: Function not implemented

$ rm ~/mnt/foo.txt 

詳細は 公式: Mountpoint for Amazon S3 file system behavior をご確認ください。

アンマウント

$ sudo umount ~/mnt

まとめ

POSIX標準仕様に準拠していないので、利用シーンは限られてしまいますが追加・参照・削除のみのファイル操作であれば 1GB の制限を回避できるようになりました。

未検証ですが、たとえば ~/.config を S3 にもっていけば Python の仮想環境やパッケージファイルでストレージを食い潰さないような運用ができるんじゃないかな。とか

世界の統治までの道はとんでもなく遠そうですが千里の道も一歩から。ってヤツです。
いつの日か二日酔いのない世界がくることを信じて来年も頑張っていきます。

草々

千葉 哲也 (執筆記事の一覧)

アプリケーションサービス部

コーヒーゼリーが好きです。