新しく発表されたAmazon S3 Express One Zoneストレージクラスを触ってみる

この記事は[BeeX Advent Calendar 2023](https://qiita.com/advent-calendar/2023/beex)の7日目の記事です。

# はじめに
今年もラスベガスでAWSのグローバルイベントのre:Invent 2023開催されました。

https://aws.amazon.com/jp/events/reinvent-2023/

今回は数あるAWSアップデートの中でも、特に気になったAmazon S3 Express One Zoneストレージクラスについて、実際に触りながら見ていきたいと思います。

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-s3-express-one-zone-storage-class/


※検証したままを書いているので、多少読みづらいかもしれません。


# Amazon S3 Express One Zoneストレージクラスとは
公式のリリースには以下のように記載されていました。

>Amazon S3 Express One Zoneストレージクラスは、一貫した1桁ミリ秒のリクエストレイテンシーを必要とするパフォーマンスクリティカルなアプリケーション向けに、最速のクラウドオブジェクトストレージを提供することを目的として構築されています。
>S3 Express One Zoneは、S3 Standardと比較して、データアクセス速度を10倍向上させ、リクエストコストを50%削減することができ、最も頻繁にアクセスされるデータセットに対して毎分数百万のリクエストを処理できるように拡張できます。機械学習トレーニング、インタラクティブ分析、メディアコンテンツ作成などのワークロードで、高い耐久性と可用性を備えた1桁ミリ秒のデータアクセス速度を実現します。

以下のドキュメントにある通り、このアップデートが出るまでは、S3のレイテンシーをミリ秒に抑えたい場合、CloudFront等のコンテンツのキャッシュが可能なサービスとの組み合わせが必要となっていました。

>例えば、HTTP 接続ごとの転送レートを高めたい場合やレイテンシーをミリ秒単位に抑えたい場合は、Amazon CloudFront または Amazon ElastiCache を Amazon S3 のキャッシュとして使用します。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/optimizing-performance.html

今回発表された「Amazon S3 Express One Zoneストレージクラス」を利用することで、他のAWSサービスやアプリケーションは１桁ミリ秒のリクエストレイテンシーでオブジェクトストレージを利用することができる、という内容でした。

# 利用時の注意点
利用時の注意点として、通常S3は格納されたデータを複数のAZに複製して保管するような仕組みになっているので高い耐久性を持つことで知られますが、この「S3 Express One Zone」では単一のAZのみに保管することになるため、耐久性はStandardクラスに比べると下がってしまうというデメリットがあります。

ただ、[ドキュメント](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-one-zone.html)を読むと「データは単一のアベイラビリティゾーン内の複数のデバイスに冗長的に保存されます」とあるので、単一のAZの中では常に複数のデバイスに冗長化される仕組みとなっているようです。

>S3 Express One Zoneでは、AWS Region内の特定のAWS Availability Zoneを選択してデータを保存することができます。さらにパフォーマンスを最適化するために、ストレージとコンピュートリソースを同じAvailability Zoneに配置することができます。

# ユースケース

ユースケースとしては、SageMakerのモデルトレーニングやAthenaやEMR、GlueなどでのS3アクセスの高速化が上げられておりました。

>S3 Express One Zoneを使用すると、Amazon SageMaker Model Training、Amazon Athena、Amazon EMR、AWS Glue Data Catalogなどのサービスを使用して、AI/MLおよび分析ワークロードを高速化できます。

# 利用可能リージョン(2023/11/28時点)
発表時点では、東京を含む一部リージョンでのみ利用可能となっていました。

>S3 Express One Zoneは通常、米国東部（バージニア州北部）、米国西部（オレゴン州）、欧州（ストックホルム）、アジア太平洋（東京）のAWSリージョンで利用できる。

# S3バケット作成
ドキュメントを確認したところで、東京リージョンで実際に構築してみようと思います。

S3コンソールにアクセスして、「バケットを作成」から作成画面に遷移すると、バケットタイプが複数選択できるようになっていました。
これまで利用していた「Standard」クラスを使いたい場合は"汎用"タイプ、「S3 Express One Zone」クラスを使いたい場合は"ディレクトリ"タイプを選択します。
"ディレクトリ"タイプで構築したS3はディレクトリバケットと呼ぶようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/4dc33a96-8410-36a3-ee9d-c0e97c4ebb13.png)

バケットタイプを選択したら、構築先のAZを選択します。
検証時点(2023/11/30)で指定できるAZは、AZ-AとAZ-Cの2つのみのようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/657fb585-009a-2e91-e7d1-9cfb76927388.png)

AZを選択したら、次にバケット名を入力します。
バケット名には、自動的にサフィックスとしてAZ IDが含まれるようになっているようです。
AWSのパーティション内で一意にする必要があるのは通常のS3と変わらないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/c18c3107-b163-c9f2-f710-8ec274e142fb.png)

残りの項目として、オブジェクト所有者、ブロックパブリックアクセス、暗号化設定がありました。
ただ、いずれ設定できるようになるのかもしれませんが、検証時点ではいずれも選べないようになっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/7e11633a-a2dd-b2c5-b631-6751a8f4e357.png)

ディレクトリバケットが作成できると、バケットの一覧から確認することができます。
一覧画面では、汎用バケットタブとディレクトリバケットタブに分かれていました。
タイプごとに分けて確認できるので、これは嬉しいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/c0fa3195-d22f-0258-83a8-964584b3c0ba.png)

# 作成リソース確認
バケット名を押下して、画面を確認してみます。
オブジェクトタブは通常のS3と変わりませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/38e66d3a-6340-b69d-dc81-9beee98c94d7.png)

プロパティタブの項目はかなり少ないです。
リージョンとAZ、あとは暗号化設定とARNぐらいしか表示されていませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/eb58e72f-d0f5-76bc-7036-eaf788d1e7fb.png)

アクセス許可タブの項目もかなり少ないです。
ただ、バケットポリシーの設定項目はあったので、これまでのS3と同じようにポリシーによるアクセス制御はできそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/f0eeb6dc-463e-d2f2-3d8b-24715deb45fd.png)

メトリクスタブでは、合計バケットサイズとオブジェクト合計数が確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/565f9d9f-9aa7-f49b-da6f-d943589a04b4.png)

# コンテンツアップロード
ディレクトリバケットが作成できたので、実際にコンテンツをアップロードしてみます。

通常のS3と同じようにコンソールのアップロードボタンからでもファイルアップロードができるのですが、今回は敢えてディレクトリバケットのインポート機能を利用して、オブジェクトを既存の別のS3バケットから取り込んでみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/ff57ec21-5b1b-f8cf-e1ec-53e1486af77f.png)

対象のディレクトリバケットを選択して、インポートボタンを押下すると、インポートを行う画面に遷移します。
そこで、インポート元のS3バケット、インポートに利用するIAMロールの2つを入力もしくは選択します。
送信先やオブジェクトの設定は自動で入力されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/f1f6c825-5b95-cada-a885-5e3d19b3a3b2.png)

>Batch Operations のコピーオペレーションは、最大 5 GB のサイズのオブジェクトをサポートします。5 GB を超えるソースオブジェクトはこのジョブには含まれません。

と、書かれていたので、裏側ではBatch Operationsが利用されているようです。

インポートを実行すると、バッチオペレーションの画面に遷移しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/9bb0e42d-a782-8100-2456-954fc647d2f2.png)

半日待ちましたが全然終わらないので放置したのですが、翌日確認したところ失敗していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/a381e20e-35d7-a4f9-2bb2-560320d43511.png)

AWSアカウントに紐づけてるメールアドレス宛に、Amazon S3のプロダクトマネージャーの方から以下のようなメールが届いていました。
「無効なKMSキーを使用して暗号化されたオブジェクトがあり、Importジョブが無効なKMSキーを使用してコピーしようとして失敗していた」と連絡がありました。ジョブは手動で失敗していただいたようです。
※AWSのプロダクトマネージャーから直接メールが届くのは初だったので驚きました

>私たちは、あなたがS3管理コンソール（ジョブID：198367c9-33f8-409c-b5e7-e19816300a5a）からS3ディレクトリバケットにデータをコピーするためにインポートジョブを開始したことに気づきました。S3PutObjectCopy操作のソースバケット内のオブジェクトを暗号化するために使用された無効なKMSキーがあり、その結果、Importジョブがこの無効なKMSキーを使用してオブジェクトのコピーに失敗していることがわかりました。ジョブを失敗させる措置をとりました。これらのオブジェクトのKMSキーを有効にした後、これらのオブジェクトを正常にコピーするためにImportジョブを再起動することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/8c490d57-3390-d055-e687-f176e6c6cc54.png)

ただ、いくつかのオブジェクトはインポートできていたので、今回はこのまま進めたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/2c06e2bc-2768-818f-cea7-f2c95ad9bcac.png)

# オブジェクトアクセス
## Glue/Athenaの場合
Glue Crawlerを使用してクロールしようとしましたが、コンソールからではS3バケット一覧に表示されず、手動入力してもエラーでクローラーの作成自体が失敗しました。
一応バージニア北部でも確認しましたが、そちらでも同じく一覧に表示されませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/25f4e3c8-5066-08e4-4bac-0f9df818be77.png)

## Mountpoint for Amazon S3の場合
仕方ないので、今年GAされたMountpoint for Amazon S3を使用して、S3をEC2にマウントして確認してみます。
https://aws.amazon.com/jp/blogs/news/mountpoint-for-amazon-s3-generally-available-and-ready-for-production-workloads/

手順は以下の記事を参考にしました。

https://blog.future.ad.jp/mountpoint-for-amazon-s3-%E3%82%92ec2%E3%81%AB%E5%85%A5%E3%82%8C%E3%81%A6%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F-

https://dev.classmethod.jp/articles/how-to-mount-amazon-s3-express-one-zone/

テストデータはCloudTailログを利用します。
昨年分のログに対してEC2上でコマンドを実行して結果が変わるか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/9c962959-bd4a-47fe-0c51-585d993acf5a.png)

EC2上にStandardクラスのS3バケットとExpress One ZoneクラスのS3バケットをマウントしました。

```
[root@ip-10-20-0-7 mnt]# ll
total 0
drwxr-xr-x. 2 root root 0 Dec  1 05:41 mount_express
drwxr-xr-x. 2 root root 0 Dec  1 05:42 mount_standard
```

どちらも同じオブジェクト構成になっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/7c5c5f5e-6772-6d1f-cf3f-521d84b118a5.png)

以下のコマンドで対象フォルダ配下のファイルを検索する時間を計測してみます。

```
$ time find /mnt/mount_standard/AWSLogs/123456789123/CloudTrail-Digest/ap-northeast-1/2022/ -type f | wc -l
$ time find /mnt/mount_express/AWSLogs/123456789123/CloudTrail-Digest/ap-northeast-1/2022/ -type f | wc -l
```

- Standardクラスの場合
2293ファイルの検索で約11秒かかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/62c8a17c-c06c-2d43-8881-d84f6f770738.png)

- Express One Zoneの場合
2293ファイルの検索で約6秒かかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/695ee33b-eb8a-ccd0-4dc6-8cbc8a30278d.png)

使用したEC2の構成は以下の通りです。
・インスタンスタイプ：t3.small
・AMI：ami-0d48337b7d3c86f62(Amazon Linux 2023 AMI 2023.2.20231016.0 x86_64 HVM kernel-6.1)

厳密に条件を準備したわけではないですが、ざっくり半分ぐらいの時間で処理を完了することができました。
※あくまで自環境での結果であり、必ずしも同じ結果になるとは言えないため、参考程度にとどめてください。

## おまけ
ちなみに同じ環境でS3上の対象オブジェクトをEBSにダウンロードしてきてコマンドを試してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/71405882-b54b-18ca-e323-333ac9a90c2d.png)

0.006秒でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/03b0b5c6-ed28-fda7-96ac-b21d989bc427.png)


# おわりに
これまでのストレージクラスと比べるとかなり処理が早くなっていることが実感できました。

やり方が悪かったのかAthenaからのクエリ結果は確認できませんでしたが、同じタイミングで発表されたMountpoint for Amazon S3のExpress One Zoneサポートも一緒に検証出来て良かったです。
https://aws.amazon.com/jp/about-aws/whats-new/2023/11/mountpoint-amazon-s3-express-one-zone-storage-class/

AWS公式ブログが公開されてますので、興味のある方は是非こちらをご覧ください。
https://aws.amazon.com/jp/blogs/aws/new-amazon-s3-express-one-zone-high-performance-storage-class/

企業の利用事例は以下に記事があります。
https://aws.amazon.com/jp/blogs/storage/tag/amazon-s3-express-one-zone/