定期的にTimestreamにUNLOADクエリを実行してCSV出力してみた

2024.05.23

はじめに

Timestreamのデータを簡単にS3に出力できる機能としてUNLOADというクエリがあります。
今回はこちらのクエリを使って定期的にS3にcsvファイル形式でデータを出力してみたいと思います。


構成図

まず全体の構成図はこのようになります。

全体の流れは.

  1. EventBridge Schedulerで定期的にSystems ManagerのAutomationを呼び出す
  2. AutomationでTimestreamのUNLOADクエリを実行
  3. Timestreamから出力されたcsvがS3に保存される

という感じです。
それでは今回はコンソール画面で設定していきましょう。

やってみた

Timestreamには既にデータが登録されている前提です。
また、データ出力先のS3バケットも先に作成しておきましょう。

Systems Manager

ロール

まずはSystems Managerで使用するロールを作成します。
今回はtimestreamにUNLOADを実行して、S3にデータを保存するので以下のポリシーを設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "timestream:DescribeEndpoints",
                "timestream:Unload",
                "timestream:Select",
                "s3:GetBucketAcl",
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:ListBucket"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

ロールの信頼関係はドキュメントを参考に以下のように設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ssm.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "<account-id>"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:ssm:*:<account-id>:automation-execution/*"
                }
            }
        }
    ]
}

オートメーション

Systems Manager > オートメーション > Create runbookの順に進みます。

まずは作成したIAMロールを割り当てます。

次にステップを追加します。
AWS APIの一覧でTimestreamのQuery APIを選択します。
次に、インプットタブのQueryStringにUNLOADクエリの内容を記述します。

今回は直近1時間のデータをS3バケットに出力するクエリを記載します。

UNLOAD(SELECT time, temperature, speed, pressure, location, deviceid FROM "demo-database"."demo-table" WHERE time between ago(1h) and now() ORDER BY time) TO 's3://' WITH ( partitioned_by=ARRAY['deviceid'])

UNLOADクエリに関するオプションは以下のドキュメントを参考にして下さい。


次に、作成したrunbookを実行してみます。
ここではオートメーションが想定通りに実行されることを確認します。

runbook作成後に表示される確認画面ですべてデフォルトのまま「Execute」をクリックするとAutomationが実行されます。
しばらくするとステータスがSuccessになります。

それではS3にデータが保存されているか確認します。

S3にcsvファイルが保存されていますね。
これでオートメーションが正常に動作していることは確認できました。

EventBridge

ロール

EventBridgeで使用するロールを作成します。
ポリシーはAutomationを実行するためのサービスロール AmazonSSMAutomationRole をアタッチします。

ロールの信頼関係はServiceにscheduler.amazonaws.comを指定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

スケジュール

EventBridgeのスケジュール > スケジュールを作成の順に進みます。

今回は1時間に1回実行なので、rateベースで1hoursとします。

次にターゲットを選択します。  
SystemsManager > StartAutomationExecutionの順に選択します。

入力値には以下を入力します。

{
  "DocumentName": "<オートメーションで作成したrunbookの名前>",
  "DocumentVersion": "$DEFAULT"
}

あとは作成したIAMロールをアタッチしてスケジュールの作成は完了です。

動作確認

最後にEventBridgeで設定した時間毎にオートメーションが実行され、S3バケットにcsvファイルが保存されていることを確認しましょう。

まとめ

今回はTimestreamのデータを簡単にcsvファイルとして定期的に出力する方法を紹介しました。
この記事が誰かの助けになれば幸いです。