Tableau Server のバックアップ取得をスケジュール実行する
はじめに
バージョン 2023.3.1 以降の Tableau Server は OS 要件として Amazon Linux 2023 をサポートしています。
Amazon Linux 2023 にインストールした Tableau Server でバックアップの取得をスケジュール実行してみましたので、本記事で内容をまとめてみます。
前提条件
以下の環境で Tableau Server をインストール済みです。
- Tableau Server バージョン 2024.2.4
- 単一サーバー構成
- インスタンスタイプ:m5.4xlarge
- vCPU:16
- メモリ:64 GB
- ボリューム
- ルートボリューム:8 GB
- 追加ボリューム:30 GB
- マウント先:
/opt/tableau
- マウント先:
- Tableau Server のインストールディレクトリ
- 既定:
opt/tableau/tableau_server
- 既定:
- データディレクトリ(バックアップなどの出力先ディレクトリ)
opt/tableau/data/
- ※既定(
/var/opt/tableau/tableau_server
)から変更
- Tableau Server で取得したバックアップを配置する S3 バケットを作成し関連する IAM Role をTableau Server に関連付け済み
- バックアップファイルの取得先 ※既定から変更
- Tableau Server で管理されるデータ:
/opt/tableau/tableau_backups/backups
- 構成およびトポロジーに関するデータ:
/opt/tableau/tableau_backups/setting_exports
- Tableau Server で管理されるデータ:
こちらの構成でのインストール手順と基本的なバックアップ取得の方法~S3への配置までの手順は以下をご参照ください。
バックアップのデータ型
前提として Tableau Server で取得可能なバックアップは以下の2種類存在します。ここではそれぞれを取得対象とします。
- Tableau Server で管理されるデータ
tsm maintenance backup
コマンドで取得する- コマンドのオプションでスケジュール実行による取得も可能
- 構成およびトポロジデータ
tsm settings export
コマンドで取得する- スケジュール実行のオプションはない
各バックアップの詳細は以下をご参照ください。
Tableau Server で管理されるデータ
スケジュール実行に関するオプション
tsm maintenance backup
コマンドで取得できる Tableau Server で管理されるデータのバックアップ取得はスケジュール実行に関するオプションを提供しています。
スケジュール実行に関するオプションは以下です。
オプション | 概要 |
---|---|
-sn, --schedule-name <name> | 作成または更新するスケジュールの名前 |
-sr,--schedule-recurrence <frequency> | スケジュールの繰り返し頻度。有効なオプションは、daily 、weekly 、または monthly |
-st,--schedule-time HH:MM | スケジュールを実行する必要がある時刻 (24 時間形式: HH:MM) |
-sd,--schedule-days <day[,day]> | ・-sr が weekly または monthly の際に指定 ・スケジュールを実行する日付レベルのタイミング -sr で weekly の場合: 1 ~ 7 (月曜日は 1、日曜日は 7) -sr で monthly の場合: 1 ~ 31 を使用(30日までなど月に指定した日が含まれていない場合は、その月の最終日を使用します)。 複数の値を指定する際はコンマで区切りる |
以下はドキュメント記載の例ですが、この場合、毎週土曜日の正午に実行されるweekly-saturday-backup
という名前の定期的なバックアップ スケジュールが作成されます。
tsm maintenance backup -f ts_saturday_backup -sr weekly -st 12:00 -sd 6 -sn weekly-saturday-backup
他の例として、以下の場合は毎日17時に実行されるdaily-backup
という名前の定期的なバックアップ スケジュールが作成されます。
tsm maintenance backup -f tableau-server-data -sr daily -st 17:00 -sn daily-backup
バックアップをスケジュール
$ tsm maintenance backup -f tableau-server-data -sr daily -st 17:00 -sn daily-backup
スケジュール ID が 1 の daily スケジュールを作成しました。次は 2024/12/06 17:00 に実行されます。
作成したスケジュールは tsm schedules list で確認できます。各バックアップには自動で ID が割り振られます。
$ tsm schedules list
スケジュール ID: 1
名前: daily-backup
タイプ: GenerateBackupJob
状態: アクティブ
次の実行時刻: 2024/12/06 17:00
繰り返しのタイプ: DAILY、17:00
スケジュールの時間になるとバックアップが取得されます。Tableau Server が停止状態であっても実行できます。
この場合、取得されたバックアップファイルは以下のようになります。スケジュール実行の場合、デフォルトでスケジュール実行された日時の情報が接頭辞に付与されます。
$ ls /opt/tableau/tableau_backups/backups
2024.12.06.17.00-tableau-server-data.tsbak
実行後、再度tsm schedules list
でスケジュールを確認すると、次回の実行時刻が更新されています。
$ tsm schedules list
スケジュール ID: 1
名前: daily-backup
タイプ: GenerateBackupJob
状態: アクティブ
次の実行時刻: 2024/12/07 17:00
繰り返しのタイプ: DAILY、17:00
バックアップのスケジュール変更
作成したスケジュールを変更する際はtsm schedules update
を使用します。
一部は、スケジュール設定と同様ですが、オプションは以下の通りです。
オプション | 必須かどうか | 概要 |
---|---|---|
-si,--schedule-id <scheduleID> | 必須 | 更新するスケジュールの ID |
-sr,--schedule-recurrence <frequency> | 必須 | スケジュールの繰り返し頻度。有効なオプションは、daily 、weekly 、または monthly |
-st,--schedule-time HH:MM | 必須 | スケジュールを実行する必要がある時刻 (24 時間形式: HH:MM) |
-sd,--schedule-days <day[,day]> | -sr が weekly または monthly の際に指定 | スケジュールを実行する日付レベルのタイミング -sr で weekly の場合: 1 ~ 7 (月曜日は 1、日曜日は 7) -sr で monthly の場合: 1 ~ 31 を使用(30日までなど月に指定した日が含まれていない場合は、その月の最終日を使用します)。 複数の値を指定する際はコンマで区切ります。 |
以下のように使用します。
tsm schedules update -si <scheduleID> -st <time_to_run> -sr <recurrence_frequency>
例:スケジュールID 1 のスケジュールを、毎日 18:00 に実行されるように変更
tsm schedules update -si 1 -sr daily -st 18:00
コマンド実行後、プロンプトには何も表示されないので、再度以下のコマンドで変更が適用されていることを確認します。
$ tsm schedules list
スケジュール ID: 1
名前: daily-backup
タイプ: GenerateBackupJob
状態: アクティブ
次の実行時刻: 2024/12/06 18:00
繰り返しのタイプ: DAILY、18:00
スケジュールを停止したい場合はtsm schedules suspend
を使用します。オプションでスケジュールの ID か名称を指定します。
tsm schedules suspend -si 1
実行後スケジュールをリストするとステータスが「一時停止」となっています。
$ tsm schedules list
スケジュール ID: 1
名前: daily-backup
タイプ: GenerateBackupJob
状態: 一時停止
繰り返しのタイプ: DAILY、18:00
再開する際はtsm schedules update
を使用できます。
構成およびトポロジデータ
こちらはスケジュール実行のオプションがないので、CRON など何らかの方法が必要です。
スクリプトの定期実行
EventBridge Scheduler と SSM Run Command を使用して定期的にスクリプトを実行する
構成およびトポロジデータは Tableau Server の機能として取得できない点や最終的にバックアップファイルを S3 などに自動的に配置したい場合、何らかの方法でスクリプトをスケジュール実行します。
ここでは Amazon EventBridge Scheduler から AWS Systems Manager Run Command によるスケジュール実行を試してみます。
また、こちらの実装には以下を参考とさせていただきました
前提条件
今回検証する際の条件や実施内容は以下の通りです。
- 前提
- Tableau Server で管理されるデータのバックアップは上述の
tsm maintenance backup
コマンドのスケジュール実行機能で取得する
- Tableau Server で管理されるデータのバックアップは上述の
- スクリプトで実施すること
- 構成およびトポロジデータをエクスポートし S3 に配置
- Tableau Server で管理されるデータのバックアップファイル(
.tsbak
)の有無を確認- ファイルがあれば S3 に配置
- ファイルがない場合はエラー
- 通知
- SSM Run Command ではコマンドの実行状態に関する SNS 通知を受け取ることができるため、こちらを使用します
- 実行ログの出力
- EventBridge Scheduler では SSM Run Command の実行に対して S3 バケットに実行ログを出力できるので合わせて出力してみます
SNS トピックを作成
通知用に SNS トピックを作成します。
ここでは簡単に Eメールを使用します。
サブスクリプションを作成後、エンドポイントに指定したメールアドレス宛に確認のメールが届くので [Confirm subscrtiption] をクリックします。
下図の表示になります。
サブスクリプションの確認後、コンソール側でもステータスが更新されます。
SNS 通知を使用する場合、SSM から SNS を使用できるように IAM ロール、IAM ポリシーを設定します。ここでは以下の通り、設定しました。
IAM ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sns:Publish"
],
"Resource": "arn:aws:sns:us-east-1:<アカウントID>:yasuhara-test-topic"
}
]
}
信頼関係
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": [
"ssm.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
Amazon EventBridge Scheduler:スケジュールグループを作成
EventBridge Scheduler 側でスケジュールグループを作成します。ここでは下図の内容で作成しました。
EventBridge Scheduler の作成
次に EvenBridge Scheduler を作成します。
任意のスケジュール名を指定し、先程作成したスケジュールグループを指定します。
任意のスケジュールパターンを指定します。
「ターゲットの選択」では「System Manager」を指定します。
API は「SendCommand」です。
上記のドキュメントを参考に、まずは動作確認として以下の内容でリクエスト作成してみます。
{
"DocumentName": "AWS-RunShellScript",
"Parameters": {
"commands": [
"DATE=$(date +%Y-%m-%d)",
"TIME=$(date +%H-%M-%S)",
"su - ec2-user -c \"tsm settings export -f /opt/tableau/tableau_backups/setting_exports/output_file-$DATE-$TIME.json\"",
"aws s3 cp /opt/tableau/tableau_backups/setting_exports/ s3://<バケット名>/setting/$DATE/ --recursive",
"aws s3 cp /opt/tableau/tableau_backups/backups/ s3://<バケット名>/maintenance-backup/$DATE/ --recursive"
]
},
"Targets": [
{
"Key": "InstanceIds",
"Values": [
"<コマンドの実行対象となるEC2インスタンスのID>"
]
}
],
"MaxConcurrency": "1",
"MaxErrors": "0",
"TimeoutSeconds": 300,
"NotificationConfig": {
"NotificationArn": "arn:aws:sns:us-east-1:<アカウントID>:yasuhara-test-topic",
"NotificationEvents": [
"Failed",
"Success"
],
"NotificationType": "Command"
},
"ServiceRoleArn": "arn:aws:iam::<アカウントID>:role/yasuhara-sns-test-role",
"OutputS3BucketName": "<バケット名>",
"OutputS3KeyPrefix": "ssm-runcommand/"
}
ポイントは以下です。
- 具体的なコマンド
- 構成およびトポロジデータのエクスポート
- tsm コマンドを実行できる tsmadmin グループのユーザーとして実行
- 構成およびトポロジデータの S3 への配置
- Tableau Server で管理されるデータを S3 に配置
- 構成およびトポロジデータのエクスポート
- ターゲット
- Tableau Server をインストールした EC2 インスタンスの ID を指定
- 通知
NotificationArn
で上記の手順で作成した SNS トピックの Arn を指定
- ServiceRoleArn
- 後述する IAM ロールの Arn を指定
- OutputS3BucketName
- ログの出力先となる S3 を指定
- ここではバックアップファイルの配置先と同一の S3バケットを指定
- バックアップファイル配置用に Put 権限を持つポリシーが紐づく IAM ロールは付与済み
- ログの出力先となる S3 を指定
ServiceRole(Scheduler 実行ロール)
EvenBridge Scheduler の実行ロールは、以下を使用しました。
IAM ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ssm:SendCommand",
"Resource": [
"arn:aws:ssm:*:*:document/AWS-RunShellScript",
"arn:aws:ec2:us-east-1:<アカウントID>:instance/<EC2インスタンスのID>"
]
},
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::<アカウントID>:role/yasuhara-sns-test-role"
}
]
}
信頼関係
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
実行結果を確認
はじめに1分間隔でスケジュールしたのですが、この場合以下のように実行を確認できました。
バケットを確認してみると、毎分ファイルの更新を確認できました。
- Tableau Server で管理されるデータ
- 構成およびトポロジデータ
- こちらは実行ごとに出力する設定
- ※特定のディレクトリ配下のファイルを送付する設定なので、別に検証用途で出力した内容も含まれています
シェルスクリプトファイルを作成
今回の設定であれば、tsm の機能でメインのバックアップファイルをスケジュール取得するようにしているため、スクリプトの実行タイミングで、このバックアップファイルが出力されていることを想定しています。
何らかのエラー等でバックアップファイルが出力されていない場合は、この点を確認できると嬉しいので、条件分岐などを入れたシェルスクリプトファイルを作成し、EC2 インスタンス上に配置し、実行させてみます。
シェルスクリプトファイルを作成
はじめに、スクリプトファイルの配置先ディレクトリを以下に作成しました。
sudo mkdir /opt/tableau/backup_scripts
今回の検証環境の場合、以下のディレクトリ構成となります。
$ tree /opt/tableau -d -L 2
/opt/tableau
├── backup_scripts
├── data
│ ├── config
│ ├── data
│ ├── logs
│ └── temp
├── tableau_backups
│ ├── backups
│ └── setting_exports
├── tableau_driver
│ └── jdbc
└── tableau_server
├── manifests
└── packages
スクリプトファイルを作成します。
sudo touch /opt/tableau/backup_scripts/tableau_backup.sh
$ sudo ls /opt/tableau/backup_scripts
tableau_backup.sh
ファイルを編集します。
sudo vi /opt/tableau/backup_scripts/tableau_backup.sh
ここでは以下の内容を追記し保存しました。
#!/bin/bash
set -xu
# 現在の日付と時刻を取得
DATE=$(date +%Y-%m-%d)
TIME=$(date +%H-%M-%S)
# 変数を定義
backup_dir="/opt/tableau/tableau_backups/backups/" # バックアップファイル保存ディレクトリ
settings_export_dir="/opt/tableau/tableau_backups/setting_exports/" # 設定エクスポート保存ディレクトリ
s3_bucket="<バケット名>" # S3 バケット名
s3_backup_path="maintenance-backup/${DATE}/" # S3 バックアップ保存先パス
s3_settings_path="setting/${DATE}/" # S3 設定保存先パス
file_extension="*.tsbak" # 対象とするバックアップファイルの拡張子
settings_file="output_file-${DATE}-${TIME}.json" # 設定エクスポートファイル名
current_time() {
date '+%Y-%m-%d %H:%M:%S'
}
# 構成およびトポロジデータをエクスポート
echo "$(current_time) Exporting Tableau settings..."
su - ec2-user -c "tsm settings export -f ${settings_export_dir}${settings_file}"
if [ $? -ne 0 ]; then
echo "$(current_time) Error: Failed to export Tableau settings." >&2
exit 1
fi
echo "$(current_time) Successfully exported Tableau settings to ${settings_export_dir}${settings_file}"
# 構成およびトポロジデータをS3に配置
echo "$(current_time) Uploading Tableau settings export to S3..."
aws s3 cp "$settings_export_dir" "s3://$s3_bucket/$s3_settings_path" --recursive
if [ $? -ne 0 ]; then
echo "$(current_time) Error: Failed to upload Tableau settings to S3." >&2
exit 1
fi
echo "$(current_time) Successfully uploaded Tableau settings to s3://$s3_bucket/$s3_settings_path"
# Tableau Serverで管理されるデータ(.tsbak)が存在するか確認
echo "$(current_time) Checking for $file_extension files in $backup_dir..."
found_files=$(find "$backup_dir" -type f -name "$file_extension")
if [ -z "$found_files" ]; then
echo "$(current_time) Error: No $file_extension files found in $backup_dir. Exiting." >&2
exit 1
fi
# 見つかったファイルをログに出力する
echo "$(current_time) Found the following $file_extension files:"
echo "$found_files"
# Tableau Serverで管理されるデータ(.tsbak)をS3に配置
echo "$(current_time) Uploading all $file_extension files in $backup_dir to S3..."
aws s3 cp "$backup_dir" "s3://$s3_bucket/$s3_backup_path" --recursive --exclude "*" --include "$file_extension"
if [ $? -ne 0 ]; then
echo "$(current_time) Error: Failed to upload $file_extension files to S3." >&2
exit 1
fi
echo "$(current_time) Successfully uploaded $file_extension files to s3://$s3_bucket/$s3_backup_path"
ファイルの実行権限を付与します。
sudo chmod +x /opt/tableau/backup_scripts/tableau_backup.sh
EventBridge Scheduler を作成
スクリプトファイルを実行する新しい EventBridge Scheduler を作成します。リクエストパラメータは以下の通りとしました。
{
"DocumentName": "AWS-RunShellScript",
"Parameters": {
"commands": [
"sudo /opt/tableau/backup_scripts/tableau_backup.sh"
]
},
"Targets": [
{
"Key": "InstanceIds",
"Values": [
"<コマンドの実行対象となるEC2インスタンスのID>"
]
}
],
"MaxConcurrency": "1",
"MaxErrors": "0",
"TimeoutSeconds": 300,
"NotificationConfig": {
"NotificationArn": "arn:aws:sns:us-east-1:<アカウントID>:yasuhara-test-topic",
"NotificationEvents": [
"Failed",
"Success"
],
"NotificationType": "Command"
},
"ServiceRoleArn": "arn:aws:iam::<アカウントID>:role/yasuhara-sns-test-role",
"OutputS3BucketName": "<バケット名>",
"OutputS3KeyPrefix": "ssm-runcommand/"
}
実行結果を確認
ここでは5分間隔で実行されるようにスケジュールし結果を確認しました。
- Tableau Serverで管理されるデータ
- 上記と別日に検証したのですが、実行した日のパスで指定のディレクトリ内のバックアップファイルが配置されていました
- 構成およびトポロジーデータ
- こちらも同様で指定の S3 パスで EC2 側の指定のディレクトリ配下のファイルが配置されていました
Tableau Server で管理されるデータ(.tsbak)が存在しない場合、エラーとなるはずなので、tsbak ファイルを削除してスケジュール実行されるのを待ちます。
EC2 側で既存のバックアップファイルを削除
$ sudo rm /opt/tableau/tableau_backups/backups/*
$ sudo rm /opt/tableau/tableau_backups/setting_exports/*
$ ls /opt/tableau/tableau_backups/*
/opt/tableau/tableau_backups/backups:
/opt/tableau/tableau_backups/setting_exports:
スケジュール実行後、コマンド実行履歴としては意図した通りエラーとなっていました。
処理の順番として、先に構成およびトポロジデータをエクスポート、S3 に配置するようにしているため、最新の構成データはエクスポートされ S3 にも配置されていました。
$ ls /opt/tableau/tableau_backups/*
/opt/tableau/tableau_backups/backups:
/opt/tableau/tableau_backups/setting_exports:
output_file-2024-12-07-15-30-45.json
Tableau Server で管理されるデータについて S3 側に既存のものはありますが、当然内容は更新されていませんでした。
SNS の通知としては、ここでは成功・失敗いずれも通知対象としているので、実行の度に以下のようなメールが届きます。
出力ログの確認
ログの出力先としてバックアップファイルの配置先と同じ S3 バケットを指定しているので、コマンド実行の度にこちらにログが出力されます。
各実行にはコマンドIDが振られます。
S3 では指定のパスに以下のようにコマンドIDごとにさらにログが配置されます。
今回であれば以下の通り出力されます。
エラーとなった実行の stderr を確認すると以下のようになっており、バックアップファイルがないことをこちらからも確認できました。
++ date +%Y-%m-%d
+ DATE=2024-12-07
++ date +%H-%M-%S
+ TIME=15-30-45
+ backup_dir=/opt/tableau/tableau_backups/backups/
+ settings_export_dir=/opt/tableau/tableau_backups/setting_exports/
+ s3_bucket=<S3バケット名>
+ s3_backup_path=maintenance-backup/2024-12-07/
+ s3_settings_path=setting/2024-12-07/
+ file_extension='*.tsbak'
+ settings_file=output_file-2024-12-07-15-30-45.json
++ current_time
++ date '+%Y-%m-%d %H:%M:%S'
+ echo '2024-12-07 15:30:45 Exporting Tableau settings...'
+ su - ec2-user -c 'tsm settings export -f /opt/tableau/tableau_backups/setting_exports/output_file-2024-12-07-15-30-45.json'
+ '[' 0 -ne 0 ']'
++ current_time
++ date '+%Y-%m-%d %H:%M:%S'
+ echo '2024-12-07 15:30:48 Successfully exported Tableau settings to /opt/tableau/tableau_backups/setting_exports/output_file-2024-12-07-15-30-45.json'
++ current_time
++ date '+%Y-%m-%d %H:%M:%S'
+ echo '2024-12-07 15:30:48 Uploading Tableau settings export to S3...'
+ aws s3 cp /opt/tableau/tableau_backups/setting_exports/ s3://<S3バケット名>/setting/2024-12-07/ --recursive
+ '[' 0 -ne 0 ']'
++ current_time
++ date '+%Y-%m-%d %H:%M:%S'
+ echo '2024-12-07 15:30:49 Successfully uploaded Tableau settings to s3://<S3バケット名>/setting/2024-12-07/'
++ current_time
++ date '+%Y-%m-%d %H:%M:%S'
+ echo '2024-12-07 15:30:49 Checking for *.tsbak files in /opt/tableau/tableau_backups/backups/...'
++ find /opt/tableau/tableau_backups/backups/ -type f -name '*.tsbak'
+ found_files=
+ '[' -z '' ']'
++ current_time
++ date '+%Y-%m-%d %H:%M:%S'
+ echo '2024-12-07 15:30:49 Error: No *.tsbak files found in /opt/tableau/tableau_backups/backups/. Exiting.'
2024-12-07 15:30:49 Error: No *.tsbak files found in /opt/tableau/tableau_backups/backups/. Exiting.
+ exit 1
failed to run commands: exit status 1
さいごに
Tableau Server でのバックアップファイルの取得をスケジュール実行してみました。ここではファイルを取得したり S3 に配置するまでの内容ですが、実際には S3 に配置できたファイルは EC2 側から削除する処理も必要かと思います。また、ログのクリーンアップも組み込めます。
SSM Run Command であれば簡単な通知とログもあわせて S3 に出力できて便利だと思いました。
こちらの内容が何かの参考になれば幸いです。