DigitalOceanSpacesを使用してバックアップを自動化する方法

提供:Dev Guides
移動先:案内検索

序章

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

データのコピーをオフサイトの場所に送信するプロセスは、以前はロジスティクス上の大きな課題でした。 しかし、CrashplanやDropboxのようなクラウドベースのストレージサービスの出現と、 DigitalOcean Spaces のようなオブジェクトストレージソリューションの開発により、今でははるかに簡単なタスクになっています。 それにもかかわらず、ファイルのバックアップを忘れずにアップロードすることは、一部の人にとっては依然として障害となる可能性があります。

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

前提条件

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

シェルスクリプトとcronジョブスケジューラにある程度精通していることも役立つでしょう。 ガイダンスと追加のコンテキストについては、「シェルスクリプトの概要」および「VPSでCronとAnacronを使用してルーチンタスクをスケジュールする方法」を読むことを検討してください。

前提条件が整ったら、バックアップ自動化プロセスを開始する準備が整いました。

バックアップスクリプトの作成

バックアップファイルをオブジェクトストレージサービスに自動的かつ定期的にアップロードするために使用できるツールは多数あります。 ただし、これらは構成が難しい場合があり、柔軟性の点であまり提供されない場合があります。 シェルスクリプトを使用すると、オブジェクトストレージのバックアップを自動化するためのはるかに洗練された簡単なアプローチになります。

このチュートリアルでは、tarを使用してファイルまたはディレクトリのバックアップを作成する基本的なbashスクリプトを記述します。 次に、スクリプトはs3cmdコマンドラインユーティリティを使用して、そのバックアップをSpacesにアップロードします。

開始するには、Dropletにログインして、ホームフォルダに移動します。

cd ~

ホームフォルダに移動したら、nanoを使用して、スクリプトに書き込むことができる空のファイルを作成します。

nano bkupscript.sh

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

スクリプトの開始

この時点では、bkupscript.shは空のテキストファイルにすぎません。 コンピューターが実行可能ファイルをコマンドとして呼び出すには、スクリプトをハッシュバンで開始する必要があります。 hashbang は、スクリプトまたはデータファイルをコマンドとして実行できるようにするインタープリターディレクティブです。

この場合、ハッシュバンは次のようになります。

bkupscript.sh

#!/bin/bash

これをスクリプトの先頭に含めることで、ファイルのコマンドをbashで実行するようにシェルに指示しています。

変数の宣言

次に、正しく機能するために知っておく必要のある変数をスクリプトに指示します。 これらは、テキストファイルの上部にあるハッシュバンのすぐ下に追加できます。

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:この変数は、ファイルの宛先を表します。 この場合、これはバックアップをアップロードするスペースの名前です。 この名前は、$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 (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関数は次のようになります。

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 (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コマンドを追加して、スクリプトがファイルの収集を開始したことをユーザーに通知することから始めましょう。

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:これはtargzipを使用してファイルを圧縮するように指示します。
  • v:これはverboseオプションを意味し、tarに出力に詳細情報を表示するように指示します。
  • f:このフラグは、tarに次に示すファイル名でファイルを保存するように指示します。
  • $GIVENNAME-$DATETIME.tar.gz:スクリプトは、新しいファイル名を作成するために、最初に宣言したこれらの変数を呼び出します。 これは、$GIVENNAME変数と$DATETIME変数を組み合わせ、最後に.tar.gz拡張子を追加して、新しいファイル名を形成することによって行われます。
  • $SRC:この変数は、tarにバックアップするように指示しているソースファイルまたはフォルダーを表します。

これで、この関数は目的の処理を実行できるようになりますが、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コマンドが実行され、結果が返されるのを待ちます。 コマンドの結果が正の場合(つまり、正常に実行された場合)、thenelseの間の行が実行されます。 これらは:

  • スクリプトが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 put $GIVENNAME-$DATETIME.tar.gz s3://$DST
}

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

  • s3cmd:これにより、オブジェクトストレージバケットの管理に使用されるコマンドラインツールであるs3cmdが呼び出されます。
  • put:これはs3cmdがバケットにデータをアップロードするために使用するコマンドです。
  • $GIVENNAME-$DATETIME.tar.gz:これはスペースにアップロードされるバックアップの名前です。 これは、宣言した4番目と最初の変数で構成され、その後に.tar.gzが続き、以前のtarandzip()関数によって作成されます。
  • s3://$DST;:これはファイルをアップロードする場所です。 s3://は、オブジェクトの保存場所をオンラインで記述するために特に使用されるURIに似たスキーマですが、$DST;は、前に宣言した3番目の変数です。

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

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

bkupscript.sh

movetoSpace(){
    echo "\n##### MOVING TO SPACE #####\n"
    s3cmd put $GIVENNAME-$DATETIME.tar.gz s3://$DST
}

コマンドは成功または失敗するため(つまり、ファイルをSpaceにアップロードするか、しないか)、 [X216Xに保持されている2つの文字列のいずれかをエコーすることで、コマンドが機能したかどうかをユーザーに知らせることができます。 ]ステートメント、次のように:

bkupscript.sh

...
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プロセスが正常に完了すると、関数はそのことを示すメッセージ(thenステートメントの最初のecho文字列)を画面に出力し、0は、操作が完了したことを呼び出し元の関数に通知します。 プロセスが失敗した場合、then句はエラーメッセージ(2番目のecho文字列)を出力し、1を返すため、スクリプトの残りの部分はエラーが発生したことを認識します。 。

全体として、movetoSpace()関数は次のようになります。

bkupscript.sh

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ステートメントを追加することで、これを注文してエラーをキャッチできます。

bkupscript.sh

...
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に提供します。

これでスクリプトが完成しました。 スクリプトが、以下のセクションで作成した完全なスクリプトのように見えることを確認できます。

完全なスクリプト

作成した完成したバックアップスクリプトは次のようになります。

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 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-xyENTER)を保存して閉じてください。

スクリプトのテスト

スクリプトの作成が完了したので、テストに進むことができます。 これにより、スクリプトが正しく記述されているかどうかがわかるだけでなく、スクリプトの使用を練習する機会も得られます。

このようなスクリプトをテストするときは、通常、ダミーファイルを使用することをお勧めします。 データを破棄または削除できないことはわかっていますが、重要でないファイルでテストして安全に再生するのが賢明です。 まず、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

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を使用したバックアップの自動化

バックアップスクリプトのテストに成功したら、スクリプトを使用して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-xyENTERの順に押します。

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

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

これで、バックアップを定期的に圧縮してDigitalOceanSpaceに送信するスクリプトができました。

結論

このチュートリアルでは、bashスクリプト、crontab、およびDigitalOcean Spacesを使用して、重要なファイルの定期的にスケジュールされたオフサイトバックアップを作成する方法について説明しました。 このチュートリアルで紹介するスクリプトはデモンストレーションのみを目的としていますが、後で JenkinsなどのCI/CDソリューションと統合できる本番環境対応バージョンを構築するための基盤として使用できます。 ドローン]、または TravisCI

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

  • Centos7で継続的な開発統合のためにJenkinsを設定する方法。
  • Ubuntu16.04でドローンを使用して継続的インテグレーションパイプラインを設定する方法。