SnowflakeとAWS S3 Express One Zoneの相性が気になった
Express One ZoneとSnowflakeの相性が気になった
昨年12月にAWS Express One Zoneが発表された。
新しい Amazon S3 Express One Zone ストレージクラスは、S3 標準ストレージクラスの最大 10 倍のパフォーマンスを実現しながら、一貫した 1 桁ミリ秒のレイテンシーで毎秒数十万のリクエストを処理できるように設計されています。
本当ならSnowflakeの外部ステージに使えば爆速外部テーブルができるのでは。
[1/13追記] 使えそう
テストケースが通らなくても一部機能は使えるようだ。
以下の記事で検証した。
[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による検証をサポートしていないため現時点では使えなさそう。
検証の部分に変更が入れば使えるようになりそう。
Snowlfake データクラウドのユーザ会 SnowVillage のメンバーで運営しています。 Publication参加方法はこちらをご参照ください。 zenn.dev/dataheroes/articles/db5da0959b4bdd
Discussion