PostgresのS 3バックアップへのラムダでのDockerの使用



イントロ
あなたがどんな文脈についても気にしないならば、あなたはちょうどShip it セクション.
私は前に技術ブログの記事を書いたことがないが、私はどのように活用するnewly announced container image support (Dec 1, 2020) データベースをバックアップするために、私は維持しています、そして、それは私が望んでいたように簡単でありませんでした.
コスト削減策としての文脈™, 私はちょうど私のアプリケーションを実行しているいくつかのDockerコンテナでEC 1インスタンスを持っています.ごめんなさい.
あなたはまた、コストとRDS&スナップショットの複雑さを扱うような気がしないだけであなたのデータをバックアップする良い方法をしたい場合は、適切な場所にいる!

理由
  • 私は2を持っている-カウント';em -私は作ったアプリのための2ユーザーと私は彼らのデータは、データベースの信頼性よりも少ないephemeralであることを確認したいEC 2 -インスタンスのセットアップが示唆されます.私はこのスケールを私が持っているものよりずっと大きなデータベースに想像します、しかし、私は個人的にそれをテストしませんでした.最大タイムアウト(15分)、ラムダ実行の最大メモリ容量(10 GB)に対してアップしていると思います.
  • それは非常に安いです- S 3のために、S 3へのデータ転送が無料であるので、あなたが支払っているすべては記憶です、そして、あなたは非常にしばしばS 3から輸出してはいけません.そして、ラムダは非常に安いです-私は私のセットアップのためにそれを計算しました.そして、毎時1回、明らかに非常に少量のデータをバックアップしました.
  • それは非常に設定可能です-あなたが好きなように頻繁に、または頻繁にスナップショットをすることができますし、私はあなたには、特定のテーブルまたは何かをバックアップすることができますしたい場合は推測-私はスーパーのRDSのスナップショット機能に精通していない知っていない、多分彼らは似ている.
  • 私は非常に簡単にローカルのテスト/操作のために私の生産データを引くことができます!それは、ただ一人のDocker命令です!

  • ハイレベル
  • 実際のデータベースバックアップのために、私はGiThubhere .
  • そのスクリプトを実行するために、私はAWSラムダの新しい「コンテナイメージ」オプションを使用しています.私は、ビルのカスタムイメージからのAmazon's announcement 意味を作る方法で物事を構成するために.
  • cronのラムダをトリガーするためにAmazon EventBridge . 以前に聞いたことがありませんでしたが、「このラムダを1時間に走らせる」という規則を作るのは本当に簡単でした.
  • 私はSQLダンプファイルを14日の保持ポリシーでプライベートS 3バケットに保存しています.

  • 今行きましょう
    私の頭の中で私は“ああクール私はラムダでこのdockerfileをチャックすることができますし、いくつかの環境変数を使用して画像をコマンドを実行する1時間に1回、我々は黄金です.”
    しかしながら、それは本当にそのように働きません.
    ラムダは、あなたのDockerイメージのエントリーポイントが関数であることを必要とします.
    そのため、私の場合はスクリプトを実行することができます.backup.sh ) 以下のように:
    docker run schickling/postgres-backup-s3
    
    あなたがプログラムのためにDocker環境を設定していること(私の場合はPythonプログラム)で、entryPoint機能があるでしょう、それは、あなたが実行する必要があるものは何でも実行するでしょうbackup.sh ).
    そのようなentryPoint関数はどんな感じですか?かなり簡単です.
    import json
    import subprocess
    
    def handler(event, context):
        print("Received event: " + json.dumps(event, indent=2))
        subprocess.run("sh backup.sh".split(" "))
        print("Process complete.")
        return 0
    
    DockerFileのManglingは、Pythonイメージセクションのカスタムイメージを構築する例として提供しますAmazon's announcement , 似合うthe Dockerfile of the Postgres to S3 backup script もっと複雑な部分だった.最終的なdockerfileがどのように見えるかを見てみましょうhere .

    他のゴータ

    環境変数
    この全体の中で最も迷惑な部分は、いくつかを見つけることだったGitHub issue comment それは、ラムダは自動的にAWS_SESSION_TOKEN and AWS_SECURITY_TOKEN 環境変数によって、AWSクライアントのバックアップスクリプトの起動時にエラーを追跡することが困難になったことがわかります.
    An error occurred (InvalidToken) when calling the PutObject operation: The provided token is malformed or otherwise invalid.
    
    すべてのこの記事が達成される場合は、誰かがこのセクションには、そのエラーをgoogling後につまずく、私は驚くほど成功すると思います.
    とにかく、私はちょうど編集しなければならなかったbackup.sh これらの2行を追加し、不平を停止するファイル
    unset AWS_SECURITY_TOKEN
    unset AWS_SESSION_TOKEN
    

    ファイルへの書き込み
    一部の理由で、ラムダはそれが好きでありませんでしたbackup.sh スクリプトはファイルに書き込みます.運のない研究の数分後、私は変更することを決めた.
    echo "Creating dump of ${POSTGRES_DATABASE} database from ${POSTGRES_HOST}..."
    pg_dump $POSTGRES_HOST_OPTS $POSTGRES_DATABASE | gzip > dump.sql.gz
    
    echo "Uploading dump to $S3_BUCKET"
    cat dump.sql.gz | aws $AWS_ARGS s3 cp - s3://$S3_BUCKET/$S3_PREFIX/${POSTGRES_DATABASE}_$(date +"%Y-%m-%dT%H:%M:%SZ").sql.gz || exit 2
    
    です.
    echo "Creating dump of ${POSTGRES_DATABASE} database from ${POSTGRES_HOST} and uploading dump to ${S3_BUCKET}..."
    
    pg_dump $POSTGRES_HOST_OPTS $POSTGRES_DATABASE | gzip | aws $AWS_ARGS s3 cp - s3://$S3_BUCKET/$S3_PREFIX/${POSTGRES_DATABASE}_$(date +"%Y-%m-%dT%H:%M:%SZ").sql.gz || exit 2
    
    このあたりには良い方法があるかもしれないが、私は1つを見つけることができなかったので、ここでは、ちょうど離れて配管.

    ラムダタイムアウト
    私が持っていたLambaは3秒後にデフォルトでタイムアウトしました.ジャックの機能設定の一般的な設定を確認します.

    ローカルでテストする
    ローカルでこれをテストすることは本当に簡単ですbuilt in .
    イメージをビルドします
    docker build -t db-backup -f db-backup.Dockerfile .
    
    ターミナルウィンドウ1で実行します.
    docker run \
        -e POSTGRES_DATABASE=<POSTGRES_DATABASE>ms
        -e POSTGRES_HOST=<POSTGRES_HOST> \
        -e POSTGRES_PASSWORD=<POSTGRES_PASSWORD> \
        -e POSTGRES_USER=<POSTGRES_USER> \
        -e S3_ACCESS_KEY_ID=<S3_ACCESS_KEY_ID> \
        -e S3_BUCKET=<S3_BUCKET> \
        -e S3_REGION=<S3_REGION> \
        -e S3_PREFIX=<S3_PREFIX> \
        -e S3_SECRET_ACCESS_KEY=<S3_SECRET_ACCESS_KEY> \
        -p 9000:8080 \
        db-backup:latest
    
    ターミナルウィンドウ2でトリガします.
    curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
    

    船で運ぶ
    もちろん、右™ それは誰によって議論することができます出荷する方法が、最も簡単な方法はおそらくです:

  • コードをクローンします
    git clone https://github.com/cd17822/lambda-s3-pg-backup.git
    

  • Dockerイメージをビルドします
    docker build -t db-backup -f db-backup.Dockerfile
    

  • タグビルトイン画像をプライベートにプッシュするECR リポジトリ
    docker tag db-backup <AWS_ACCOUNT_ID>.dkr.ecr.<ECR_REGION>.amazonaws.com/<ECR_REPO_NAME>:latest
    

  • ECRにイメージをプッシュします.
    docker push <AWS_ACCOUNT_ID>.dkr.ecr.<ECR_REGION>.amazonaws.com/<ECR_REPO_NAME>:latest
    
  • プライベートのS 3のバケツを作成します.私たちはバックアップを保存します(これらのファイルを永遠に維持しない限り、私は保持ポリシーを設定することを勧めます).
  • 選択してラムダ関数を作成するCreate FunctionLambda Console .
  • 絹篩で篩うたようContainer Image , あなたが欲しいものは何でも名前をつけてくださいBrowse Images , 他のすべてのデフォルトと最後に選択として残すCreate Function .

  • 環境変数にスクロールし、次の環境変数の値を設定します.
    POSTGRES_DATABASE
    POSTGRES_HOST
    POSTGRES_PASSWORD
    POSTGRES_USER
    S3_ACCESS_KEY_ID
    S3_BUCKET
    S3_PREFIX
    S3_SECRET_ACCESS_KEY
    
  • さらに下にスクロールし、タイムアウトが5分のようなものにぶつかっているような一般的な設定を編集してください.
  • この時点で選択することができますTest 右上にチェックして、あなたの関数が動作していることを確認してください.
  • 最後に、選択してトリガを設定することができますAdd trigger デザイナーで.cronで動作する簡単なEventBridgeトリガーを設定することを勧めますcron(13 * * * *) ) または設定された周波数rate(1 hour) ).

  • バックアップの復元
    あなたは、AWSのコンピュータビジョンを使用して迷惑メールアドレスに泣いて自分の写真をメールで起動されたバックアップからデータベースを復元するためにラムダを設定することができますが、この記事のために私はそれを行うには簡単な方法が含まれていると考えた.
    同じスクリプトでは、バックアップスクリプトがあるrestore script . それは主催されますDockerHub それは本当に簡単にプルし、ローカルに実行する
    docker pull schickling/postgres-restore-s3
    docker run -e S3_ACCESS_KEY_ID=key -e S3_SECRET_ACCESS_KEY=secret -e S3_BUCKET=my-bucket -e S3_PREFIX=backup -e POSTGRES_DATABASE=dbname -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password -e POSTGRES_HOST=localhost schickling/postgres-restore-s3