Tableau Server 2019.1.1 バックアップ&ログクリーンナップを自動化する

本日はお客様のリクエストに応えて、Tableau Server バックアップ&ログクリーンナップを自動化する方法をご紹介します。以前にTableau Server のディスクフル対策Tableau ServerのTSMコマンド用スクリプトへ移行する方法などをご紹介しましたが、TSMコマンドが導入やTSMコマンドのサブコマンドに変更が加えられていたりするので、改めて、バックアップ&ログクリーンナップを自動化する方法とサンプルスクリプトについて解説します。

バックアップ&ログクリーンナップの必要性

単純にバックアップするだけなら、EC2インスタンスのスナップショットでも構いませんが、そのままではログが累積するため、ご紹介する方法でバックアップもしくはログクリーンナップが必要になります。

インストール後そのまま使い続けるとどうなるか

データディスクのサイズやアクセス頻度によって様々ですが、ログを削除しなければ徐々にディスク容量が少なくなり、場合によってはディスクの空き領域不足によるサービスが停止が発生します。

Tableau Serverが自動でログローテーションしない理由は、恐らく、内部動作しているApache WebServer のアクセスログなど、誰がいつどのURLにアクセスしたかなどの情報の管理について利用者の判断に委ねられているのではないかと考えられます。しかしながら、ログがディスクを圧迫してサービス停止に陥るのは避けたいものです。

ログクリーンナップするには、バックアップ(tsm maintenance backup)もしくはログクリーンナップ(tsm maintenance cleanup)のいずれかが必要になります。

バックアップしないと、バックアップができなくなるという悪循環

バックアップを正常に実行するには、十分なディスク領域が必要です。バックアップファイルに要するディスク領域の合計に加え、テンポラリファイルのためのディスク領域として、バックアップファイルのサイズのおよそ10倍が必要です (例えば、バックアップが4GBの場合、テンポラリ ファイルのためのディスク領域として約40GBが必要です)。

つまり、バックアップを実施しないと、ディスク領域不足のため、バックアップができなくなるという悪循環を招く恐れがあります。

スクリプト実行時のパスワード設定方法

バックアップやログクリーンナップを実行するTSMコマンドはユーザ名とパスワードによる認証が必要にです。TSMコマンドを実行するスクリプト内でユーザ名やパスワードをTSMコマンドを実行するスクリプト内に記入することなく、セキュリティ的に安全にTMSへユーザ名/パスワードを渡します。Windows PowerShellのDPAPI(Data Protection Application Programming Interface)を用いて、暗号化された認証情報ファイルを使って、スクリプト内部からユーザ名/パスワードをTSMへ渡す方法で認証します。以下のスクリプトを実行して、ユーザー名とパスワードを暗号化したファイルを作成して保存します。&Credential.Passwordを実行すると、ユーザー名とパスワードを入力するダイアログが表示され、その結果をSecureStringに渡してファイル出力します。

サンプル:createCredential.ps1

$FilePath = "C:\Users\Administrator\.tableau\cred.sec"
$Credential = Get-Credential
$Credential.Password | ConvertFrom-SecureString | Set-Content $FilePath

上記のスクリプトを実行すると以下のようなダイアログが表示されますので、ユーザー名とパスワードを入力してください。実行すると$FilePathにファイルとして保存されます。

詳細は、Tableau ServerのTSMコマンド用スクリプトへ移行する方法をご覧ください。

以降では、この認証情報を用いてバックアップの方法を解説します。

データのバックアップ

バックアップの対象

今回はリポジトリ データと構成およびトポロジ データの2つをバックアップの対象とします。

構成およびトポロジ データ

サーバーを完全に復旧するために必要なサーバー構成情報の殆どが含まれます。SMTP、アラート、認証はすべて、バックアップのためにエクスポートできる構成データの例です。トポロジ データは単一サーバーおよび複数ノード両方の展開で Tableau Server プロセスを構成する方法を定義します。構成およびトポロジ データは tsm settings exportコマンドでバックアップされます。

リポジトリ データ

Tableau Server は、ワークブックおよびユーザーのメタデータ、データ抽出ファイル、サイト構成データが含まれる、Tableau PostgreSQL データベースまたはリポジトリで構成されています。TSM を使用してバックアップを作成するときは、このデータすべてが .tsbak 拡張子を持つ 1 つのファイルに保存されます。このデータは tsm maintenance backupコマンドでバックアップされます。

バックアップスクリプト(tabhotbackup_tsm.ps1)

構成およびトポロジ データはtsm settings export、リポジトリ データはtsm maintenance backupを実行して、バックアップを取得します。取得したファイルは、S3にアップロードした後、ローカルから削除します。なお、作成先や保存用S3バケットは、適宜変更してください。

## 認証状情報
$FilePath = "C:\Users\Administrator\.tableau\cred.sec"
$Username = "Administrator"
$encryptedCred = Get-Content $FilePath | ConvertTo-SecureString
$cred = New-Object System.management.Automation.PsCredential($Username, $encryptedCred)

## 日時
$formatted_date = (Get-Date).ToString("yyyyMMddHHmmss")

## 構成およびトポロジ データ(settings)の作成先
$setting_dir = "D:\csa_backup\tmp\"
$setting_file = "tableau-setting-" + $formatted_date + ".json"

## リポジトリ データ(backup)の作成先
#$maintenance_dir = "D:\CSA\Customer Story Analytics Server\data\tabsvc\files\backups\"
$maintenance_dir = "C:\Program Files\Tableau\Tableau Server\data\tabsvc\files\backups\"
$maintenance_file = "tableau-backup-" + $formatted_date + ".tsbak"

## バックアップの保存先のS3バケット
$bucket = "csa-backup"

## Tableau Server サービス起動中の確認
$ret = & echo $cred.GetNetworkCredential().Password | tsm status
if ( $ret -eq 'Status: RUNNING') {
  ## 構成およびトポロジ データ(settings)
  # 作成
  & echo $cred.GetNetworkCredential().Password | tsm settings export -f ($setting_dir + $setting_file) 
  # アップロード
  Write-S3Object -BucketName $bucket -File ($setting_dir + $setting_file) -Key $setting_file
  # 削除
  Remove-Item ($setting_dir + $setting_file)

  ## リポジトリ データ(backup)
  # 作成
  & echo $cred.GetNetworkCredential().Password | tsm maintenance backup -f $maintenance_file 
  # アップロード
  Write-S3Object -BucketName $bucket -File ($maintenance_dir + $maintenance_file) -Key $maintenance_file
  # 削除
  Remove-Item ($maintenance_dir + $maintenance_file)
}

スケジュール設定

今回は、Windows Server のタスクスケジューラに登録します。登録方法は、PowerShellスクリプトのタスクスケジューラへの登録をご覧ください。

実行結果

上記のスクリプトを実行すると、以下のようにS3バケットへ保存されます。

その他

バックアップファイルは、S3バケットに保存しますので、実行に必要なパーミッションを事前に設定してください。また、バックアップファイルのローテーションはS3バケットのライフサイクル管理で一定期間で削除するようにするだけでローテーション可能です。

ログのクリーンナップ

上記の「データのバックアップ」をスケジュール実行している場合は、既にログはクリーンナップされているので、別途ログのクリーンナップスクリプトの実行は不要です。ログクリーンナップの導入手順は、これまで解説した「データのバックアップ」のスクリプトを置き換えるのみです。

ログクリーンナップ(tabhotcleanup_tsm.ps1)

構成およびトポロジ データはtsm settings export、リポジトリ データはtsm maintenance backupを実行して、バックアップを取得します。取得したファイルは、S3にアップロードした後、ローカルから削除します。なお、作成先や保存用S3バケットは、適宜変更してください。

## 認証状情報
$FilePath = "C:\Users\Administrator\.tableau\cred.sec"
$Username = "Administrator"
$encryptedCred = Get-Content $FilePath | ConvertTo-SecureString
$cred = New-Object System.management.Automation.PsCredential($Username, $encryptedCred)

## Tableau Server サービス起動中の確認
$ret = & echo $cred.GetNetworkCredential().Password | tsm status
if ( $ret -eq 'Status: RUNNING') {
  # ログのクリーンナップ
  & echo $cred.GetNetworkCredential().Password | tsm maintenance cleanup
}

まとめ

Tableau Server運用するには、バックアップもしくはログクリーンナップの定期実行が必須です。また、tsmコマンドの実行に指定するアカウントは、比較的権限の強いユーザーになるのでパスワードの記載は避けるためにWindows PowerShellのDPAPI(Data Protection Application Programming Interface)を用いてください。バックアップやログのクリーナップは、この認証情報を用いれば簡単に実行できるはずです。

バックアップしたファイルは、EC2インスタンス上ではなく、S3のような堅牢で安価なストレージに保存して、EC2のストレージ(EBS)からは削除しましょう。S3に保存したバックアップファイルに保存すると、S3のフルマネージドサービスの1つであるライフサイクル管理で一定期間で簡単・確実にローテーションできます。

合わせて読みたい

Tableau Server のディスクフル対策

パスワードをスクリプトに埋め込むなんてありえない!Tableau ServerのTSMコマンド用スクリプトへ移行する方法

PowerShellスクリプトサンプル(Tableau ServerのバックアップファイルをS3にアップロード)