[アップデート] Amazon TimestreamからS3へのエクスポートがサポートされました

2023.05.17

大阪オフィスの小倉です。

Amazon TimestreamからAmazon S3へのエクスポートがサポートされました。

概要

S3へのエクスポートには、UNLOADステートメントを使用します。TO で出力先のS3バケットを指定します。

S3バケットは、Timestreamと同一のAWSアカウント、リージョンである必要があります。

UNLOAD (SELECT statement)
 TO 's3://bucket-name/folder'
 WITH ( option = expression [, ...] )

WITHで以下のオプションを指定できるようです。

{ partitioned_by = ARRAY[ col_name[,…] ]     # デフォルト:なし
 | format = [ '{ CSV | PARQUET }' ]          # デフォルト:CSV
 | compression = [ '{ GZIP | NONE }' ]       # デフォルト:GZIP
 | encryption = [ '{ SSE_KMS | SSE_S3 }' ]   # デフォルト:SSE_S3
 | kms_key = '<string>'
 | field_delimiter ='<character>'            # デフォルト:(,)
 | escaped_by = '<character>'                # デフォルト:(\)
 | }

詳細については以下を確認してください。

動作確認

コンソールからエクスポートの動作を確認してみます。

エクスポート元のデータは、Timestreamのコンソールから作成できるサンプルデータベースを利用しました。

今回はマルチメジャーレコードのIoTデータを使用します。

まずは単純なクエリでのエクスポートを試してみます。

S3バケットとquery01 フォルダを事前に作成しておきます。

UNLOAD(
    SELECT * FROM "cm-ogura-sample-db"."IoTMulti" WHERE time between ago(1h) and now() ORDER BY time DESC LIMIT 100
) TO 's3://cm-ogura-timestream-unload/query01'

S3を確認してみると、query01フォルダ配下に以下が作成されました。

results配下にはgzip圧縮されたデータが出力されていました。

出力されたデータを見ると、CSV形式で出力されています。

Alpha,21135517,100,359,1000,Peterbilt,IoTMulti-stats,2023-05-16 20:32:18.560000000,20.0,22.15921527271879,"34.7465° N, 92.2896° W",64.0
Alpha,433496933,100,Wrecker,500,Peterbilt,IoTMulti-stats,2023-05-16 20:31:08.469000000,115.0,66.48206913078647,"36.1627° N, 86.7816° W",50.0
Alpha,683993576,100,359,1000,Peterbilt,IoTMulti-stats,2023-05-16 20:30:37.970000000,278.0,60.23148110604007,"33.7490° N, 84.3880° W",18.0
Alpha,1575739296,100,359,1000,Peterbilt,IoTMulti-stats,2023-05-16 20:30:14.766000000,449.0,60.57110447043918,"46.5891° N, 112.0391° W",56.0
Alpha,1234546252,150,W925,1000,Kenworth,IoTMulti-stats,2023-05-16 20:28:05.519000000,77.0,89.48180813940486,"44.9537° N, 93.0900° W",47.0
Alpha,2759574409,100,359,1000,Peterbilt,IoTMulti-stats,2023-05-16 20:26:47.095000000,551.0,87.05368095062727,"38.5816° N, 121.4944° W",14.0
Alpha,5670048029,150,C-600,1000,Ford,IoTMulti-stats,2023-05-16 20:26:33.287000000,370.0,0.4367898574554866,"34.7465° N, 92.2896° W",70.0
(以下略)

次に、partitioned_byを使って、パーティションを作成しつつエクスポートしてみます。

UNLOAD(
    SELECT 
      fleet, truck_id, fuel_capacity, load_capacity, measure_name, time, load, "fuel-reading", location, speed, make, model
    FROM "cm-ogura-sample-db"."IoTMulti" WHERE time between ago(1h) and now() ORDER BY time DESC LIMIT 100
) TO 's3://cm-ogura-timestream-unload/query02'
WITH ( partitioned_by=ARRAY['make','model'])

partitioned_by には複数の列を指定できます。

このときpartitioned_byに指定した列は、partitioned_byで指定した順序で、SELECT句の末尾に指定する必要があるので注意してください。

今回はSELECT *だと上記条件を満たせないので、SELECT句に列名を直接指定しました。

S3のresults配下を確認すると、make=XXXXの階層が作成されています。

make=Peterbiltの配下には、model=XXXXの階層が作成されていることが確認できます。

出力されたCSVファイルは、partitioned_byに指定した列の値を除いたデータとなっています

Alpha,433496933,100,500,IoTMulti-stats,2023-05-16 20:31:08.469000000,115.0,66.48206913078647,"36.1627° N, 86.7816° W",50.0
Alpha,433496933,100,500,IoTMulti-stats,2023-05-16 20:24:40.560000000,392.0,82.98060906828232,"36.1627° N, 86.7816° W",6.0
Alpha,1836816173,100,500,IoTMulti-stats,2023-05-16 20:20:57.832000000,381.0,31.006693572246814,"33.7490° N, 84.3880° W",30.0
Alpha,7219245711,100,500,IoTMulti-stats,2023-05-16 20:19:59.456000000,349.0,19.78241022554396,"40.2338° N, 111.6585° W",48.0
(以下略)

まとめ

TimestreamからS3へのエクスポートを試してみました。

S3にエクスポートが可能になったことで、Timestreamに蓄積した時系列データを他のサービスで活用できるシーンが大幅に増えそうだと思いました。

また、私は見落としていたのですが、Timesteramは2023年3月にS3からのバッチロードに対応しているようなので、そちらとの組み合わせも今後検証しようと思います。