0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon S3 Filesを使ってみた

0
Posted at

はじめに

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にマウントターゲットを作成する必要があります。また、作成には数分程度かかる場合があります。

そのため、作成直後にすぐマウントしようとせず、マウントターゲットが利用可能になっていることを確認してから次の作業へ進みます。

image.png
image.png

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ファイルシステムと同じような感覚で操作できます。

image.png

基本的なファイル操作を試してみる

ここから実際にファイル操作を試します。

まず、マウントしたディレクトリへ移動します。

cd /mnt/s3files

ファイルを作成する

まずはファイルを作成します。

echo "Hello S3 Files" > created.txt

作成されたことを確認します。

ls -la
cat created.txt

以下のように内容が表示されれば成功です。

Hello S3 Files

image.png

ファイルに追記する

次に、ファイルへの追記を試します。

echo "Append text" >> created.txt

内容を確認します。

cat created.txt

複数行の内容が表示されれば、ファイルへの追記も行えています。

image.png

ファイルを編集する

続いて、既存ファイルの内容を変更してみます。

sed -i 's/Hello/Hi/' created.txt

変更後の内容を確認します。

cat created.txt

このように、Linuxで普段利用しているコマンドからファイルを操作できます。
image.png

ファイルをコピーする

次にコピーを試します。

cp created.txt copied.txt
ls -la

created.txt と copied.txt の両方が存在することを確認できます。

image.png

ファイルを移動する

続いて、コピーしたファイルを移動します。

mv copied.txt moved.txt
ls -la

copied.txt がなくなり、moved.txt が作成されていれば移動できています。
image.png

ファイルを削除する

最後にファイルを削除します。

rm moved.txt
ls -la

不要なファイルが削除されていることを確認できます。
image.png

ディレクトリを作成する

ファイルだけでなく、ディレクトリも作成できます。

mkdir test-directory
ls -la

ディレクトリが作成されたことを確認します。
image.png

今回の検証では、このようにLinuxで一般的に利用するファイル操作をS3 Files上で試すことができました。

S3側から確認する

ここまでEC2からファイルを操作してきました。

では、実際にS3バケット側へ反映されているか確認してみます。

AWS CLIからS3バケットの内容を確認します。

aws s3 ls s3://<S3_BUCKET_NAME>/ --recursive

EC2から作成したファイルがS3側にも存在することを確認できます。

例えば、先ほど作成した created.txt が表示されます。

image.png

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())

image.png

このように、S3を意識せずファイルとして扱えるため、既存のファイルベースのアプリケーションをAWS上で動かす場合にも利用方法を検討できそうです。

また、S3 Filesは複数のコンピューティングリソースから同じデータへアクセスする用途も想定されています。S3をデータの保存先として利用しながら、ファイルシステムとしてアクセスできるため、データを別のファイルシステムへコピーして利用する構成を減らせる可能性があります。

実際のシステムでは、アクセスパターンや性能要件、ファイルサイズ、同時アクセス数、料金などを確認した上で、S3 Files、Amazon EFS、Amazon FSxなどを使い分ける必要があります。

まとめ

今回は、Amazon S3 Filesを使ってS3バケットをファイルシステムとしてEC2から利用してみました。

実際の流れとしては、

  1. S3バケットを用意する
  2. S3 Filesを作成する
  3. マウントターゲットを作成する
  4. EC2からS3 Filesをマウントする
  5. Linuxのファイル操作を実行する
  6. S3側への反映を確認する

という手順になります。

実際に使ってみると、S3上のデータを /mnt/s3files のような通常のディレクトリとして扱えるため、Linuxのファイル操作をそのまま利用できる点が分かりやすい機能だと感じました。

S3はこれまで「オブジェクトを保存する場所」というイメージが強かったですが、S3 Filesによってファイルシステムという別のアクセス方法も選択できるようになっています。

特に、既存のアプリケーションやスクリプトがファイルパスを前提としている場合、S3 Filesを利用することでS3上のデータをそのまま利用できる可能性があります。

今回はEC2から基本的な操作を試しただけなので、今後は実際のアプリケーションから利用した場合の挙動や、複数のEC2から同時にアクセスした場合についても検証してみたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?