前書き

重要なデータのバックアップは、コンピューターインフラストラクチャを管理する上で不可欠な部分です。 バックアップの実行に関しては全員のニーズが異なりますが、オフサイトの場所でバックアップデータを維持することをお勧めします。

データのコピーをオフサイトの場所に送信するプロセスは、かつては大きな物流上の課題でした。 しかし、CrashplanやDropboxのようなクラウドベースのストレージサービスの出現、およびhttps://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-spaces[DigitalOceanなどのオブジェクトストレージソリューションの開発により、スペース]、今でははるかに簡単なタスクになっています。 それにも関わらず、ファイルをバックアップすることを忘れずにアップロードするのに時間をかけることは、一部の人にとっては障害となります。

このため、人々はさまざまなツールを使用して、重要なデータの定期的な自動バックアップを実行することを選択します。 このチュートリアルでは、データをDigitalOcean Spacesにすばやくアップロードするために使用できるコマンドラインツール `+ s3cmd `を中心にスクリプトを作成します。 次に、「 crontab +」を使用して定期的にバックアップスクリプトを呼び出し、ファイルをSpaceにアップロードします。

前提条件

このチュートリアルでは、次のものが必要です。

シェルスクリプトと `+ 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

これで、テキストエディタでバックアップスクリプトを書き始める準備ができました。 スクリプトを作成するときに、各部分を順番にセクションごとに説明します。

スクリプトの開始

この時点で、 `++`は空のテキストファイルにすぎません。 コンピューターがコマンドとして実行可能ファイルを呼び出すには、スクリプトをハッシュバンで開始する必要があります。 * 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 +:この変数は、結果のファイル名に付けるタイムスタンプを保持するため、スペースにバックアップされるすべてのファイルには一意の名前が付けられます。 このタイムスタンプは、 + date +`コマンドを呼び出して、年の最後の2桁( `+%y +)、月の2桁( +%m +)、2桁を表示するように出力をフォーマットすることによって作成されます日( +%d +)、時間( +%H +)、分( +%M +)および秒( +%S +)。

  • + SRC +:これは、バックアップするファイルまたはフォルダーの*ソース*パスです。 `+ $ 1 +`は、スクリプトに渡された最初のパラメーターからこの値を取得していることを示します。

  • + DST +:この変数はファイルの*宛先*を表します。 この場合、これはバックアップのアップロード先のスペースの名前です。 この名前は、 `+ $ 2 +`で示されるように、スクリプトに渡される2番目のパラメーターから取得されます。

  • + GIVENNAME +:この変数は、宛先ファイルのユーザーが選択した名前をホストします。 結果のファイル名は「+ GIVENNAME 」で始まり、「 DATETIME 」が連結されます。 この名前は、スクリプトに渡される3番目のパラメーター( ` $ 3 +`)に由来します。

ヘルプを提供する

スクリプトを作成する場合、ユーザーがスクリプトを使用しようとして失敗した場合のトラブルシューティングに役立つヒントや一般的なアドバイスを追加すると役立ちます。

バックアップスクリプトでは、変数の下に `+ showhelp()+`という関数を追加します。 これにより、スクリプトが失敗した場合のトラブルシューティングに役立つ一連のメッセージが出力されます。 bashに関数を追加すると、構文は次のようになります。

bkupscript.sh

...
showhelp(){

}

この関数は、画面上に一連の使用手順をエコーすることにより、ヘルプメッセージを提供します。 各命令は、二重引用符で囲まれた文字列として提示する必要があります。 以下の例では、一部の文字列の先頭または末尾に「+ \ t 」または「 \ n +」が書き込まれていることに気付くでしょう。 これらは、エスケープ文字です。これは、文字列がスクリプトの出力にどのように表示されるかについての特定の指示を提供します。

  • `+ \ t +`はタブスペースを示します

  • `+ \ n +`は改行を示します

中括弧の間に役立つような使用方法の詳細を自由に追加してください(すべての文字列の前に `+ 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 `コマンドの下に、ファイルを収集して1つの出力ファイルに圧縮する作業を行う ` tar +`コマンドを追加できます。

bkupscript.sh

tarandzip(){
   echo "\n##### Gathering files #####\n"

}

この `+ tar +`コマンドは、いくつかのオプションと変数を使用して呼び出されます。

  • + c ++:このフラグは、出力ファイルを圧縮するように `+ tar`に指示します。

  • + z +:これは、 `+ tar `に ` gzip +`を使用してファイルを圧縮するよう指示します。

  • + v +:これは `+ verbose `オプションを意味します。これは、出力に詳細情報を表示するように tar +に指示します。

  • + f +:このフラグは、次に示すファイル名でファイルを保存するように `+ tar +`に指示します。

  • + $ GIVENNAME- $ DATETIME.tar.gz +:スクリプトは、新しいファイル名を作成するために、最初に宣言したこれらの変数を呼び出します。 これを行うには、「+ $ GIVENNAME 」変数と「 $ DATETIME 」変数を組み合わせ、最後に「 .tar.gz +」拡張子を追加して新しいファイル名を作成します。

  • + $ SRC +:この変数は、 `+ tar +`にバックアップするよう指示している_source_ファイルまたはフォルダーを表します。

この関数は、必要な処理を実行できるはずですが、スクリプトの動作に関する追加情報をユーザーに提供するために、さらにいくつかの `+ echo +`呼び出しを追加できます。 これは、次のようないくつかの条件ステートメントを追加することで実行できます。

bkupscript.sh

    tar -czvf $GIVENNAME-$DATETIME.tar.gz $SRC;

`+ 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`コマンドを使用して、スペースにファイルを転送するバックアップスクリプトを取得できます。 `+ tarandzip `の場合と同様に、いくつかの文字列を ` echo `し、 ` if / then / else +`ステートメントを使用して、実行中のスクリプトの動作をユーザーが把握できるようにします。

まず、関数を宣言します。 もう一度これをシンプルにして、 `+ movetoSpace()+`という名前を付けましょう。

bkupscript.sh

...
movetoSpace(){

}

これで、 `+ s3cmd +`と以前に宣言した変数を使用して、バックアップファイルをSpaceにプッシュするコマンドを作成できます。

bkupscript.sh

movetoSpace(){

}

このコマンドの各部分の意味は次のとおりです。

  • +〜/ s3cmd-2.0.1 / s3cmd +:これは、https://www.digitalocean.com/community/tutorials/how-to-manage-digitalocean-spaces-with-s3cmd [コマンドである `+ s3cmd +`を呼び出しますオブジェクトストレージバケットの管理に使用されるラインツール]。

  • + put +:これは、バケットにデータをアップロードするために `+ s3cmd +`によって使用されるコマンドです。

  • + $ GIVENNAME- $ DATETIME.tar.gz +:これは、スペースにアップロードされるバックアップの名前です。 これは、宣言した4番目と1番目の変数で構成され、その後に `+ .tar.gz `が続き、以前の ` tarandzip()+`関数によって作成されます。

  • + s3:// $ DST; +:これは、ファイルをアップロードする場所です。 `+ s3:// `は、オブジェクトストレージの場所をオンラインで記述するために特に使用されるURIに似たスキーマであり、 ` $ DST; +`は以前に宣言した3番目の変数です。

アーカイブファイルをスペースにアップロードできる機能が追加されました。 ただし、そのステータスについてはユーザーに通知しません。 これを変更するには、コマンドの前に文字列をエコーし​​て、ユーザーに開始したことを通知し、関数が完了した後に、成功したかどうかを知らせます。

プロセスが開始されたことをユーザーに通知することから始めましょう。

bkupscript.sh

movetoSpace(){

   ~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST
}

コマンドは成功または失敗のいずれか(つまり、ファイルをスペースにアップロードするかしないかのいずれか)であるため、「+ if / then / else + `ステートメント、次のように:

bkupscript.sh

...
~/s3cmd-2.0.1/s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST

この条件ステートメントは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_を示します。 したがって、!_と組み合わせて、空の文字列ではなく_を求めています。

  • + $ 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

次に、 `+ touch +`を使用して、このディレクトリ内に2つの空のファイルを作成します。

sudo touch
sudo touch

`++`ディレクトリとそのコンテンツをSpaceにアップロードすることで、スクリプトをテストできます。 これは、スクリプトを呼び出すために使用する必要がある形式です。

sh bkupscript.sh

上記のコマンドにより、スクリプトが動作し、次のような出力が表示されます。

Output
##### Gathering files #####

./backupthis/
./backupthis/file1.txt
./backupthis/file2.txt

##### Done gathering files #####


##### MOVING TO SPACE #####

upload: '.tar.gz' -> 's3:// /.tar.gz'  [1 of 1]
162 of 162   100% in    8s    19.81 B/s  done

##### Done moving files to s3:// #####

エラーが発生した場合は、スクリプトを確認して、例と一致することを確認してください。 また、 `+ s3cmd +`のインストールが適切に構成されていることと、使用しているアクセスキーとシークレットキーの両方が正しいことを確認してください。

Crontabを使用したバックアップの自動化

バックアップスクリプトのテストに成功したら、スクリプトを使用してスペースへの定期的なバックアップを実行する「+ cron +」ジョブを設定できます。 このチュートリアルの目的のために、バックアップスクリプトを毎分実行するように設定します。

まず、スクリプトを実行可能にする必要があります。

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 +`に入ったら、すでに存在する値の下部に次の行を追加します。

/tmp/crontab.example/crontab

* * * * * ~/bkupscript.sh

変更を保存するには、「+ CTRL-x 」、「 y 」、「 ENTER +」の順に押します。

1分ほどすると、Spaceのダッシュボードに新しいファイルが表示されます!

変更せずに「+ cron 」ジョブを実行したままにすると、毎分新しいファイルがスペースにコピーされます。 「 cron 」が正常に実行されていることを確認したら、お望みの間隔でファイルをバックアップするように「 crontab +」を自由に再構成してください。

これで、バックアップを定期的に圧縮してDigitalOcean Spaceに送信するスクリプトが完成しました!

結論

このチュートリアルでは、bashスクリプト、 + crontab +、およびDigitalOcean Spacesを使用して、重要なファイルの定期的なオフサイトバックアップを作成する方法について説明しました。 このチュートリアルで紹介するスクリプトはデモンストレーションのみを目的としていますが、https://jenkins.io/ [Jenkins ]、http://try.drone.io/ [Drone]、またはhttps://travis-ci.org/[Travis CI]。

CI / CDツールについて詳しく知りたい場合は、次のチュートリアルを読んでください。