翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS Batch を使用して Amazon RDS for PostgreSQL DBインスタンスのバックアップを自動化します
作成者: Kirankumar Chandrashekar (AWS)
環境:PoC またはパイロット | テクノロジー: コンテナとマイクロサービス、データベース、 DevOps | ワークロード:その他すべてのワークロード |
AWS サービス: Amazon RDS、AWS BatchAmazon CloudWatch、AWS LambdaAmazon S3 |
[概要]
PostgreSQL データベースのバックアップは重要なタスクで、通常 pg_dump ユーティリティ
注:手順は 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) 通知が開始されます。
前提条件と制限
前提条件
アクティブな AWS アカウント。
既存のマネージド型または非マネージド型のコンピューティング環境。詳細については、AWS Batch ドキュメントの マネージドコンピューティング環境とアンマネージドコンピューティング環境 を参照してください。
AWS コマンドラインインターフェイス (AWS CLI) バージョン 2 (インストールと設定)。
Amazon RDS for PostgreSQL DB インスタンス用 Amazon RDS for PostgreSQL DB インスタンス。
既存の S3 バケットを使用する
Docker
、Linux、macOS、または Windows にインストールして設定します。 Lambda でのコーディングに精通していること。
アーキテクチャ
テクノロジースタック
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 |
テーブルが作成されたことを確認します。 |
| クラウド管理者、DBA |
タスク | 説明 | 必要なスキル |
---|---|---|
SNS トピックを作成します。 | Amazon SNS コンソールを開き、トピックを選択し、 | クラウド管理者 |
AWS Batch の失敗したジョブイベントルールを作成します。 | Amazon CloudWatch コンソールを開き、イベント を選択し、ルールの作成 を選択します。詳細オプションを表示、編集 の順に選択します。ターゲットで処理するイベントを選択するパターンを構築,では、既存のテキストを追加情報セクションの「Failed job event」コードに置き換えます。このコードは、AWS Batch に CloudWatch イベントが発生したときに開始される | クラウド管理者 |
イベントルールターゲットを追加します。 | 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) | クラウド管理者 |
AWS Batch ジョブキューを設定します。 | AWS Batch コンソールで Job キューを選択し、キューの作成を選択します。AWS Batch がコンピューティング環境内のリソースで実行されるまでジョブを保存するジョブキューを作成します。重要:バックアップの詳細を DynamoDB インベントリテーブルに記録する AWS Batch のロジックを必ず記述してください。 | クラウド管理者 |
タスク | 説明 | 必要なスキル |
---|---|---|
Lambda 関数を作成して、タグを検索します。 | PostgreSQL DB インスタンス上のタグを検索し、バックアップ候補を識別する Lambda 関数を作成します。Lambda | 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 データベースからのバックアップが必要な場合は、 | クラウド管理者 |
バックアップ自動化を検証してください。 | バックアップの自動化を確認するには、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 "$@"