AWS Batch を使用して Amazon RDS for PostgreSQL DBインスタンスのバックアップを自動化します - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS Batch を使用して Amazon RDS for PostgreSQL DBインスタンスのバックアップを自動化します

作成者: Kirankumar Chandrashekar (AWS)

環境:PoC またはパイロット

テクノロジー: コンテナとマイクロサービス、データベース、 DevOps

ワークロード:その他すべてのワークロード

AWS サービス: Amazon RDS、AWS BatchAmazon CloudWatch、AWS LambdaAmazon S3

[概要]

PostgreSQL データベースのバックアップは重要なタスクで、通常 pg_dump ユーティリティ を使用して完了します。このユーティリティでは、デフォルトで COPY コマンドを使用して、PostgreSQL データベースのスキーマとデータダンプを作成します。ただし、複数の PostgreSQL データベースを定期的にバックアップする必要がある場合、このプロセスは繰り返しになる可能性があります。PostgreSQL データベースがクラウドでホストされている場合は、Amazon Relational Database Service (Amazon RDS) の PostgreSQL 用の Amazon Relational Database Service (Amazon RDS) により提供される 自動バックアップ 特徴量を活用することもできます。このパターンでは、pg_dump ユーティリティを使用して Amazon RDS for PostgreSQL インスタンスのの定期バックアップを自動化する方法を説明します。

注:手順は Amazon RDS を使用していることを前提としています。ただし、この方法は Amazon RDS の外部でホストされている PostgreSQL データベースにも使用できます。バックアップを取るには、AWS Lambda 関数がデータベースにアクセスできる必要があります。

時間ベースの Amazon CloudWatch Events イベントは、Amazon RDS 上の PostgreSQL DB インスタンスのメタデータに適用される特定のバックアップタグを検索する Lambda 関数を開始します。PostgreSQL DB インスタンスに bkp:AutomatedDBDump = Active タグとその他の必要なバックアップタグがある場合、Lambda 関数はデータベースバックアップごとに個別のジョブを AWS Batch に送信します。 

AWS Batch はこれらのジョブを処理し、Amazon Simple Storage Service (Amazon S3) バケットにバックアップデータをアップロードします。このパターンでは、Dockerfile と entrypoint.sh ファイルを使用して、AWS Batch ジョブでバックアップを作成するために使用される Docker コンテナイメージを構築します。バックアッププロセスが完了すると、AWS Batch はバックアップの詳細を Amazon DynamoDB のインベントリテーブルに記録します。追加の保護として、AWS Batch でジョブが失敗すると、 CloudWatch イベントイベントによって Amazon Simple Notification Service (Amazon SNS) 通知が開始されます。 

前提条件と制限

前提条件

アーキテクチャ

pg_dump ユーティリティを使用して Amazon RDS for PostgreSQL DB インスタンスをバックアップするアーキテクチャ。

テクノロジースタック

  • Amazon CloudWatch イベント

  • Amazon DynamoDB

  • Amazon Elastic Container Registry (Amazon ECR)

  • Amazon RDS

  • Amazon SNS

  • Amazon S3

  • AWS Batch

  • AWS Key Management Service (AWS KMS)

  • AWS Lambda

  • AWS Secrets Manager

  • Docker

ツール

  • Amazon CloudWatch Events – CloudWatch イベントは、AWS リソースの変更を記述するシステムイベントのほぼリアルタイムのストリームを提供します。

  • Amazon DynamoDB は、フルマネージド NoSQL データベースサービスであり、シームレスなスケーラビリティを備えた高速で予測可能なパフォーマンスを提供します。

  • Amazon ECR」— Amazon Elastic Container Registry (Amazon ECR) は、セキュリティ、スケーラビリティ、信頼性を備えた AWS マネージドコンテナイメージレジストリサービスです。

  • Amazon RDS」— Amazon Relational Database Service (Amazon RDS) は、AWS クラウドでのリレーショナルデータベースのセットアップ、運用、スケールをより簡単にするウェブサービスです。

  • Amazon SNS」— Amazon Simple Notification Service (Amazon SNS) は、パブリッシャーからサブスクライバーへのメッセージ配信を提供するマネージドサービスです。

  • Amazon S3」— Amazon Simple Storage Service (Amazon S3)は、インターネット用のストレージです。

  • AWS Batch — AWS Batch では、AWS クラウドでバッチコンピューティングワークロードを実行できます。

  • AWS KMS – AWS Key Management Service (AWS KMS)は、データの暗号化に使用される暗号化キーの作成と管理を容易にするマネージド型サービスです。

  • AWS Lambda はサーバーをプロビジョニングしたり管理しなくてもコードを実行できるコンピューティングサービスです。

  • AWS Secrets Manager は、コード内のハードコードされた認証情報 (パスワードを含む) を Secrets Manager への API コールに置き換えて、シークレットをプログラムで取得する上で役立ちます。

  • Docker — Dockerを使用すると、開発者はあらゆるアプリケーションを軽量でポータブルな自給自足のコンテナとして簡単に梱包、出荷および実行できます。

Amazon RDS の PostgreSQL DB インスタンスには、メタデータにタグが適用されている 必要があります。Lambda 関数はタグを検索してバックアップすべき DB インスタンスを識別します。通常は次のタグが使用されます。

タグ

説明

bkp:AutomatedDBDump = アクティブ

Amazon RDS DB インスタンスをバックアップの候補として識別します。

bkp:AutomatedBackupSecret = <secret_name >

Amazon RDS ログイン認証情報を含む Secrets Manager シークレットを識別します。

bkp:AutomatedDBDumpS3Bucket = <s3_bucket_name>

バックアップの送信先となる S3 バケットを識別します。

bkp:AutomatedDBDumpFrequency

bkp:AutomatedDBDumpTime

データベースをバックアップする頻度と時間を特定してください。 

bkp:pgdumpcommand = <pgdump_command>

バックアップが必要なデータベースを識別します。

エピック

タスク説明必要なスキル

DynamoDB でテーブルを作成します。

AWS マネジメントコンソールにサインインし、 で Amazon DynamoDB コンソールを開きます。このストーリーやその他のストーリーに関するヘルプは、「関連リソース」セクションを参照してください。

クラウド管理者、DBA

テーブルが作成されたことを確認します。

aws dynamodb describe-table --table-name <table-name> | grep TableStatus コマンドを実行します。テーブルが存在する場合、"TableStatus": "ACTIVE", コマンドは結果を返します。

クラウド管理者、DBA
タスク説明必要なスキル

SNS トピックを作成します。

Amazon SNS コンソールを開き、トピックを選択し、JobFailedAlert 名前で SNS トピックを作成します。トピックにアクティブな E メールアドレスを登録し、E メールの受信トレイをチェックして、AWS Notifications からの SNS サブスクリプションメールを確認します。

クラウド管理者

AWS Batch の失敗したジョブイベントルールを作成します。

Amazon CloudWatch コンソールを開き、イベント を選択し、ルールの作成 を選択します。詳細オプションを表示編集 の順に選択します。ターゲットで処理するイベントを選択するパターンを構築,では、既存のテキストを追加情報セクションの「Failed job event」コードに置き換えます。このコードは、AWS Batch に CloudWatch イベントが発生したときに開始されるFailedイベントルールを定義します。

クラウド管理者

イベントルールターゲットを追加します。

tターゲット]で、ターゲットの追加 を選択し、「SNS topic」 を選択します。CloudWatch Events ルールの作成と設定

クラウド管理者
タスク説明必要なスキル

Amazon ECR リポジトリを作成します。

Amazon ECR コンソールを開き、リポジトリを作成する AWS リージョンを選択します。リポジトリの追加 を選択し、リポジトリの作成 を選択します。要件に従ってリポジトリを構成します。

クラウド管理者

Dockerfile を作成します。

Docker にサインインし、追加情報 セクションの「サンプル Dockerfile」と「サンプル entrypoint.sh ファイル」を使用して Dockerfile を作成します。

DevOps エンジニア

次に、Docker イメージがAmazon ECR イメージリポジトリにプッシュされます。

Docker イメージに Docker ファイルをビルドし、Amazon ECR リポジトリにプッシュします。このストーリーやその他のストーリーに関するヘルプは、関連リソースセクションを参照してください。

DevOps エンジニア
タスク説明必要なスキル

AWS Batch ジョブ定義を作成する

AWS Batch コンソールを開き、Amazon ECR リポジトリのユニフォームリソース識別子 (URI) Image をプロパティとして含むジョブ定義を作成します。

クラウド管理者

AWS Batch ジョブキューを設定します。

AWS Batch コンソールで Job キューを選択し、キューの作成を選択します。AWS Batch がコンピューティング環境内のリソースで実行されるまでジョブを保存するジョブキューを作成します。重要:バックアップの詳細を DynamoDB インベントリテーブルに記録する AWS Batch のロジックを必ず記述してください。

クラウド管理者
タスク説明必要なスキル

Lambda 関数を作成して、タグを検索します。

PostgreSQL DB インスタンス上のタグを検索し、バックアップ候補を識別する Lambda 関数を作成します。Lambda bkp:AutomatedDBDump = Active 関数がタグとその他の必要なタグをすべて識別できることを確認してください。重要:Lambda 関数は、AWS Batch ジョブキューにジョブを追加することも可能でなければなりません。

DevOps エンジニア

時間ベースの CloudWatch イベントイベントを作成します。

Amazon CloudWatch コンソールを開き、cron 式を使用して Lambda 関数を定期的に実行する CloudWatch イベントイベントを作成します。スケジュールされたイベントはすべて UTC+0 のタイムゾーンを使用しています。

クラウド管理者
タスク説明必要なスキル

Amazon KMS キーを作成します。

Amazon KMS コンソールを開き、AWS Secrets Manager に保存されている Amazon RDS 認証情報を暗号化するために使用できる KMS キーを作成します。

クラウド管理者

AWS Secrets Manager シークレットを作成する

AWS Secrets Manager コンソールを開き、Amazon RDS for PostgreSQL データベースの認証情報をシークレットとして保存します。

クラウド管理者

必要なタグを PostgreSQL DB インスタンスに追加します。

Amazon RDS コンソールを開き、自動的にバックアップしたい PostgreSQL DB インスタンスにタグを追加します。ツールセクションの表にあるタグを使用できます。同じ Amazon RDS インスタンス内の複数の PostgreSQL データベースからのバックアップが必要な場合は、bkp:pgdumpcommand タグの -d test:-d test1 値としてを使用してください。重要: testtest1 はデータベース名です。コロン (:) の後にスペースがないことを確認します。

クラウド管理者

バックアップ自動化を検証してください。

バックアップの自動化を確認するには、Lambda 関数を呼び出すか、バックアップスケジュールの開始を待つことができます。バックアッププロセスが完了したら、DynamoDB インベントリテーブルに PostgreSQL DB インスタンスの有効なバックアップエントリがあることを確認します。一致すれば、バックアップ自動化プロセスは成功です。

クラウド管理者

関連リソース

DynamoDB でインベントリテーブルを作成する

 

AWS Batch で失敗したジョブイベントの SNS トピックを作成する

 

Docker イメージをを構築して、Amazon ECR リポジトリにプッシュする

 

AWS Batch コンポーネントの作成

 

Lambda 関数を作成する

 

CloudWatch イベントイベントを作成する

 

バックアップ自動化のテスト

追加情報

失敗したジョブイベント:

{ "detail-type": [ "Batch Job State Change" ], "source": [ "aws.batch" ], "detail": { "status": [ "FAILED" ] } }

サンプル Dockerfile:

FROM alpine:latest RUN apk --update add py-pip postgresql-client jq bash && \ pip install awscli && \ rm -rf /var/cache/apk/* ADD entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"]

サンプル entrypoint.sh ファイル:

#!/bin/bash set -e DATETIME=`date +"%Y-%m-%d_%H_%M"` FILENAME=RDS_PostGres_dump_${RDS_INSTANCE_NAME} FILE=${FILENAME}_${DATETIME} aws configure --profile new-profile set role_arn arn:aws:iam::${TargetAccountId}:role/${TargetAccountRoleName} aws configure --profile new-profile set credential_source EcsContainer echo "Central Account access provider IAM role is: " aws sts get-caller-identity echo "Target Customer Account access provider IAM role is: " aws sts get-caller-identity --profile new-profile securestring=$(aws secretsmanager get-secret-value --secret-id $SECRETID --output json --query 'SecretString' --region=$REGION --profile new-profile) if [[ ${securestring} ]]; then echo "successfully accessed secrets manager and got the credentials" export PGPASSWORD=$(echo $securestring | jq --raw-output | jq -r '.DB_PASSWORD') PGSQL_USER=$(echo $securestring | jq --raw-output | jq -r '.DB_USERNAME') echo "Executing pg_dump for the PostGres endpoint ${PGSQL_HOST}" # pg_dump -h $PGSQL_HOST -U $PGSQL_USER -n dms_sample | gzip -9 -c | aws s3 cp - --region=$REGION --profile new-profile s3://$BUCKET/$FILE # in="-n public:-n private" IFS=':' list=($EXECUTE_COMMAND); for command in "${list[@]}"; do echo $command; pg_dump -h $PGSQL_HOST -U $PGSQL_USER ${command} | gzip -9 -c | aws s3 cp - --region=$REGION --profile new-profile s3://${BUCKET}/${FILE}-${command}".sql.gz" echo $?; if [[ $? -ne 0 ]]; then echo "Error occurred in database backup process. Exiting now....." exit 1 else echo "Postgresql dump was successfully taken for the RDS endpoint ${PGSQL_HOST} and is uploaded to the following S3 location s3://${BUCKET}/${FILE}-${command}.sql.gz" #write the details into the inventory table in central account echo "Writing to DynamoDB inventory table" aws dynamodb put-item --table-name ${RDS_POSTGRES_DUMP_INVENTORY_TABLE} --region=$REGION --item '{ "accountId": { "S": "'"${TargetAccountId}"'" }, "dumpFileUrl": {"S": "'"s3://${BUCKET}/${FILE}-${command}.sql.gz"'" }, "DumpAvailableTime": {"S": "'"`date +"%Y-%m-%d::%H::%M::%S"` UTC"'"}}' echo $? if [[ $? -ne 0 ]]; then echo "Error occurred while putting item to DynamoDb Inventory Table. Exiting now....." exit 1 else echo "Successfully written to DynamoDb Inventory Table ${RDS_POSTGRES_DUMP_INVENTORY_TABLE}" fi fi done; else echo "Something went wrong {$?}" exit 1 fi exec "$@"