DigitalOceanSpacesを使用してバックアップを自動化する方法
序章
重要なデータのバックアップは、コンピューターインフラストラクチャを管理する上で不可欠な部分です。 バックアップの実行に関しては、ニーズは人によって異なりますが、バックアップデータをオフサイトの場所に保持することをお勧めします。
データのコピーをオフサイトの場所に送信するプロセスは、以前はロジスティクス上の大きな課題でした。 しかし、CrashplanやDropboxのようなクラウドベースのストレージサービスの出現と、 DigitalOcean Spaces のようなオブジェクトストレージソリューションの開発により、今でははるかに簡単なタスクになっています。 それにもかかわらず、ファイルのバックアップを忘れずにアップロードすることは、一部の人にとっては依然として障害となる可能性があります。
これが、人々がさまざまなツールを使用して重要なデータの定期的な自動バックアップを実行することを選択する理由です。 このチュートリアルでは、 s3cmd
DigitalOceanSpacesにデータをすばやくアップロードするために使用できるコマンドラインツール。 次に使用します crontab
バックアップスクリプトを定期的に呼び出して、ファイルをSpaceにアップロードします。
前提条件
このチュートリアルでは、次のものが必要になります。
- ルート以外のsudoユーザーがいる1つのUbuntu20.04×64ドロップレット。 これは、Ubuntu20.04の初期サーバーセットアップガイドに従って構成できます。
- DigitalOceanSpaceおよびAPIアクセスキー。
- ドロップレットにインストールされているs3cmdコマンドラインツール。
シェルスクリプトと cron
ジョブスケジューラも役立つ可能性があります。 ガイダンスと追加のコンテキストについては、「シェルスクリプトの概要」および「VPSでCronとAnacronを使用してルーチンタスクをスケジュールする方法」を読むことを検討してください。
前提条件が整ったら、バックアップ自動化プロセスを開始する準備が整いました。
バックアップスクリプトの作成
バックアップファイルをオブジェクトストレージサービスに自動的かつ定期的にアップロードするために使用できるツールは多数あります。 ただし、これらは構成が難しい場合があり、柔軟性の点であまり提供されない場合があります。 シェルスクリプトを使用すると、オブジェクトストレージのバックアップを自動化するためのはるかに洗練された簡単なアプローチになります。
このチュートリアルでは、を使用してファイルまたはディレクトリのバックアップを作成する基本的なbashスクリプトを記述します。 tar
. 次に、スクリプトは、を使用してそのバックアップをSpacesにアップロードします。 s3cmd
コマンドラインユーティリティ。
開始するには、Dropletにログインして、ホームフォルダに移動します。
- cd ~
ホームフォルダに入ると、 nano
スクリプトに書き込むことができる空のファイルを作成するには、次のようにします。
- nano bkupscript.sh
これで、テキストエディタでバックアップスクリプトを書き始める準備ができました。 スクリプトを作成するときに、スクリプトの各部分をセクションごとに順番に説明します。
スクリプトの開始
この時点で、 bkupscript.sh
空のテキストファイルのみです。 コンピューターが実行可能ファイルをコマンドとして呼び出すには、スクリプトをハッシュバンで開始する必要があります。 hashbang は、スクリプトまたはデータファイルをコマンドとして実行できるようにするインタープリターディレクティブです。
この場合、ハッシュバンは次のようになります。
#!/bin/bash
これをスクリプトの先頭に含めることで、ファイルのコマンドをbashで実行するようにシェルに指示しています。
変数の宣言
次に、正しく機能するために知っておく必要のある変数をスクリプトに指示します。 これらは、テキストファイルの上部にあるハッシュバンのすぐ下に追加できます。
...
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パスです。 The$1
スクリプトに渡された最初のパラメーターからこの値を取得していることを示します。DST
:この変数は、ファイルの宛先を表します。 この場合、これはバックアップをアップロードするスペースの名前です。 この名前は、スクリプトに渡された2番目のパラメーターに由来します。$2
.GIVENNAME
:この変数は、宛先ファイルのユーザーが選択した名前をホストします。 結果のファイル名はで始まりますGIVENNAME
とDATETIME
その上に連結されます。 この名前は、スクリプトに渡された3番目のパラメーターに由来します($3
).
ヘルプの提供
スクリプトを作成するときは、ユーザーがスクリプトを使用しようとして失敗した場合のトラブルシューティングに役立つヒントや一般的なアドバイスを追加すると便利です。
バックアップスクリプトには、次の関数を追加します showhelp()
変数の下。 これにより、スクリプトが失敗した場合にユーザーがトラブルシューティングするのに役立つ一連のメッセージが出力されます。 bashに関数を追加すると、構文は次のようになります。
...
showhelp(){
}
この機能は、画面に一連の使用方法をエコーすることでヘルプメッセージを提供します。 各命令は、二重引用符で囲まれた文字列として提示する必要があります。 以下の例では、一部の文字列に \t
また \n
最初または最後に書かれています。 これらはエスケープ文字であり、文字列がスクリプトの出力にどのように表示されるかについての特定の指示を提供します。
\t
タブスペースを示します\n
改行を示します
中括弧の間に役立つ使用法の詳細を自由に追加してください(文字列の前に忘れずに echo
). デモンストレーションの目的で、以下を追加します。
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"<^>
最終 showhelp
関数は次のようになります。
...
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"
}
ヘルプテキストを配置したら、スペースにバックアップするファイルの収集に進むことができます。
ファイルの収集
スクリプトがスペースに何かを転送する前に、まず適切なファイルを収集し、それらを1つのパッケージに統合してアップロードする必要があります。 これは、 tar
ユーティリティと条件文。 使用しているので tar
アーカイブファイル(「zip」ファイルとも呼ばれます)を作成するには、この関数を呼び出します。 tarandzip()
.
関数を宣言し、別の関数を追加することから始めましょう echo
スクリプトがファイルの収集を開始したことをユーザーに通知するコマンド:
...
tarandzip(){
echo "\n##### Gathering files #####\n"
}
下 echo
コマンド、追加することができます tar
ファイルを収集して単一の出力ファイルに圧縮する作業を行うコマンド。
tarandzip(){
echo "\n##### Gathering files #####\n"
tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC
}
あなたはこれに気付くでしょう tar
コマンドは、いくつかのオプションと変数を使用して呼び出されます。
c
:このフラグはtar
出力ファイルを圧縮します。z
:これは指示しますtar
を使用してファイルを圧縮するにはgzip
.v
:これはverbose
指示するオプションtar
出力に詳細情報を表示します。f
:このフラグは指示しますtar
次に示すファイル名でファイルを保存します。$GIVENNAME-$DATETIME.tar.gz
:スクリプトは、新しいファイル名を作成するために、最初に宣言したこれらの変数を呼び出します。 これは、$GIVENNAME
と$DATETIME
変数と追加.tar.gz
新しいファイル名を形成するための末尾の拡張子。$SRC
:この変数は、指示しているsourceファイルまたはフォルダーを表しますtar
バックアップします。
この関数は、私たちが望むことを実行できるはずですが、さらにいくつか追加することができます echo
スクリプトがどのように機能しているかについての追加情報をユーザーに提供するための呼び出し。 これは、次のようないくつかの条件ステートメントを追加することで実行できます。
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
この関数を呼び出すコードの部分は、すべてが正常に機能したことを認識します。
The else
この関数の一部は、 tar
コマンドは実行中にエラーを検出します。 この場合、 else
条項の分岐は次のようになります。
- を示すメッセージをエコーします
tar
コマンドが失敗しました - のエラーコードを返します
1
、何かがうまくいかなかったことを示します
最後に、 if/then/else
句 fi
、bash言語では、 if
条項は終了しました。
完成 tarandzip()
関数は次のようになります。
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()
機能が整ったら、バックアップを移動するようにスクリプトを設定する準備が整いました。
オブジェクトストレージへのファイルの転送
この時点で、バックアップスクリプトを取得して、ファイルをSpaceに転送できます。 s3cmd
指図。 と同じように tarandzip
、私たちもできます echo
いくつかの文字列とを利用します if/then/else
スクリプトの実行中にスクリプトがどのように機能するかをユーザーが把握できるようにするためのステートメント。
まず、関数を宣言します。 簡単にするために、名前を付けます movetoSpace()
:
...
movetoSpace(){
}
今、私たちは使用することができます s3cmd
そして、バックアップファイルをSpaceにプッシュするコマンドをビルドするために以前に宣言した変数:
movetoSpace(){
s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST
}
このコマンドの各部分の意味は次のとおりです。
s3cmd
:これはs3cmd
、オブジェクトストレージバケットの管理に使用されるコマンドラインツール。put
:これはによって使用されるコマンドですs3cmd
バケットにデータをアップロードするため。$GIVENNAME-$DATETIME.tar.gz
:これは、Spaceにアップロードされるバックアップの名前です。 これは、宣言した4番目と最初の変数で構成され、その後に.tar.gz
、およびによって作成されますtarandzip()
以前から機能します。s3://$DST;
:これは、ファイルをアップロードする場所です。s3://
は、オブジェクトの保存場所をオンラインで記述するために特に使用されるURIのようなスキーマです。$DST;
は、前に宣言した3番目の変数です。
これで、アーカイブされたファイルをSpaceにアップロードできる関数ができました。 ただし、ステータスについてはユーザーに通知されません。 これを変更するには、コマンドの前に文字列をエコーして、コマンドが開始されたことをユーザーに知らせ、関数の完了後に、コマンドが成功したかどうかを知らせます。
プロセスが開始されたことをユーザーに通知することから始めましょう。
movetoSpace(){
echo "\n##### MOVING TO SPACE #####\n"
s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST
}
コマンドは成功または失敗するため(つまり、ファイルをSpaceにアップロードするか、しないか)、2つの文字列のいずれかをエコーすることでユーザーに通知できます。 if/then/else
このようなステートメント:
...
if 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
プロセスが正常に完了すると、関数は画面にメッセージを出力します(最初の echo
の文字列 then
ステートメント)そのことを示し、の値を返します 0
、操作が完了したことを呼び出し元の関数に通知します。 プロセスが失敗した場合、 then
句はエラーメッセージを出力します(2番目 echo
文字列)、およびを返します 1
したがって、スクリプトの残りの部分は、エラーが発生したことを認識しています。
全体として、 movetoSpace()
関数は次のようになります。
movetoSpace(){
echo "\n##### MOVING TO SPACE #####\n"
if 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
ファイルの下部にあるステートメント:
...
if [ ! -z "$GIVENNAME" ]; then
if tarandzip; then
movetoSpace
else
showhelp
fi
else
showhelp
fi
最初 if
上記のセクションのステートメントは、渡された3番目の変数が空でないことを確認します。 これは次のように行われます。
[ ]
:角かっこは、それらの間にあるのがテストであることを示します。 この場合、テストは特定の変数が空にならないようにすることです。!
:この場合、この記号はnot
.-z
:このオプションは、空の文字列を示します。 したがって、!と組み合わせて、空の文字列ではなくを要求しています。$GIVENNAME
:ここでは、空にしたくない文字列が変数に割り当てられた値であることを示しています$GIVENNAME
. このアプローチを選択した理由は、コマンドラインからスクリプトを呼び出すときに、この変数に3番目のパラメーターによって渡された値が割り当てられるためです。 スクリプトに渡すパラメーターが3つ未満の場合、コードには $ GIVENNAME に値を割り当てるための3番目のパラメーターがないため、空の文字列が割り当てられ、このテストは失敗します。
この最初のテストが成功したと仮定すると、次のテストに進みます if
ステートメントなど。 のいずれかが if
ステートメントはエラーを返します、 then
句はを呼び出します showhelp
関数とヘルプテキストが出力に表示されます。 基本的に、これは、これまでに作成したすべての関数を結合し、それらを正しい順序で実行するために必要な情報をbashに提供します。
これでスクリプトが完成しました。 スクリプトが、以下のセクションで作成した完全なスクリプトのように見えることを確認できます。
完全なスクリプト
作成した完成したバックアップスクリプトは次のようになります。
#!/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 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
スクリプトを確認したら、必ずファイルを保存して閉じてください(CTRL-x
, y
、 それから ENTER
)nanoを終了する前。
スクリプトのテスト
スクリプトの作成が完了したので、テストに進むことができます。 これにより、スクリプトが正しく記述されているかどうかがわかるだけでなく、スクリプトの使用を練習する機会も得られます。
このようなスクリプトをテストするときは、通常、ダミーファイルを使用することをお勧めします。 データを破棄または削除できないことはわかっていますが、重要でないファイルでテストして安全に再生するのが賢明です。 まず、を使用してディレクトリを作成します mkdir
指図:
- mkdir backupthis
次に、このディレクトリ内に2つの空のファイルを作成します。 touch
:
- sudo touch backupthis/file1.txt
- sudo touch backupthis/file2.txt
これで、をアップロードしてスクリプトをテストできます。 backupthis
ディレクトリとそのコンテンツをスペースに追加します。 これは、スクリプトを呼び出すために使用する必要がある形式です。
- sh bkupscript.sh ./backupthis name_of_your_space testrun
注 movetoSpace()
関数は自動的に先頭に追加します 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-210622-19_34_01.tar.gz' -> 's3://name_of_your_space /testrun-210622-19_34_01.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を使用したバックアップの自動化
バックアップスクリプトのテストに成功したら、次の設定を行うことができます。 cron
スクリプトを使用してSpaceへの定期的なバックアップを実行するジョブ。 このチュートリアルでは、バックアップスクリプトを毎分実行するように設定します。
まず、スクリプトを実行可能にする必要があります。
- chmod +x bkupscript.sh
スクリプトをコマンドとして実行できるようになったので、次のコマンドを編集できます。 crontab
毎分スクリプトを実行するファイル:
- 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
、すでに存在する値の下部に次の行を追加します。
* * * * * ~/bkupscript.sh ~/backupthis nameofyourspace cronupload
変更を保存するには、を押します CTRL-x
、 それから y
、 それから ENTER
.
1分ほどすると、Spaceのダッシュボードに新しいファイルが表示されます。
あなたが去るなら cron
変更を加えずにジョブを実行すると、毎分新しいファイルがスペースにコピーされます。 確認したら cron
正常に実行されています。自由に再構成してください crontab
希望の間隔でファイルをバックアップします。
これで、バックアップを定期的に圧縮してDigitalOceanSpaceに送信するスクリプトができました。
結論
このチュートリアルでは、bashスクリプトを使用して、重要なファイルの定期的にスケジュールされたオフサイトバックアップを作成する方法について説明しました。 crontab
、およびDigitalOceanSpaces。 このチュートリアルで紹介するスクリプトはデモンストレーションのみを目的としていますが、後で Jenkins 、などのCI/CDソリューションと統合できる本番環境対応バージョンを構築するための基盤として使用できます。 ]ドローン、または TravisCI。
CI / CDツールについて詳しく知りたい場合は、次のチュートリアルを読んでください。
- Centos7で継続的な開発統合のためにJenkinsを設定する方法。
- Ubuntu16.04でドローンを使用して継続的インテグレーションパイプラインを設定する方法。