🪣

SnowflakeとAWS S3 Express One Zoneの相性が気になった

2024/01/11に公開

Express One ZoneとSnowflakeの相性が気になった

昨年12月にAWS Express One Zoneが発表された。
新しい Amazon S3 Express One Zone ストレージクラスは、S3 標準ストレージクラスの最大 10 倍のパフォーマンスを実現しながら、一貫した 1 桁ミリ秒のレイテンシーで毎秒数十万のリクエストを処理できるように設計されています。

本当ならSnowflakeの外部ステージに使えば爆速外部テーブルができるのでは。

[1/13追記] 使えそう

テストケースが通らなくても一部機能は使えるようだ。
以下の記事で検証した。

https://zenn.dev/efx/articles/22935f86f414cc

[1/12]現時点ではSnowflakeの外部ステージでは使えなさそう

テストケースが通らない。

[ERROR] Errors: 
[ERROR]   S3CompatApiTest.copyObject:360->uploadAnObjectToTestingLocation:424 » SdkClient
[ERROR]   S3CompatApiTest.deleteObject:329->uploadAnObjectToTestingLocation:424 » SdkClient
[ERROR]   S3CompatApiTest.deleteObjects:341->uploadAnObjectToTestingLocation:424 » SdkClient
[ERROR]   S3CompatApiTest.generatePresignedUrl:374->uploadAnObjectToTestingLocation:424 » SdkClient
[ERROR]   S3CompatApiTest.getBucketLocation:87 » AmazonS3 The request was missing object...
[ERROR]   S3CompatApiTest.getObject:199->uploadAnObjectToTestingLocation:424 » SdkClient
[ERROR]   S3CompatApiTest.getObjectMetadata:229->uploadAnObjectToTestingLocation:424 » SdkClient
[ERROR]   S3CompatApiTest.listObjectsV2:262->uploadAnObjectToTestingLocation:424 » SdkClient
[ERROR]   S3CompatApiTest.putObject:133 » SdkClient Unable to verify integrity of data u...

試したこと

以下は試したことの記録。

[失敗]エンドポイントを有効化するようSnowflake サポートに連絡

ちゃっかり使えるようになってないかなと思い、SnowflakeサポートにS3 Express One ZoneのZonal Endpoint(s3express-apne1-az4.ap-northeast-1.amazonaws.com)をS3エンドポイントとして有効化してほしいとケースを上げたところ、テストが通ることを確認してほしいとのこと。

R2のS3 Compat APIの申請では検証してほしいと言われないこともあった。
ドキュメントを見るとR2は公式で検証済みなので、各自で検証せずともケースを上げるだけで申請が通ることもあるぽい。

言われた通りちゃんとテストすることにした。

テストケース実行の準備

公式テストケースで互換性を検証する。

手順

  • 公式テストケースレポジトリをクローンする。
  • mvnをインストールする。(brew install mvn)

注意点

  • Githubがホストするmvnパッケージに依存しているため、~/.m2/settings.xmlに自分のGithub トークンを入力する必要がある。

  • ~/.m2/settings.xmlは以下のような形式にする。

<settings>
<servers>
    <server>
        <id>github</id>
        <username>your github username</username>
        <password>your github access token</password>
    </server>
</servers>
</settings>

テストケースの実行

以下のようなコマンドでテストケースを実行した。

snowflake-s3compat-api-test-suite % mvn test -Dtest=S3CompatApiTest \
        -DREGION_1=ap-northeast-1 \
        -DREGION_2=ap-northeast-1 \
        -DBUCKET_NAME_1=xxxxxx--apne1-az4--x-s3 \
        -DS3COMPAT_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxx \
        -DS3COMPAT_SECRET_KEY=xxxxxxxxxxxxxxxxxxxxxxxxx \
        -DEND_POINT=s3express-apne1-az4.ap-northeast-1.amazonaws.com \
        -DNOT_ACCESSIBLE_BUCKET=xxxxxxx \
        -DPREFIX_FOR_PAGE_LISTING=xxxxx--apne1-az4--x-s3 \
        -DPAGE_LISTING_TOTAL_SIZE=xxxxx

結果

結果は冒頭の通り失敗した。

大きく2つの原因がある。

  • MD5ハッシュの未サポート
  • getBucketLocationオペレーションの未実装

MD5ハッシュの未サポート

Express One ZoneはMD5ハッシュをサポートしていない。
MD5でアップロードしたデータの整合性を検証できないので、Put Objectが失敗する原因となっている。

listObjectsV2のテストなども、アップロードしたファイルをダウンロードする実装になっているようなので、Put Objectが失敗すると同様に失敗する。

[ERROR] generatePresignedUrl  Time elapsed: 0.711 s  <<< ERROR!
com.amazonaws.SdkClientException: 
Unable to verify integrity of data upload. 
Client calculated content hash (contentMD5: xxxxxxxxxxxxxxx in base 64) didn't match hash (etag: xxxxxxxxxxx in hex) 
calculated by Amazon S3. 
You may need to delete the data stored in Amazon S3. 
(metadata.contentMD5: null, md5DigestStream: com.amazonaws.services.s3.internal.MD5DigestCalculatingInputStream@48840594, 
bucketName: xxxxx--apne1-az4--x-s3, 
key: test-suite/ops/GENERATE_PRESIGNED_URL_TEST/src/main/resources/test1.txt)

ただし、アップロード自体は正常にできているようなので、SHA-256など他のアルゴリズムで検証するように変更されればテストケースは通ると思われる。

getBucketLocationオペレーションの未実装

Express One ZoneはgetBucketLocationオペレーションを実装していない。
悲しい。

[ERROR] getBucketLocation  
Time elapsed: 0.108 s  <<< ERROR!
com.amazonaws.services.s3.model.AmazonS3Exception: 
The request was missing object key. 
(Service: Amazon S3; Status Code: 501; Error Code: NotSupported; Request ID: xxxxxxxxxx; S3 Extended Request ID: hostname.example.org; Proxy: null)

まとめ

Express One ZoneがMD5による検証をサポートしていないため現時点では使えなさそう。
検証の部分に変更が入れば使えるようになりそう。

Snowflake Data Heroes

Discussion