前書き
重要なデータのバックアップは、コンピューターインフラストラクチャを管理する上で不可欠な部分です。 バックアップの実行に関しては全員のニーズが異なりますが、オフサイトの場所でバックアップデータを維持することをお勧めします。
データのコピーをオフサイトの場所に送信するプロセスは、かつては大きな物流上の課題でした。 しかし、CrashplanやDropboxのようなクラウドベースのストレージサービスの出現と、DigitalOcean Spacesのようなオブジェクトストレージソリューションの開発により、今でははるかに簡単なタスクになっています。 それにも関わらず、ファイルをバックアップすることを忘れずにアップロードするのに時間をかけることは、一部の人にとっては障害となります。
このため、人々はさまざまなツールを使用して、重要なデータの定期的な自動バックアップを実行することを選択します。 このチュートリアルでは、s3cmdコマンドラインツールを中心にスクリプトを作成します。このスクリプトを使用して、DigitalOceanSpacesにデータをすばやくアップロードできます。 次に、crontabを使用して、バックアップスクリプトを定期的に呼び出し、ファイルをSpaceにアップロードします。
前提条件
このチュートリアルでは、次のものが必要です。
-
非ルートsudoユーザーを使用する1つのUbuntu 16.04 x64ドロップレット。 これは、initial server setup guide for Ubuntu 16.04に従うことで構成できます。
シェルスクリプトとcronジョブスケジューラにある程度精通していることも役立つ可能性があります。 いくつかのガイダンスと追加のコンテキストについては、「https://www.digitalocean.com/community/tutorial_series/an-introduction-to-shell-scripting [シェルスクリプトの紹介]」および「https://www.digitalocean .com / community / tutorials / how-to-schedule-routine-tasks-with-cron-and-anacron-on-a-vps [VPSでCronとAnacronを使用して定期的なタスクをスケジュールする方法]。
前提条件が整ったら、バックアップ自動化プロセスを開始する準備が整いました。
バックアップスクリプトの作成
バックアップファイルをオブジェクトストレージサービスに自動的に定期的にアップロードするために使用できるツールがいくつかあります。 ただし、これらを構成するのは難しく、柔軟性の面ではあまり役立ちません。 シンプルなシェルスクリプトを使用すると、オブジェクトストレージのバックアップを自動化するためのはるかにエレガントで簡単なアプローチになります。
このチュートリアルでは、tarを使用してファイルまたはディレクトリのバックアップを作成する基本的なbashスクリプトを記述します。 次に、スクリプトは、s3cmdコマンドラインユーティリティを使用して、そのバックアップをSpacesにアップロードします。
開始するには、Dropletにログインしてホームフォルダーに移動します。
cd ~
ホームフォルダに移動したら、nanoを使用して、スクリプトに書き込むことができる空のファイルを作成します。
nano bkupscript.sh
これで、テキストエディタでバックアップスクリプトを書き始める準備ができました。 スクリプトを作成するときに、各部分を順番にセクションごとに説明します。
スクリプトの開始
この時点では、bkupscript.shは空のテキストファイルにすぎません。 コンピューターがコマンドとして実行可能ファイルを呼び出すには、スクリプトをハッシュバンで開始する必要があります。 hashbangは、スクリプトまたはデータファイルをコマンドとして実行できるようにするインタプリタディレクティブです。
この場合、hashbangは次のようになります。
bkupscript.sh
#!/bin/bash
これをスクリプトの先頭に含めることにより、bashでファイルのコマンドを実行するようシェルに指示しています。
変数を宣言する
次に、正しく機能するために知る必要がある変数をスクリプトに伝えます。 これらをテキストファイルの上部のhashbangのすぐ下に追加できます。
bkupscript.sh
...
DATETIME=`date +%y%m%d-%H_%M_%S`
SRC=$1
DST=$2
GIVENNAME=$3
これらの各変数をどのように割り当てているかを見ていきましょう。
-
DATETIME:この変数は、結果のファイル名に付加するタイムスタンプを保持するため、Spaceにバックアップされるすべてのファイルには一意の名前が付けられます。 このタイムスタンプは、dateコマンドを呼び出し、出力をフォーマットして、年の下2桁(%y)、月の2桁(%m)、2桁を表示することによって作成されます。日の桁(%d)、時(%H)、分(%M)、秒(%S)。 -
SRC:これは、バックアップするファイルまたはフォルダーのsourceパスです。$1は、スクリプトに渡された最初のパラメーターからこの値を取得していることを示します。 -
DST:この変数はファイルのdestinationを表します。 この場合、これはバックアップのアップロード先のスペースの名前です。 この名前は、$2で示されるように、スクリプトに渡される2番目のパラメーターに由来します。 -
GIVENNAME:この変数は、宛先ファイルのユーザーが選択した名前をホストします。 結果のファイル名はGIVENNAMEで始まり、DATETIMEが連結されます。 この名前は、スクリプトに渡される3番目のパラメーター($3)に由来します。
ヘルプを提供する
スクリプトを作成する場合、ユーザーがスクリプトを使用しようとして失敗した場合のトラブルシューティングに役立つヒントや一般的なアドバイスを追加すると役立ちます。
バックアップスクリプトでは、変数の下にshowhelp()という関数を追加します。 これにより、スクリプトが失敗した場合のトラブルシューティングに役立つ一連のメッセージが出力されます。 bashに関数を追加すると、構文は次のようになります。
bkupscript.sh
...
showhelp(){
}
この関数は、画面上に一連の使用手順をエコーすることにより、ヘルプメッセージを提供します。 各命令は、二重引用符で囲まれた文字列として提示する必要があります。 以下の例では、一部の文字列の先頭または末尾に または
が書き込まれていることがわかります。 これらはescape charactersであり、文字列がスクリプトの出力にどのように表示されるかについての特定の指示を提供します。
-
はタブスペースを示します -
は改行を示します
中括弧の間に役立つ使用法の詳細を自由に追加してください(文字列の前にechoを付けることを忘れないでください)。 デモンストレーションのために、次を追加します。
bkupscript.sh
echo "\n\n############################################"
echo "# bkupscript.sh #"
echo "############################################"
echo "\nThis script will backup files/folders into a single compressed file and will store it in the current folder."
echo "In order to work, this script needs the following three parameters in the listed order: "
echo "\t- The full path for the folder or file you want to backup."
echo "\t- The name of the Space where you want to store the backup at."
echo "\t- The name for the backup file (timestamp will be added to the beginning of the filename)\n"
echo "Example: sh bckupscript.sh ./testdir testSpace backupdata\n"<^>
最後のshowhelp関数は次のようになります。
bkupscript.sh
...
showhelp(
echo "\n\n############################################"
echo "# bkupscript.sh #"
echo "############################################"
echo "\nThis script will backup files/folders into a single compressed file and will store it in the current folder."
echo "In order to work, this script needs the following three parameters in the listed order: "
echo "\t- The full path for the folder or file you want to backup."
echo "\t- The name of the Space where you want to store the backup at."
echo "\t- The name for the backup file (timestamp will be added to the beginning of the filename)\n"
echo "Example: sh bckupscript.sh ./testdir testSpace backupdata\n"
}
ヘルプテキストを配置したら、Spaceにバックアップするファイルの収集に進むことができます。
ファイルの収集
スクリプトがスペースに何かを転送する前に、まず適切なファイルを収集し、アップロードするために単一のパッケージに統合する必要があります。 これは、tarユーティリティと条件ステートメントを使用して実現できます。 tarを使用してアーカイブファイル(「zip」ファイルとも呼ばれる)を作成しているため、この関数をtarandzip()と呼びます。
まず、関数を宣言し、別のechoコマンドを追加して、スクリプトがファイルの収集を開始したことをユーザーに通知します。
bkupscript.sh
...
tarandzip(){
echo "\n##### Gathering files #####\n"
}
echoコマンドの下に、ファイルを収集して単一の出力ファイルに圧縮する作業を行うtarコマンドを追加できます。
bkupscript.sh
tarandzip(){
echo "\n##### Gathering files #####\n"
tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC
}
このtarコマンドは、いくつかのオプションと変数を使用して呼び出されます。
-
c:このフラグは、tarに出力ファイルを圧縮するように指示します。 -
z:これは、gzipを使用してファイルを圧縮するようにtarに指示します。 -
v:これはverboseオプションを意味し、出力に詳細情報を表示するようにtarに指示します。 -
f:このフラグは、次に示すファイル名でファイルを保存するようにtarに指示します。 -
$GIVENNAME-$DATETIME.tar.gz:スクリプトは、新しいファイル名を作成するために、最初に宣言したこれらの変数を呼び出します。 これは、$GIVENNAME変数と$DATETIME変数を組み合わせ、最後に.tar.gz拡張子を追加して、新しいファイル名を形成することによって行われます。 -
$SRC:この変数は、tarにバックアップするように指示しているsourceファイルまたはフォルダーを表します。
これで、この関数は目的の処理を実行できるようになりますが、echo呼び出しをさらにいくつか追加して、スクリプトの動作に関する追加情報をユーザーに提供できます。 これは、次のようないくつかの条件ステートメントを追加することで実行できます。
bkupscript.sh
if tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC; then
echo "\n##### Done gathering files #####\n"
return 0
else
echo "\n##### Failed to gather files #####\n"
return 1
fi
if句が呼び出されると、tarコマンドが実行され、結果が返されます。 コマンドの結果が正の場合(つまり、正常に実行された場合)、thenとelseの間の行が実行されます。 これらは:
-
スクリプトが
tarプロセスを正常に完了したというメッセージのエコー -
この関数を呼び出すコードの部分がすべてが正常に機能したことを認識できるように、
0のエラーコードを返します。
この関数のelse部分は、実行中にtarコマンドがエラーを検出した場合にのみ実行されます。 この場合、句のelseブランチは次のようになります。
-
tarコマンドが失敗したことを示すメッセージをエコーします -
何かがうまくいかなかったことを示す
1のエラーコードを返します
最後に、if/then/else句をfiで終了します。これは、bash言語では、if句が終了したことを意味します。
完成したtarandzip()関数は次のようになります。
bkupscript.sh
tarandzip(){
echo "\n##### Gathering files #####\n"
if tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC; then
echo "\n##### Done gathering files #####\n"
return 0
else
echo "\n##### Failed to gather files #####\n"
return 1
fi
}
tarandzip()関数を配置したら、バックアップを移動するようにスクリプトを設定する準備が整います。
オブジェクトストレージへのファイルの転送
この時点で、s3cmdコマンドを使用して、バックアップスクリプトを取得してファイルをSpaceに転送できます。 tarandzipと同様に、いくつかの文字列をechoし、if/then/elseステートメントを使用して、実行中のスクリプトの動作をユーザーに知らせます。
まず、関数を宣言します。 もう一度これを単純にして、movetoSpace()という名前を付けましょう。
bkupscript.sh
...
movetoSpace(){
}
これで、s3cmdと前に宣言した変数を使用して、バックアップファイルをスペースにプッシュするコマンドを作成できます。
bkupscript.sh
movetoSpace(){
~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST
}
このコマンドの各部分の意味は次のとおりです。
-
~/s3cmd-2.0.1/s3cmd:これはs3cmd、command line tool used for managing object storage bucketsを呼び出します。 -
put:これは、データをバケットにアップロードするためにs3cmdによって使用されるコマンドです。 -
$GIVENNAME-$DATETIME.tar.gz:これはスペースにアップロードされるバックアップの名前です。 これは、宣言した4番目と最初の変数とそれに続く.tar.gzで構成され、以前のtarandzip()関数によって作成されます。 -
s3://$DST;:これはファイルをアップロードする場所です。s3://は、オブジェクトの保存場所をオンラインで記述するために特に使用されるURIに似たスキーマですが、$DST;は、前に宣言した3番目の変数です。
アーカイブファイルをスペースにアップロードできる機能が追加されました。 ただし、そのステータスについてはユーザーに通知しません。 これを変更するには、コマンドの前に文字列をエコーして、ユーザーにコマンドが開始されたことを知らせ、関数が完了した後に、成功したかどうかを知らせます。
プロセスが開始されたことをユーザーに通知することから始めましょう。
bkupscript.sh
movetoSpace(){
echo “\n##### MOVING TO SPACE #####\n”
~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST
}
コマンドは成功するか失敗するか(つまり、ファイルをSpaceにアップロードするかしないか)なので、if/then/elseに保持されている2つの文字列のいずれかをエコーすることで、コマンドが機能したかどうかをユーザーに知らせることができます。このようなステートメント:
bkupscript.sh
...
if ~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST; then
echo "\n##### Done moving files to s3://"$DST" #####\n"
return 0
else
echo "\n##### Failed to move files to the Space #####\n"
return 1
fi
この条件ステートメントは、bashに「s3cmdコマンドが正しく機能する場合は、スクリプトがファイルをスペースに移動し終えたことをユーザーに知らせます。 そうでなければ、プロセスが失敗したことをユーザーに知らせてください。」
s3cmdプロセスが正常に完了すると、関数はそのことを示すメッセージ(thenステートメントの最初のecho文字列)を画面に出力し、0の値を返します。 、操作が完了したことを呼び出し元の関数に通知します。 プロセスが失敗した場合、then句は単にエラーメッセージ(2番目のecho文字列)を出力し、1を返すため、スクリプトの残りの部分はエラーが発生したことを認識します。
全体として、movetoSpace()関数は次のようになります。
bkupscript.sh
movetoSpace(){
echo "\n##### MOVING TO SPACE #####\n"
if ~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST; then
echo "\n##### Done moving files to s3://"$DST" #####\n"
return 0
else
echo "\n##### Failed to move files to the Space #####\n"
return 1
fi
}
movetoSpace()関数を記述したら、フロー制御の条件ステートメントを使用して、スクリプトが期待どおりの順序で関数を呼び出すように設定されていることを確認できます。
フロー制御のセットアップ
スクリプトを関数でセットアップしましたが、スクリプトがそれらの関数を完了する順序を提供していません。 この時点で、作成した他の関数をいつどのように実行するかを正確にスクリプトの残りの部分に伝える呼び出し関数を導入できます。
すべてが正しく構成されていると仮定すると、スクリプトを実行すると、入力コマンドを読み取り、そこから値を各変数に割り当て、tarandzip()関数を実行し、その後にmovetoSpace()関数を実行する必要があります。 これらのポイントのいずれかでスクリプトが失敗した場合、ユーザーがトラブルシューティングを行うのに役立つように、showhelp()関数の出力を出力する必要があります。 ファイルの最後に一連のif/then/elseステートメントを追加することで、これを注文してエラーをキャッチできます。
bkupscript.sh
...
if [ ! -z "$GIVENNAME" ]; then
if tarandzip; then
movetoSpace
else
showhelp
fi
else
showhelp
fi
上記のセクションの最初のifステートメントは、渡された3番目の変数が空でないことを確認します。 これは次の方法で行われます。
-
[ ]:角括弧は、それらの間にあるのがtestであることを示します。 この場合、テストは特定の変数が空でないことです。 -
!:この場合、この記号はnotを意味します。 -
-z:このオプションはempty stringを示します。 したがって、!と組み合わせて、not an empty stringを要求します。 -
$GIVENNAME:ここでは、空にしたくない文字列が変数$GIVENNAMEに割り当てられた値であることを示しています。 このアプローチを選択した理由は、コマンドラインからスクリプトを呼び出すときに、この変数に3番目のパラメーターによって渡された値が割り当てられるためです。 スクリプトに渡すパラメーターが3つ未満の場合、コードには値を$GIVENNAMEに割り当てるための3番目のパラメーターがないため、空の文字列が割り当てられ、このテストは失敗します。
この最初のテストが成功したと仮定すると、次のifステートメントに進みます。 ifステートメントのいずれかがエラーを返す場合、then句はshowhelp関数を呼び出し、ヘルプテキストが出力に表示されます。 基本的に、これが行うことは、これまでに記述したすべての機能を結合し、それらを正しい順序で実行するために必要な情報を提供します。
スクリプトが完成しました! スクリプトが、以下のセクションで作成した完全なスクリプトのように見えることを確認できます。
完全なスクリプト
作成した完成したバックアップスクリプトは次のようになります。
bkupscript.sh
#!/bin/bash
DATETIME=`date +%y%m%d-%H_%M_%S`
SRC=$1
DST=$2
GIVENNAME=$3
showhelp(){
echo "\n\n############################################"
echo "# bkupscript.sh #"
echo "############################################"
echo "\nThis script will backup files/folders into a single compressed file and will store it in the current folder."
echo "In order to work, this script needs the following three parameters in the listed order: "
echo "\t- The full path for the folder or file you want to backup."
echo "\t- The name of the Space where you want to store the backup at (not the url, just the name)."
echo "\t- The name for the backup file (timestamp will be added to the beginning of the filename)\n"
echo "Example: sh bkupscript.sh ./testdir testSpace backupdata\n"
}
tarandzip(){
echo "\n##### Gathering files #####\n"
if tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC; then
echo "\n##### Done gathering files #####\n"
return 0
else
echo "\n##### Failed to gather files #####\n"
return 1
fi
}
movetoSpace(){
echo "\n##### MOVING TO SPACE #####\n"
if ~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST; then
echo "\n##### Done moving files to s3://"$DST" #####\n"
return 0
else
echo "\n##### Failed to move files to the Space #####\n"
return 1
fi
}
if [ ! -z "$GIVENNAME" ]; then
if tarandzip; then
movetoSpace
else
showhelp
fi
else
showhelp
fi
スクリプトを確認したら、nanoを終了する前に、必ずファイル(CTRL-x、y、ENTER)を保存して閉じてください。
スクリプトをテストする
スクリプトの作成が完了したので、テストに進みます。 これにより、スクリプトが正しく記述されたかどうかがわかるだけでなく、スクリプトの使用を練習して実際に動作する機会を得ることができます。
このようなスクリプトをテストする場合、通常、ダミーファイルを使用することをお勧めします。 データを破壊または削除できないことはわかっていますが、重要でないファイルをテストして安全に再生するのが賢明です。 まず、mkdirコマンドを使用してディレクトリを作成します。
mkdir backupthis
次に、touchを使用して、このディレクトリ内に2つの空のファイルを作成します。
sudo touch backupthis/file1.txt
sudo touch backupthis/file2.txt
これで、backupthisディレクトリとその内容をSpaceにアップロードして、スクリプトをテストできます。 これは、スクリプトを呼び出すために使用する必要がある形式です。
sh bkupscript.sh ./backupthis name_of_your_space testrun
[。注意]##
NotemovetoSpace()関数は自動的にs3://を宛先変数(つまり、スペースの名前)の前に付加するため、この変数は、完全なURLではなく、単にスペースの名前である必要があります。 たとえば、SpaceのURLが「https://example-space-name.nyc3.digitaloceanspaces.com」の場合、次のようにテストコマンドを記述します。
sh bkupscript.sh ./backupthis example-space-name testrun
上記のコマンドにより、スクリプトが動作し、次のような出力が表示されます。
Output
##### Gathering files #####
./backupthis/
./backupthis/file1.txt
./backupthis/file2.txt
##### Done gathering files #####
##### MOVING TO SPACE #####
upload: 'testrun-180119-15_09_36.tar.gz' -> 's3://name_of_your_space /testrun-180119-15_09_36.tar.gz' [1 of 1]
162 of 162 100% in 8s 19.81 B/s done
##### Done moving files to s3://name_of_your_space #####
エラーが発生した場合は、スクリプトを確認して、例と一致することを確認してください。 また、s3cmdのインストールが適切に構成されていること、および使用しているアクセスキーと秘密キーの両方が正しいことを確認してください。
Crontabを使用したバックアップの自動化
バックアップスクリプトのテストに成功したら、スクリプトを使用してSpaceへの定期的なバックアップを実行するcronジョブを設定できます。 このチュートリアルの目的のために、バックアップスクリプトを毎分実行するように設定します。
まず、スクリプトを実行可能にする必要があります。
chmod +x bkupscript.sh
スクリプトをコマンドとして実行できるようになったので、crontabファイルを編集して、スクリプトを1分ごとに実行できます。
crontab -e
crontab -eを初めて実行すると、リストからエディターを選択するように求められます。
no crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
Choose 1-4 [2]:
デフォルトのnano、または選択した別のテキストエディターを選択できます。
crontabに入ると、すでに存在する値の下部に次の行を追加します。
/tmp/crontab.example/crontab
* * * * * ~/bkupscript.sh ~/backupthis nameofyourspace cronupload
変更を保存するには、CTRL-x、y、ENTERの順に押します。
1分ほどすると、Spaceのダッシュボードに新しいファイルが表示されます!
変更を加えずにcronジョブを実行したままにすると、新しいファイルが1分ごとにSpaceにコピーされます。 cronが正常に実行されていることを確認したら、crontabを再構成して、必要な間隔でファイルをバックアップしてください。
これで、バックアップを定期的に圧縮してDigitalOcean Spaceに送信するスクリプトが完成しました!