PostgresのS 3バックアップへのラムダでのDockerの使用
イントロ
あなたがどんな文脈についても気にしないならば、あなたはちょうどShip it セクション.
私は前に技術ブログの記事を書いたことがないが、私はどのように活用するnewly announced container image support (Dec 1, 2020) データベースをバックアップするために、私は維持しています、そして、それは私が望んでいたように簡単でありませんでした.
コスト削減策としての文脈™, 私はちょうど私のアプリケーションを実行しているいくつかのDockerコンテナでEC 1インスタンスを持っています.ごめんなさい.
あなたはまた、コストとRDS&スナップショットの複雑さを扱うような気がしないだけであなたのデータをバックアップする良い方法をしたい場合は、適切な場所にいる!
理由
ハイレベル
今行きましょう
私の頭の中で私は“ああクール私はラムダでこの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
Create Function
にLambda 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
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
Reference
この問題について(PostgresのS 3バックアップへのラムダでのDockerの使用), 我々は、より多くの情報をここで見つけました https://dev.to/cd17822/using-docker-on-lambda-for-postgres-to-s3-backups-28gnテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol