

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

# AWS Batch を使用して Amazon RDS for PostgreSQL DBインスタンスのバックアップを自動化します
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch"></a>

*Amazon Web Services、Kirankumar Chandrashekar*

## 概要
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-summary"></a>

PostgreSQL データベースのバックアップは重要なタスクで、通常 [pg\$1dump ユーティリティ](https://www.postgresql.org/docs/current/app-pgdump.html) を使用して完了します。このユーティリティでは、デフォルトで COPY コマンドを使用して、PostgreSQL データベースのスキーマとデータダンプを作成します。ただし、複数の PostgreSQL データベースを定期的にバックアップする必要がある場合、このプロセスは繰り返しになる可能性があります。PostgreSQL データベースがクラウドでホストされている場合は、Amazon Relational Database Service (Amazon RDS) の PostgreSQL 用の Amazon Relational Database Service (Amazon RDS) により提供される [自動バックアップ](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html) 特徴量を活用することもできます。このパターンでは、pg\$1dump ユーティリティを使用して Amazon RDS for PostgreSQL インスタンスのの定期バックアップを自動化する方法を説明します。

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

時間ベースの Amazon CloudWatch Events イベントは、Amazon RDS 上の PostgreSQL DB [インスタンスのメタデータに適用された特定のバックアップタグ](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html) を検索する 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 Events イベントイベントによって Amazon Simple Notiﬁcation Service (Amazon SNS) 通知が開始されます。 

## 前提条件と制限事項
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-prereqs"></a>

**前提条件**
+ アクティブな AWS アカウント。
+ 既存のマネージド型または非マネージド型のコンピューティング環境。詳細については、AWS Batch ドキュメントの [マネージドコンピューティング環境とアンマネージドコンピューティング環境](https://docs.aws.amazon.com/batch/latest/userguide/compute_environments.html) を参照してください。 
+ [AWS コマンドラインインターフェイス (AWS CLI) バージョン 2](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-docker.html) (インストールと設定)。
+ Amazon RDS for PostgreSQL DB インスタンス用 Amazon RDS for PostgreSQL DB インスタンス。 
+ 既存の S3 バケットを使用する 
+ [Docker](https://www.docker.com/)、Linux、macOS、または Windows にインストールして設定します。
+ Lambda でのコーディングに精通していること。 

## アーキテクチャ
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-architecture"></a>

![\[pg_dump ユーティリティを使用して Amazon RDS for PostgreSQL DB インスタンスをバックアップするアーキテクチャ。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/3283f739-980b-43d4-aca0-9d77a2ce3b85/images/352e2eab-1b7d-44ec-840a-a772a175e873.png)


 

**テクノロジースタック**
+ Amazon CloudWatch Events
+ 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

## ツール
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-tools"></a>
+ [Athena で Amazon CloudWatch Events を使用する](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html) – CloudWatch Events は、AWS リソースでの変更を説明するシステムイベントのほぼリアルタイムのストリームを提供します。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) は、フルマネージド NoSQL データベースサービスであり、シームレスなスケーラビリティを備えた高速で予測可能なパフォーマンスを提供します。
+ 「[Amazon ECR](https://docs.aws.amazon.com/ecr/index.html)」— Amazon Elastic Container Registry (Amazon ECR) は、セキュリティ、スケーラビリティ、信頼性を備えた AWS マネージドコンテナイメージレジストリサービスです。
+ 「[Amazon RDS](https://docs.aws.amazon.com/rds/index.html)」— Amazon Relational Database Service (Amazon RDS) は、AWS クラウドでのリレーショナルデータベースのセットアップ、運用、スケールをより簡単にするウェブサービスです。
+ 「[Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)」— Amazon Simple Notiﬁcation Service (Amazon SNS) は、パブリッシャーからサブスクライバーへのメッセージ配信を提供するマネージドサービスです。
+ 「[Amazon S3](https://docs.aws.amazon.com/s3/index.html)」— Amazon Simple Storage Service (Amazon S3)は、インターネット用のストレージです。
+ [AWS Batch](https://docs.aws.amazon.com/batch/index.html) — AWS Batch では、AWS クラウドでバッチコンピューティングワークロードを実行できます。
+ [AWS KMS](https://docs.aws.amazon.com/kms/index.html) – AWS Key Management Service (AWS KMS)は、データの暗号化に使用される暗号化キーの作成と管理を容易にするマネージド型サービスです。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/index.html) はサーバーをプロビジョニングしたり管理しなくてもコードを実行できるコンピューティングサービスです。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/index.html) は、コード内のハードコードされた認証情報 (パスワードを含む) を Secrets Manager への API コールに置き換えて、シークレットをプログラムで取得する上で役立ちます。
+ [Docker](https://www.docker.com/) — Dockerを使用すると、開発者はあらゆるアプリケーションを軽量でポータブルな自給自足のコンテナとして簡単に梱包、出荷および実行できます。

Amazon RDS の PostgreSQL DB インスタンスには、[メタデータにタグが適用されている](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html) 必要があります。Lambda 関数はタグを検索してバックアップすべき DB インスタンスを識別します。通常は次のタグが使用されます。


| 
| 
| タグ | 説明 | 
| --- |--- |
| bkp:AutomatedDBDump = アクティブ | Amazon RDS DB インスタンスをバックアップの候補として識別します。 | 
| bkp:AutomatedBackupSecret = <secret\$1name > | Amazon RDS ログイン認証情報を含む Secrets Manager シークレットを識別します。 | 
| bkp:AutomatedDBDumpS3Bucket = <s3\$1bucket\$1name> | バックアップの送信先となる S3 バケットを識別します。 | 
| bkp:AutomatedDBDumpFrequencybkp:AutomatedDBDumpTime | データベースをバックアップする頻度と時間を特定してください。  | 
| bkp:pgdumpcommand = <pgdump\$1command> | バックアップが必要なデータベースを識別します。 | 

## エピック
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-epics"></a>

### DynamoDB でインベントリテーブルを作成する
<a name="create-an-inventory-table-in-dynamodb"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| DynamoDB でテーブルを作成します。 | AWS マネジメントコンソールにサインインし、 で Amazon DynamoDB コンソールを開きます。このストーリーやその他のストーリーに関するヘルプは「*関連リソース*」セクションを参照してください。 | クラウド管理者、DBA | 
| テーブルが作成されたことを確認します。 | `aws dynamodb describe-table --table-name <table-name> \| grep TableStatus` コマンドを実行します。テーブルが存在する場合、`"TableStatus": "ACTIVE",` コマンドは結果を返します。 | クラウド管理者、DBA | 

### AWS Batch で失敗したジョブイベントの SNS トピックを作成する
<a name="create-an-sns-topic-for-failed-job-events-in-aws-batch"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| SNS トピックを作成します。 | Amazon SNS コンソールを開き、**トピック**を選択し、`JobFailedAlert` 名前で SNS トピックを作成します。トピックにアクティブな E メールアドレスを登録し、E メールの受信トレイをチェックして、AWS Notifications からの SNS サブスクリプションメールを確認します。 | クラウド管理者 | 
| AWS Batch の失敗したジョブイベントルールを作成します。 | Amazon CloudWatchコンソールに移動し、**イベント**を選択して **ルールの作成** を選択します。**詳細オプションを表示**、**編集** の順に選択します。**ターゲットで処理するイベントを選択するパターンを構築**,では、既存のテキストを*追加情報*セクションの「Failed job event」コードに置き換えます。このコードでは、AWS Batch に `Failed` イベントが発生したときに開始される CloudWatch Events イベントルールを定義します。 | クラウド管理者 | 
| イベントルールターゲットを追加します。 | **[ターゲット]**で、**[ターゲットの追加]** を選択し、[`JobFailedAlert` SNS トピック] を選択します。CloudWatch Events ルールの作成と設定 | クラウド管理者 | 

### Docker イメージを Amazon ECR リポジトリにプッシュするには
<a name="build-a-docker-image-and-push-it-to-an-amazon-ecr-repository"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Amazon ECR リポジトリを作成します。 | Amazon ECR コンソールを開き、リポジトリを作成する AWS リージョンを選択します。**リポジトリの追加** を選択し、**リポジトリの作成** を選択します。要件に従ってリポジトリを構成します。 | クラウド管理者 | 
| Dockerfile を作成します。 | Docker にサインインし、*追加情報* セクションの [サンプル Dockerfile] と [サンプル entrypoint.sh ファイル] を使用して Dockerfile を作成します。 | DevOps エンジニア | 
| 次に、Docker イメージがAmazon ECR イメージリポジトリにプッシュされます。 | Docker イメージに Docker ファイルをビルドし、Amazon ECR リポジトリにプッシュします。このストーリーやその他のストーリーに関するヘルプは、*関連リソース*セクションを参照してください。 | DevOps エンジニア | 

### AWS Batch コンポーネントを作成する
<a name="create-the-aws-batch-components"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| AWS Batch ジョブ定義を作成する | AWS Batch コンソールを開き、Amazon ECR リポジトリのユニフォームリソース識別子 (URI) `Image` をプロパティとして含むジョブ定義を作成します。 | クラウド管理者 | 
| AWS Batch ジョブキューを設定します。 | AWS Batch コンソールで **Job キュー**を選択し、**キューの作成**を選択します。AWS Batch がコンピューティング環境内のリソースで実行されるまでジョブを保存するジョブキューを作成します。重要：バックアップの詳細を DynamoDB インベントリテーブルに記録する AWS Batch のロジックを必ず記述してください。 | クラウド管理者 | 

### Lambda 関数を作成して発行する
<a name="create-and-schedule-a-lambda-function"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Lambda 関数を作成して、タグを検索します。 | PostgreSQL DB インスタンス上のタグを検索し、バックアップ候補を識別する Lambda 関数を作成します。Lambda `bkp:AutomatedDBDump = Active` 関数がタグとその他の必要なタグをすべて識別できることを確認してください。重要：Lambda 関数は、AWS Batch ジョブキューにジョブを追加することも可能でなければなりません。 | DevOps エンジニア | 
| 時間ベースの CloudWatch イベントイベントを作成します。 | Amazon CloudWatch コンソールを開き、cron 式を使用して Lambda 関数を定期的に実行する CloudWatch イベントイベントを作成します。スケジュールされたイベントはすべて UTC\$10 のタイムゾーンを使用しています。 | クラウド管理者 | 

### バックアップ自動化のテスト
<a name="test-the-backup-automation"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 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 データベースからのバックアップが必要な場合は、`-d test:-d test1` を `bkp:pgdumpcommand` タグの値として使用します。`test` と `test1` はデータベース名です。コロン (：) の後にスペースがないことを確認します。 | クラウド管理者 | 
| バックアップ自動化を検証してください。 | バックアップの自動化を確認するには、Lambda 関数を呼び出すか、バックアップスケジュールの開始を待つことができます。バックアッププロセスが完了したら、DynamoDB インベントリテーブルに PostgreSQL DB インスタンスの有効なバックアップエントリがあることを確認します。一致すれば、バックアップ自動化プロセスは成功です。 | クラウド管理者 | 

## 関連リソース
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-resources"></a>

**DynamoDB でインベントリテーブルを作成する**
+ [Amazon DynamoDB テーブルの作成](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)

 

**AWS Batch で失敗したジョブイベントの SNS トピックを作成する**
+ [Amazon SNS トピックを作成します。](https://docs.aws.amazon.com/sns/latest/dg/sns-tutorial-create-topic.html)
+ [AWS Batch で失敗したジョブイベントの SNS アラートを送信する](https://docs.aws.amazon.com/batch/latest/userguide/batch_sns_tutorial.html)

 

**Docker イメージをを構築して、Amazon ECR リポジトリにプッシュする**
+ [Amazon ECR リポジトリの作成](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)    
+ [ドッカーファイルを作成し、Docker イメージを作成して Amazon ECR にプッシュする](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html)

 

**AWS Batch コンポーネントの作成**
+ [AWS Batchジョブ定義の作成](https://docs.aws.amazon.com/batch/latest/userguide/Batch_GetStarted.html#first-run-step-1)    
+ [コンピューティング環境と AWS Batch ジョブキューの設定](https://docs.aws.amazon.com/batch/latest/userguide/Batch_GetStarted.html#first-run-step-2)   
+ [AWS Batch でジョブキューを作成する](https://docs.aws.amazon.com/batch/latest/userguide/create-job-queue.html)

 

**Lambda 関数を作成する**
+ [Lambda 関数を作成してコードを記述する](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html)
+ [DynamoDB でLambda を使用する](https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html)

 

**CloudWatch イベントを作成する**
+ [時間ベースの CloudWatch イベントイベントを作成する](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-Scheduled-Rule.html)   
+ [クラウドウォッチイベントで cron エクスプレッションを使用する](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html)

 

**バックアップ自動化のテスト**
+ [Amazon KMS キーを作成する](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)    
+ [Secrets Manager シークレットを作成する](https://docs.aws.amazon.com/secretsmanager/latest/userguide/tutorials_basic.html)
+ [Amazon RDS インスタンスにタグを追加する](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html)

## 追加情報
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-additional"></a>

**失敗したジョブイベント：**

```
{
  "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 "$@"
```