Amazon S3 Express One ZoneのデータをAmazon Athenaで空間検索してQGISで可視化してみた

![img](https://memo.dayjournal.dev/images/try-106_27.jpg)
![img](https://memo.dayjournal.dev/images/try-106_00.png)

:::note info
この記事は、「[AWS Advent Calendar 2023](https://qiita.com/advent-calendar/2023/aws)」の11日目の記事です。
昨日は[@mirimiripc](https://twitter.com/mirimiripc)さんによる[AWS タグエディタを使って使用中のすべてのリソースを発掘してみる](https://qiita.com/miriwo/items/f3889232425173fb4838)でした。
:::

https://qiita.com/advent-calendar/2023/aws

### Amazon S3 Express One ZoneのデータをAmazon Athenaで空間検索してQGISで可視化してみました :tada:  

以前、S3 Standardで検証した[記事](https://memo.dayjournal.dev/memo/try-089/)を投稿しました。今回はre:Invent 2023で発表された新しい[S3 Express One Zone](https://aws.amazon.com/s3/storage-classes/express-one-zone)で検証しました。S3 Express One Zoneを利用した時のAthenaとの連携・Geospatialな空間検索・検索速度の向上などに焦点を当ててその結果を紹介します！

S3 Express One Zoneは、高パフォーマンスを重視したAmazon S3のストレージオプションです。このオプションは東京リージョンでも利用可能で、S3 Standardストレージクラスと比較して最大10倍の優れたパフォーマンスを提供する設計になっています。また、リクエスト料金はS3 Standardよりも50%削減されています。このサービスを利用するには、「ディレクトリバケット」と呼ばれる特定のバケットタイプを利用します。

## 事前準備

[Amazon Athena](https://aws.amazon.com/athena)で利用するGISデータを準備します。今回は事前に[QGIS](https://qgis.org)で4種類のサンプルデータを作成しました。  

ポイント・ライン・ポリゴンのGISデータをそれぞれCSV(TSV形式)で準備しました。
![img](https://memo.dayjournal.dev/images/try-089_01.png)

追加で100万ポイントのGISデータをCSV(TSV形式)で準備しました。
![img](https://memo.dayjournal.dev/images/try-089_02.png)

今回のサンプルデータをGitHubに登録したのでぜひご利用ください。  

https://github.com/dayjournal/data/tree/main/try-106

## バケット作成 & データ登録 (S3 Express One Zone)

Amazon S3 Express One Zoneでバケット作成とデータ登録します。  

AWSマネジメントコンソール → S3をクリック。
![img](https://memo.dayjournal.dev/images/amazon-s3-008_01.png)

「バケットを作成」をクリック。
![img](https://memo.dayjournal.dev/images/amazon-s3-008_02.png)

リージョン・バケットタイプをディレクトリ・アベイラビリティーゾーン・ベース名を設定。
![img](https://memo.dayjournal.dev/images/amazon-s3-008_03.png)

指定名称のバケットが作成されます。
![img](https://memo.dayjournal.dev/images/amazon-s3-008_04.png)

対象のバケットを選択 → 「アップロード」をクリック。
![img](https://memo.dayjournal.dev/images/try-106_01.png)

登録したいファイルを選択 → 「アップロード」をクリック。
![img](https://memo.dayjournal.dev/images/try-106_02.png)

アップロードされたファイルを確認。
![img](https://memo.dayjournal.dev/images/try-106_03.png)

今回は4種類のCSV(TSV形式)を任意の名称でディレクトリバケットに保存しました。
![img](https://memo.dayjournal.dev/images/try-106_25.png)

<br>

これでS3 Express One Zoneのデータ登録は完了です！

## クエリ保存先を設定

Amazon Athenaでクエリ保存先を設定します。 

事前に任意の名称でクエリ保存先のS3バケットを準備します。
![img](https://memo.dayjournal.dev/images/try-106_26.png)

AWSマネジメントコンソール → Athenaをクリック。
![img](https://memo.dayjournal.dev/images/try-106_04.png)

「クエリエディタを詳しく確認する」をクリック。
![img](https://memo.dayjournal.dev/images/try-106_05.png)

「設定を表示」をクリック。
![img](https://memo.dayjournal.dev/images/try-106_06.png)

「管理」をクリック。
![img](https://memo.dayjournal.dev/images/try-106_07.png)

クエリ保存先のS3バケットを指定 → 「保存」をクリック。
![img](https://memo.dayjournal.dev/images/try-106_08.png)

クエリの保存先が設定される。
![img](https://memo.dayjournal.dev/images/try-106_09.png)

<br>

これでクエリ保存先の設定は完了です！

## テーブル作成

Amazon Athenaでテーブルを作成します。

Athenaのエディタ → テーブルとビュー作成 → 「S3バケットデータ」をクリック。
![img](https://memo.dayjournal.dev/images/try-106_10.png)

テーブル名・データベース選択・対象のS3バケット指定・データ形式・カラム設定。プレビュー確認 → 「テーブルを作成」をクリック。

S3 Express One Zoneのバケットは、現状で一覧に表示されないので直接アドレスを入力する必要があります。アドレスの頭は「s3://」で指定します。
![img](https://memo.dayjournal.dev/images/try-106_11.png)

今回は4つの任意のテーブルを作成しました。対象のテーブル → 「テーブルをプレビュー」をクリック。
![img](https://memo.dayjournal.dev/images/try-106_12.png)

取得したレコードが表示されます。
![img](https://memo.dayjournal.dev/images/try-106_13.png)

<br>

これでテーブルの作成は完了です！S3 Express One Zoneでも問題なくAthenaで読み込めることが確認できました。

## 空間検索

最後に、Amazon AthenaでGeospatialな[空間検索](https://docs.aws.amazon.com/athena/latest/ug/geospatial-functions-list-v2.html)を実行します。

**ポリゴンから重心のポイント**を取得してみます。結果データをダウンロードします。

**S3 Standard**  
キュー内の時間: 0.243秒、実行時間: 0.799秒、データ: 1.5KB

**S3 Express One Zone**  
キュー内の時間: 0.120秒、実行時間: 0.899秒、データ: 1.5KB

```sql
SELECT "geospatial_database"."polygon_table"."name", ST_Centroid(ST_GeometryFromText("geospatial_database"."polygon_table"."wkt")) FROM "geospatial_database"."polygon_table";
```

![img](https://memo.dayjournal.dev/images/try-106_15.png)

ダウンロードしたデータをQGISで可視化すると処理結果データを表示確認できます。
![img](https://memo.dayjournal.dev/images/try-106_20.png)

<br>

**ラインから始点のポイント**を取得してみます。結果データをダウンロードします。

**S3 Standard**  
キュー内の時間: 0.175秒、実行時間: 0.601秒、データ: 1.05KB

**S3 Express One Zone**  
キュー内の時間: 0.119秒、実行時間: 0.948秒、データ: 1.05KB

```sql
SELECT "geospatial_database"."line_table"."name", ST_StartPoint(ST_GeometryFromText("geospatial_database"."line_table"."wkt")) FROM "geospatial_database"."line_table";
```

![img](https://memo.dayjournal.dev/images/try-106_14.png)

ダウンロードしたデータをQGISで可視化すると処理結果データを表示確認できます。
![img](https://memo.dayjournal.dev/images/try-106_21.png)

<br>

**ポリゴン内に含まれるポイントのみ**を取得してみます。結果データをダウンロードします。

**S3 Standard**  
キュー内の時間: 0.313秒、実行時間: 1.230秒、データ: 2.01KB

**S3 Express One Zone**  
キュー内の時間: 0.073秒、実行時間: 0.993秒、データ: 2.01KB

```sql
SELECT "geospatial_database"."point_table"."name", "geospatial_database"."point_table"."wkt" FROM "geospatial_database"."point_table", "geospatial_database"."polygon_table" WHERE ST_Within(ST_GeometryFromText("geospatial_database"."point_table"."wkt"), ST_GeometryFromText("geospatial_database"."polygon_table"."wkt"));
```

![img](https://memo.dayjournal.dev/images/try-106_16.png)

ダウンロードしたデータをQGISで可視化すると処理結果データを表示確認できます。
![img](https://memo.dayjournal.dev/images/try-106_22.png)

<br>

**100万件のポリゴン内に含まれるポイントのみ**を取得してみます。大量GISデータの検索でも高速にレスポンスされました。結果データをダウンロードします。

**S3 Standard**  
キュー内の時間: 0.220秒、実行時間: 2.832秒、データ: 46.41MB

**S3 Express One Zone**  
キュー内の時間: 0.117秒、実行時間: 2.843秒、データ: 46.41MB

```sql
SELECT "geospatial_database"."randompoint_table"."name", "geospatial_database"."randompoint_table"."wkt" FROM "geospatial_database"."randompoint_table", "geospatial_database"."polygon_table" WHERE ST_Within(ST_GeometryFromText("geospatial_database"."randompoint_table"."wkt"), ST_GeometryFromText("geospatial_database"."polygon_table"."wkt"));
```

![img](https://memo.dayjournal.dev/images/try-106_17.png)

ダウンロードしたデータをQGISで可視化すると処理結果データを表示確認できます。
![img](https://memo.dayjournal.dev/images/try-106_23.png)
![img](https://memo.dayjournal.dev/images/try-106_24.png)

<br>

Amazon Athenaを利用することでS3に登録したデータを空間検索することが可能になります！

<br>

今回の検証で、S3 Express One Zoneを利用した場合でも、Athenaとの連携やGeospatialな空間検索が実現可能であることが確認できました。

空間検索については、一部の検索で120%以上のパフォーマンス向上がありましたが、全体としては大きな速度向上は確認できませんでした。これは、S3 Express One Zoneが小さいサイズの多数のファイル処理に特化しているため、今回の検証で利用した大規模な空間検索データには適していない可能性があります。

ただ、ストレージコストの削減という点ではS3 Express One Zoneを利用することに大きな利点があると思いました！

<br>
<br>

Amazon AthenaとAmazon S3とQGISについて、他にも記事を書いています。よろしければぜひ :bow:
<a href="https://day-journal.com/memo/tags/QGIS" target="_blank">tags - QGIS</a>
<a href="https://day-journal.com/memo/tags/Amazon-S3/" target="_blank">tags - Amazon S3</a>
<a href="https://day-journal.com/memo/tags/Amazon-Athena" target="_blank">tags - Amazon Athena</a>

やってみたシリーズ :grinning:
<a href="https://day-journal.com/memo/tags/Try" target="_blank">tags - Try</a>

https://qiita.com/dayjournal/items/441f89794f6fb5656846

https://qiita.com/dayjournal/items/fa3aac5a24e9605f2958

https://qiita.com/dayjournal/items/e7eeeb8f527bbbbe42cf

<br>
<br>

<a href="https://dayjournal.booth.pm" target="_blank"><img src="https://day-journal.com/memo/images/etc/book.png" alt="book"></a>