SPIDERPLUS Tech Blog

建設SaaS「スパイダープラス」のエンジニアとデザイナーのブログ

S3Tablesが東京リージョンで利用可能になったので使ってみた

こんにちは。
2024年12月 に入社し、システム運用チームの一員となったhirakiです。

弊社システム運用チーム(世間で言うインフラ部門)は、隣にお客様満足度を担保するCRE(Customer Reliability Engineer)と同じ システム運用部 に所属する形となっていて、
お客様の課題をよく目にする状態でもあります。

本記事では昨年のAWS re:Inventで発表されたAmazon S3 Tablesが東京リージョンで利用可能になり、発表時の記事よりシステムのログ、マーケティング用のデータ分析等で利用できそうに見えました。実際にどのように設定をして行けばよいかが気になりましたので、そちらの内容を記事に書きます。

aws.amazon.com

概要

S3Tablesとは?

  • Amazon S3に組み込まれた機能で、Apache Iceberg形式のテーブル形式をサポート
  • S3上に表形式上のデータを保存でき、そちらをAthenaなどと組み合わせて利用できる

準備

  • スキーマ定義を実施する際に最新のAWS CLIバージョンを利用する必要がありました
$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
$ sudo installer -pkg AWSCLIV2.pkg -target /
$ aws --version
  aws-cli/2.25.6 Python/3.12.9 Darwin/23.6.0 exe/x86_64
  • AWSコンソールからAWS 分析サービスとの統合を有効化しておく
    ※有効化する事で後ほど利用するAthena等を利用してクエリ実行できるようになる
  • 主にAWS CLIを利用して設定していきますが、credentials等の設定内容については割愛します。またAWS CLIのcredentials設定を行う際は適切に行ってください。

設定

※S3テーブルバケット等はAWSコンソールからでも設定可能でしたが、AWS CLIから設定する方が効率的だった為、そちらの設定手順を記載します

1.S3テーブルバケットの作成

$ aws s3tables create-table-bucket --name test-s3-table

※ 下記のような結果が返ってきます
{
"arn": "arn:aws:s3tables:ap-northeast-1:(AWSアカウントID):bucket/test-s3-table"
}

2.名前空間を作成
※ここではtest_s3_namespaceという名前空間を作成

$ aws s3tables create-namespace \
>  --table-bucket-arn "arn:aws:s3tables:ap-northeast-1:(AWSアカウントID):bucket/test-s3-table" \
>  --namespace test_s3_namespace

※下記のような結果が返ってきます
{
"tableBucketARN":
"arn:aws:s3tables:ap-northeast-1:(AWSアカウントID):bucket/test-s3-table",
"namespace": [
"test_s3_namespace"
]
}

3.テーブル作成

  • a.作成前に下記例のようなテーブル定義部分を含むjsonファイルを用意する
    • ファイル名: mytabledefinition.jsonとする
    • テーブル名にはハイフン(-)は使用できません。これはAWS命名規則によるものです。
{
    "tableBucketARN": "arn:aws:s3tables:ap-northeast-1:(AWSアカウントID):bucket/test-s3-table",
    "namespace": "test_s3_namespace",
    "name": "test_s3_table",
    "format": "ICEBERG",
    "metadata": {
        "iceberg": {
            "schema": {
                "fields": [
                     {"name": "id", "type": "int","required": true},
                     {"name": "name", "type": "string"},
                     {"name": "value", "type": "int"}
                ]
            }
        }
    }
}
  • b.テーブル作成
$ aws s3tables create-table --cli-input-json file://mytabledefinition.json

{
    "tableARN": "arn:aws:s3tables:ap-northeast-1:(AWSアカウントID):bucket/test-s3-table/table/bc92619a-96cd-4fba-847f-24a377832226",
    "versionToken": "(現在のテーブルバージョンを識別するtoken情報)"
}

設定後の確認

  1. AWSコンソール上にて下記のように作成したs3テーブルバケットができている事を確認

    AWSコンソール画面より
  2. Athenaからクエリ実行する
    1. (Athenaを使われた事がある方はご存知だとは思いますが)クエリ実行前にクエリ結果を保存する為のS3バケットを指定しておく必要あり

      AWSコンソール画面より


    2. Athenaでテーブルクエリの実行ボタンを押下する

      AWSコンソール画面より


    3. 対象のカタログ、データベース、テーブルが表示されている事を確認し、任意のデータをINSERT文でデータ投入する

      AWSコンソール画面より


    4. SELECT文で内容を確認する

      AWSコンソール画面より


リソースの削除

作成したリソースはAWSコンソールからでは削除できなかったので下記流れでAWS CLIを利用して削除していく

テーブルの削除>名前空間の削除>テーブルバケットの削除

AWS CLIのコマンドで記載すると下記のような感じ

【テーブルの削除】
 aws s3tables delete-table \
 --table-bucket-arn arn:aws:s3tables:ap-northeast-1:(AWSアカウントID):bucket/test-s3-table \
 --namespace test_s3_namespace \
 --name test_s3_table

【名前空間の削除】
 aws s3tables delete-namespace \
 --table-bucket-arn arn:aws:s3tables:ap-northeast-1:(AWSアカウントID):bucket/test-s3-table \
 --namespace test_s3_namespace

 【テーブルバケットの削除】
 aws s3tables delete-table-bucket \
 --table-bucket-arn arn:aws:s3tables:ap-northeast-1:(AWSアカウントID):bucket/test-s3-table

また、下記リソースについてはS3Tables利用時に自動的に作成される為、削除する必要があります。

  • AWS Lake Formation > Catalogs > (AWSアカウントID):s3tablescatalog
  • IAM > ロール > S3TablesRoleForLakeFormation

所感

  • はじめAWS CLIのバージョンが古くてテーブル定義のオプションが利用できなかったり、テーブル名の指定で(-)ハイフンが利用できなかったりと設定していく上でいくつかの制約により、設定に手間取る部分もありましたが、比較的簡単に設定自体はできました。
  • 今のところ実業務での具体的な利用シナリオは思いついていませんが、S3バケットにデータを保存できるため、データレイクの構築自体はこれだけでも成立するのではないかと思いました。
  • また、さまざまなログ等の解析、ビジネス側の方もクエリを書くことで、新たにBIツールを作成する必要ないかもって思いました。

※以下記事を参考にいたしました。ありがとうございました。

docs.aws.amazon.com

dev.classmethod.jp

さいごに

スパイダープラスでは、一緒に働く仲間を募集しています。
当社にご興味をお持ちの方は、ぜひお気軽にご連絡ください。
最後までお読みいただき、ありがとうございました。