はじめに
Amazon S3といえば、AWSでよく利用されるオブジェクトストレージです。
画像やログ、バックアップ、アプリケーションのデータなどを保存でき、AWSのさまざまなサービスから利用できます。一方で、S3は一般的なLinuxのファイルシステムとは少し性質が異なります。
例えば、EC2からS3上のファイルを扱う場合、AWS CLIやSDKを利用してオブジェクトを取得・更新する方法が一般的です。
今回試してみたのが Amazon S3 Files です。
S3 Filesを利用すると、S3バケットのデータをファイルシステムとしてEC2などのコンピューティングリソースから利用できます。
つまり、S3を直接APIで操作するのではなく、EC2上から見ると通常のディレクトリとして扱えるようになります。
そこで今回は、実際にS3 Filesを作成し、EC2からマウントしてファイル操作を試してみました。
Amazon S3 Filesとは
Amazon S3 Filesは、Amazon S3のバケットをファイルシステムとして利用するための機能です。
S3 Filesでは、S3オブジェクトをファイルやディレクトリとして扱うことができます。AWS公式ドキュメントでは、NFS v4.1以降のファイルシステム操作をサポートしており、ファイルの作成、読み取り、更新、削除などの操作が可能とされています。
従来のS3では、例えばファイルを取得する場合はAWS CLIの aws s3 cp やAWS SDKなどを利用します。
一方、S3 Filesではファイルシステムとしてマウントするため、EC2上から次のようなLinuxコマンドを利用できます。
ls
cat
cp
mv
rm
mkdir
既存のファイルベースのアプリケーションからS3上のデータを扱いやすくなる点が、S3 Filesの大きな特徴です。
また、S3 Filesは複数のAWSコンピューティングリソースから利用できる共有ファイルシステムとして構成できます。AWS公式ブログでは、EC2だけでなくECS、EKS、Lambdaからの利用も紹介されています。
今回の検証では、まず分かりやすくEC2からS3 Filesをマウントして、基本的なファイル操作を確認します。
今回の検証環境
今回の検証では、以下のAWSリソースを使用します。
- Amazon S3
- Amazon S3 Files
- Amazon EC2
- Amazon VPC
- IAM
- AWS Systems Manager
※EC2⇔S3 Files間で2049ポートの疎通が必用
※S3バケットはバージョニングが必要
作成したEC2へAWS Systems ManagerのSession Managerを利用して接続します。
S3 Filesについては、既存のS3バケットをファイルシステムとして公開し、EC2からマウントします。
今回の全体構成は以下のようになります。
構成図
AWS
┌─────────────────────────────────────────┐
│ │
│ ┌──────────────┐ │
│ │ EC2 │ │
│ │ │ │
│ │ /mnt/s3files │ │
│ └──────┬───────┘ │
│ │ │
│ │ NFS │
│ ▼ │
│ ┌──────────────┐ │
│ │ S3 Files │ │
│ │ Mount Target │ │
│ └──────┬───────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Amazon S3 │ │
│ │ │ │
│ │ bucket │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────┘
S3 Filesを利用するためには、S3バケットだけでなく、EC2から接続するためのマウントターゲットも必要になります。
マウントターゲットはVPC内のネットワークエンドポイントとして機能し、EC2と同じVPC・Availability Zoneに作成する必要があります。
S3 Filesを作成する
今回はすでに作成済みのバケットを利用します。
まずはEC2からS3 Filesを作成します。
AWS CLIでは aws s3files create-file-system コマンドを利用します。
aws s3files create-file-system \
--region ap-northeast-1 \
--bucket arn:aws:s3:::<S3_BUCKET_NAME> \
--role-arn arn:aws:iam::<AWS_ACCOUNT_ID>:role/<IAM_ROLE_NAME>
<S3_BUCKET_NAME>は対象のS3バケット、
<IAM_ROLE_NAME>はS3Filesに付与するロール名を自分の環境に合わせて変更します。
コマンドを実行すると、作成されたファイルシステムの情報がJSON形式で返ってきます。
その中にある fileSystemId を控えておきます。
例えば、以下のようなIDです。
fs-xxxxxxxxxxxxxxxxx
このIDは、後ほどEC2へマウントするときに使用します。
なお、S3 FilesからS3バケットへアクセスするためにはIAMロールが必要です。AWS公式ドキュメントでも、S3 FilesがS3バケットに対して読み書きできる権限を持つIAMロールを指定する構成になっています。
マウントターゲットを作成する
S3 Filesを作成しただけでは、EC2からアクセスできません。
EC2から接続するために、マウントターゲットを作成します。
aws s3files create-mount-target \
--region ap-northeast-1 \
--file-system-id fs-xxxxxxxxxxxxxxxxx \
--subnet-id subnet-xxxxxxxxxxxxxxxxx
ここでは、先ほど取得した fileSystemId と、EC2が存在するサブネットのIDを指定します。
マウントターゲットはVPC内からS3 Filesへアクセスするためのネットワーク上の接続先になります。
AWS公式ドキュメントでは、EC2と同じVPCにあるサブネットを指定し、EC2と同じAvailability Zoneにマウントターゲットを作成する必要があります。また、作成には数分程度かかる場合があります。
そのため、作成直後にすぐマウントしようとせず、マウントターゲットが利用可能になっていることを確認してから次の作業へ進みます。
EC2からS3 Filesをマウントする
マウントターゲットが準備できたら、EC2からS3 Filesをマウントします。
まず、マウント先となるディレクトリを作成します。
sudo mkdir /mnt/s3files
続いて、S3 Filesをマウントします。
sudo mount -t s3files fs-xxxxxxxxxxxxxxxxx:/ /mnt/s3files
AWS公式の手順でも、この mount -t s3files を利用してEC2へマウントします。
マウントできたか確認します。
mount | grep s3files
また、ディレクトリの中身も確認してみます。
ls -la /mnt/s3files
これで、EC2上の /mnt/s3files がS3 Filesのマウントポイントになります。
ここからは、通常のLinuxファイルシステムと同じような感覚で操作できます。
基本的なファイル操作を試してみる
ここから実際にファイル操作を試します。
まず、マウントしたディレクトリへ移動します。
cd /mnt/s3files
ファイルを作成する
まずはファイルを作成します。
echo "Hello S3 Files" > created.txt
作成されたことを確認します。
ls -la
cat created.txt
以下のように内容が表示されれば成功です。
Hello S3 Files
ファイルに追記する
次に、ファイルへの追記を試します。
echo "Append text" >> created.txt
内容を確認します。
cat created.txt
複数行の内容が表示されれば、ファイルへの追記も行えています。
ファイルを編集する
続いて、既存ファイルの内容を変更してみます。
sed -i 's/Hello/Hi/' created.txt
変更後の内容を確認します。
cat created.txt
このように、Linuxで普段利用しているコマンドからファイルを操作できます。

ファイルをコピーする
次にコピーを試します。
cp created.txt copied.txt
ls -la
created.txt と copied.txt の両方が存在することを確認できます。
ファイルを移動する
続いて、コピーしたファイルを移動します。
mv copied.txt moved.txt
ls -la
copied.txt がなくなり、moved.txt が作成されていれば移動できています。

ファイルを削除する
最後にファイルを削除します。
rm moved.txt
ls -la
ディレクトリを作成する
ファイルだけでなく、ディレクトリも作成できます。
mkdir test-directory
ls -la
今回の検証では、このようにLinuxで一般的に利用するファイル操作をS3 Files上で試すことができました。
S3側から確認する
ここまでEC2からファイルを操作してきました。
では、実際にS3バケット側へ反映されているか確認してみます。
AWS CLIからS3バケットの内容を確認します。
aws s3 ls s3://<S3_BUCKET_NAME>/ --recursive
EC2から作成したファイルがS3側にも存在することを確認できます。
例えば、先ほど作成した created.txt が表示されます。
S3 Filesでは、ファイルシステム側で行った変更がS3バケットへ反映されます。
検証の中で、S3側に変更が反映されるまで少し時間がかかるケースもありました。
そのため、ファイルを作成した直後にS3側を確認して表示されなくても、少し待ってから再確認するとよいでしょう。
S3 Filesを使ってみて分かったこと
今回実際にS3 Filesを利用して、S3をファイルシステムとして扱ってみました。
通常、S3を利用する場合はAWS CLIやSDKなどを使ってオブジェクトを操作します。
例えば、アプリケーションからファイルを扱う場合にも、S3用のAPIを呼び出す処理が必要になることがあります。
S3 Filesでは、S3バケットをマウントしてしまえば、アプリケーションから見たアクセス先は通常のファイルパスになります。
例えばPythonであれば、以下のようなコードでファイルを扱えます。
file_path = "/mnt/s3files/sample.txt"
with open(file_path, "w") as f:
f.write("Hello S3 Files")
読み込みも通常のファイル操作と同じです。
with open("/mnt/s3files/sample.txt", "r") as f:
print(f.read())
このように、S3を意識せずファイルとして扱えるため、既存のファイルベースのアプリケーションをAWS上で動かす場合にも利用方法を検討できそうです。
また、S3 Filesは複数のコンピューティングリソースから同じデータへアクセスする用途も想定されています。S3をデータの保存先として利用しながら、ファイルシステムとしてアクセスできるため、データを別のファイルシステムへコピーして利用する構成を減らせる可能性があります。
実際のシステムでは、アクセスパターンや性能要件、ファイルサイズ、同時アクセス数、料金などを確認した上で、S3 Files、Amazon EFS、Amazon FSxなどを使い分ける必要があります。
まとめ
今回は、Amazon S3 Filesを使ってS3バケットをファイルシステムとしてEC2から利用してみました。
実際の流れとしては、
- S3バケットを用意する
- S3 Filesを作成する
- マウントターゲットを作成する
- EC2からS3 Filesをマウントする
- Linuxのファイル操作を実行する
- S3側への反映を確認する
という手順になります。
実際に使ってみると、S3上のデータを /mnt/s3files のような通常のディレクトリとして扱えるため、Linuxのファイル操作をそのまま利用できる点が分かりやすい機能だと感じました。
S3はこれまで「オブジェクトを保存する場所」というイメージが強かったですが、S3 Filesによってファイルシステムという別のアクセス方法も選択できるようになっています。
特に、既存のアプリケーションやスクリプトがファイルパスを前提としている場合、S3 Filesを利用することでS3上のデータをそのまま利用できる可能性があります。
今回はEC2から基本的な操作を試しただけなので、今後は実際のアプリケーションから利用した場合の挙動や、複数のEC2から同時にアクセスした場合についても検証してみたいと思います。










