JUST.DB AWS S3へのバックアップ|CLI
こんにちは
JUST.SFA のデータ。皆様はどのような方法でバックアップを作成されているのでしょうか。
沢山のテーブルを手動で個別にエクスポートするのはちょっと手間なので、自動化してみましたのでご紹介いたします。
概要
AWS S3 に各テーブルからエクスポートしたデータをバクアップします。
エクスポートには JUST.SFA コマンドラインツールを利用します。S3 へのアップロードには AWS CLI を利用します。
両方のコマンドは EC2でシェルスクリプトで実行します。
バックアップ対象となるパネルは テキストファイルにまとめてパネル一覧とし、シェルの実行時に読み込ませるようにしました。
- パネル一覧にはパネル識別名が記載されています。パネル識別名で制御ファイルを作成します。既に作成済みの場合はスキップするようにしています。
制御ファイルにはパネルからデータを CSV(または ZIP) ファイルで取得する設定が記載されています。 - パネル一覧に記載されているパネル識別名を繰り返し取得して、JUST.SFA コマンドラインツールを使ってパネルからデータをエクスポートします。
このとき ①で作成した制御ファイルを使用します。 - エクスポートされたファイルを AWS CLI を使って S3にアップロードします。アップロード先は実行日時でプレフィックス(フォルダ)を作成してまとまるようにします。
用意したもの
- パネル一覧ファイル
JUST.SFA では テーブルを指定してエクスポートするのではなく、テーブルを表示するパネルを指定してエクスポートを実施します。
同じテーブルが複数のパネルで使用されている場合もありますので、すべてのパネルをエクスポートするのは冗長です。
必要なデータがエクスポートできるパネルをテーブル毎に洗い出し、パネル識別名を取得します。ここは効率のよい方法が見つからなかったため、データ管理画面のパネル管理や、定義情報からダウンロードできる業務プレート情報を使って洗い出しと作成を行いました。 - 制御ファイルのテンプレート
JUST.SFA のコマンドラインツールでパネルからデータをエクスポートするときに使用する制御ファイルのテンプレートです。
パネル識別名で既存の制御ファイルが存在しない場合は、テンプレートから制御ファイルを作成します。具体的には、テンプレート内のパネル識別名を置き換えて別名で保存しています。 - シェルスクリプト
クーロンで定期実行を設定する前提で、制御ファイルの作成や各CLIのコマンド実行はシェルスクリプトにまとめました。 - AWS IAM
AWS CLI を実行するためのユーザーを、S3のバケットを操作するためのポリシーをつけて作成しました。 - AWS S3
バックアップを作成するためのバケットを用意しました。 - JUST.SFA コマンドラインツール
Linux用コマンドラインツールをダウンロードし配置します。Adopt OpenJDK から Java8 JRE をダウンロードして配置します。
データのエクスポートが可能なユーザーのパスワードを jsfa_encrypt コマンドで登録しておきます。
フォルダ構成はこうなりました。
jsfa-s3/
|- download/ エクスポートして取得したファイルを格納するフォルダ
|- logs/ CLI実行時ログを格納するフォルダ
|- jsfa-command-tools JUST.SFA コマンドラインツールをここに配置しました
| |- bin/
| |- jre/ JRE はここに配置しました
| |- bin/
| |….
| |….
|- settings/ 制御ファイルを格納するフォルダ
|- jsfa-s3.sh シェルスクリプト
|- tables.txt パネル一覧
|- template.txt 制御ファイルのテンプレート - AWS CLI
Amazon Linux2 を利用するので AWS CLI はインストール済みになりますが、Docker 上の Amazon Linux で開発しましたので別途インストールしました。
シェルスクリプト
シェルスクリプトでは 最初にJUST.SFA コマンドラインツールの binフォルダと、JRE の binフォルダにパスを通します。
次に、ロケールを ja_JP.UTF-8 に設定します。環境変数 LANG も ja_JP.UTF-8 に設定します。
ロケールが en_US などになっていると コマンドラインツールの起動に失敗します。
Docker 環境の場合、選択可能なロケールに ja_JP.UTF-8 がないため別途インストールしておきます。
あとは While でパネル一覧ファイルを1行ずつ読み込んで、制御ファイルが無ければ作成して、jsfa_recorddownload コマンドでエクスポートを実施します。
すべてのパネルが処理されたら、S3へアップロードします。
バケットに実行日時を名前としてプレフィックスを作成し、プレフィックス配下に JUST.SFAからエクスポートしたファイルをアップロードします。
プレフィックスは以下のようなコマンドで作成します。
aws s3api put-object –bucket backup-bucket –key ” 20210930123456/”
フォルダ内のファイルを再起的に処理してくれるのでアップロードコマンドは以下のように1行で済みます。
aws s3 cp “./download/” “s3://backup-bucket/20210930123456/” –recursive
実行結果
sh-4.2# ./jsfa-s3.sh 営M|商品テーブル is downloading ..... ファイル名を[ panel_1523275117.cvs.zip ]に変更してダウンロードしました ダウンロードが完了しました 営M|商品分類テーブル is downloading ..... ファイル名を[ panel_1606522055.cvs.zip ]に変更してダウンロードしました ダウンロードが完了しました 名刺管理テーブル(Sansan) is downloading ..... ファイル名を[ _CARD_IMPORT_SANSAN.cvs.zip ]に変更してダウンロードしました ダウンロードが完了しました { "ETag": "\"d41d8cd98f00b2 8427e\"", "ServerSideEncryption": "AES256", "VersionId": "3UBCdkmOX1EvETlMX8iEtn Ygsc" } upload: download/20210930_183950/_CARD_IMPORT_SANSAN.cvs.zip to s3://xxxx-backup-bucket/20210930_183950/_CARD_IMPORT_SANSAN.cvs.zip upload: download/20210930_183950/panel_1523275117.cvs.zip to s3://xxxx-backup-bucket/20210930_183950/panel_1523275117.cvs.zip upload: download/20210930_183950/panel_1606522055.cvs.zip to s3://xxxx-backup-bucket/20210930_183950/panel_1606522055.cvs.zip sh-4.2#
エクスポートにファイル項目を含む設定にしているため、zipでダウンロードされました。
ダウンロードが完了したあと、プレフィックスの作成とアップロードを実行して、無事にバックアップを作成することができました。
あとは、運用側の設定です。
クーロンで定期的に実行するように設定します。
S3に蓄積され続けるバックアップは S3のライフサイクルを設定して一定期間で削除するようにして対応します。
エラーが発生した場合は、シェルスクリプトのログを CloudWatchで監視し通知するように設定して対応します。ここはもう少しシンプルな方法がないか考えどころです。