

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Mengotomatiskan pencadangan untuk Amazon RDS untuk instans DB Amazon RDS for PostgreSQL dengan menggunakan AWS Batch
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch"></a>

*Kirankumar Chandrashekar, Amazon Web Services*

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

Mencadangkan database PostgreSQL Anda adalah tugas penting dan biasanya dapat diselesaikan dengan utilitas [pg\$1dump, yang menggunakan perintah COPY secara default untuk membuat skema dan dump](https://www.postgresql.org/docs/current/app-pgdump.html) data dari database PostgreSQL. Namun, proses ini dapat menjadi berulang jika Anda memerlukan backup reguler untuk beberapa database PostgreSQL. Jika database PostgreSQL Anda di-host di cloud, Anda juga dapat memanfaatkan fitur pencadangan [otomatis](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html) yang disediakan oleh Amazon Relational Database Service (Amazon RDS) untuk PostgreSQL juga. Pola ini menjelaskan cara mengotomatiskan backup reguler untuk Amazon RDS untuk instans DB Amazon RDS for PostgreSQL menggunakan utilitas pg\$1dump.

Catatan: Instruksi mengasumsikan bahwa Anda menggunakan Amazon RDS. Namun, Anda juga dapat menggunakan pendekatan ini untuk database PostgreSQL yang di-host di luar Amazon RDS. Untuk mengambil cadangan, fungsi AWS Lambda harus dapat mengakses database Anda.

 CloudWatch Acara Amazon Events berbasis waktu memulai fungsi Lambda yang mencari [tag cadangan tertentu yang diterapkan ke metadata](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html) instans PostgreSQL DB di Amazon RDS. Jika instans PostgreSQL DB memiliki tag **DBDump BKP:Automated = Active** dan tag cadangan lain yang diperlukan, fungsi Lambda mengirimkan tugas individual untuk setiap backup database ke AWS Batch. 

AWS Batch memproses pekerjaan ini dan mengunggah data cadangan ke bucket Amazon Simple Storage Service (Amazon S3). Pola ini menggunakan Dockerfile dan file entrypoint.sh untuk membuat image container Docker yang digunakan untuk membuat backup dalam pekerjaan AWS Batch. Setelah proses pencadangan selesai, AWS Batch mencatat detail pencadangan ke tabel inventaris di Amazon DynamoDB. Sebagai perlindungan tambahan, CloudWatch peristiwa Acara memulai notifikasi Amazon Simple Notification Service (Amazon SNS) jika pekerjaan gagal di AWS Batch. 

## Prasyarat dan batasan
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-prereqs"></a>

**Prasyarat**
+ Akun AWS aktif.
+ Lingkungan komputasi terkelola atau tidak terkelola yang ada. Untuk informasi selengkapnya, lihat [Lingkungan komputasi terkelola dan tidak](https://docs.aws.amazon.com/batch/latest/userguide/compute_environments.html) terkelola dalam dokumentasi AWS Batch. 
+ [AWS Command Line Interface (CLI) versi 2 image Docker](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-docker.html), diinstal dan dikonfigurasi.
+ Amazon RDS yang ada untuk instans DB Amazon RDS for PostgreSQL.  
+ Bucket S3 yang ada. 
+ [Docker](https://www.docker.com/), diinstal dan dikonfigurasi di Linux, macOS, atau Windows.
+ Keakraban dengan pengkodean di Lambda. 

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

![\[Arsitektur untuk mencadangkan Amazon RDS untuk instans DB Amazon RDS for PostgreSQL dengan menggunakan utilitas pg_dump.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/3283f739-980b-43d4-aca0-9d77a2ce3b85/images/352e2eab-1b7d-44ec-840a-a772a175e873.png)


 

**Tumpukan teknologi**
+  CloudWatch Acara Amazon
+ 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

## Alat
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-tools"></a>
+ [ CloudWatch Acara Amazon](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html) — CloudWatch Acara menghadirkan aliran peristiwa sistem yang mendekati waktu nyata yang menjelaskan perubahan sumber daya AWS.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) - DynamoDB adalah layanan database NoSQL yang dikelola sepenuhnya yang memberikan kinerja yang cepat dan dapat diprediksi dengan skalabilitas yang mulus.
+ [Amazon ECR](https://docs.aws.amazon.com/ecr/index.html) — Amazon Elastic Container Registry (Amazon ECR) adalah layanan registri image container AWS terkelola yang aman, terukur, dan andal.
+ [Amazon RDS](https://docs.aws.amazon.com/rds/index.html) - Amazon Relational Database Service (Amazon RDS) adalah layanan web yang memudahkan pengaturan, pengoperasian, dan skala database relasional di AWS Cloud.
+ [Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) - Amazon Simple Notification Service (Amazon SNS) adalah layanan terkelola yang menyediakan pengiriman pesan dari penerbit ke pelanggan.
+ [Amazon S3](https://docs.aws.amazon.com/s3/index.html) - Amazon Simple Storage Service (Amazon S3) Simple Storage Service adalah penyimpanan untuk internet.
+ [AWS Batch](https://docs.aws.amazon.com/batch/index.html) — AWS Batch membantu Anda menjalankan beban kerja komputasi batch di AWS Cloud.
+ [AWS KMS](https://docs.aws.amazon.com/kms/index.html) — AWS Key Management Service (AWS KMS) adalah layanan terkelola yang memudahkan Anda membuat dan mengontrol kunci enkripsi yang digunakan untuk mengenkripsi data Anda.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/index.html) — Lambda adalah layanan komputasi yang membantu Anda menjalankan kode tanpa menyediakan atau mengelola server.
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/index.html) — Secrets Manager membantu Anda mengganti kredensi hardcode dalam kode Anda, termasuk kata sandi, dengan panggilan API ke Secrets Manager untuk mengambil rahasia secara terprogram.
+ [Docker](https://www.docker.com/) — Docker membantu pengembang dengan mudah mengemas, mengirim, dan menjalankan aplikasi apa pun sebagai wadah yang ringan, portabel, dan mandiri.

[Instans PostgreSQL DB Anda di Amazon RDS harus memiliki tag yang diterapkan ke metadatanya.](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html) Fungsi Lambda mencari tag untuk mengidentifikasi instance DB yang harus dicadangkan, dan tag berikut biasanya digunakan.


| 
| 
| Tag | Deskripsi | 
| --- |--- |
| BKP:Otomatis = Aktif DBDump  | Mengidentifikasi instans Amazon RDS DB sebagai kandidat untuk backup. | 
| bkp: = AutomatedBackupSecret <secret\$1name > | Mengidentifikasi rahasia Secrets Manager yang berisi kredensyal login Amazon RDS. | 
| BKP: S3Bucket otomatis DBDump = <s3\$1bucket\$1name> | Mengidentifikasi bucket S3 untuk mengirim cadangan ke. | 
| DBDumpBKP: Frekuensi OtomatisDBDumpBKP: Waktu Otomatis | Identifikasi frekuensi dan waktu kapan database harus dicadangkan.  | 
| bkp:pgdumpcommand = <pgdump\$1command> | Mengidentifikasi database yang backup perlu diambil. | 

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

### Buat tabel inventaris di DynamoDB
<a name="create-an-inventory-table-in-dynamodb"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat tabel di DynamoDB. | Masuk ke AWS Management Console, buka konsol Amazon DynamoDB, dan buat tabel. Untuk bantuan tentang ini dan cerita lainnya, lihat bagian *Sumber daya terkait*. | Administrator awan, Administrator basis data | 
| Konfirmasikan bahwa tabel telah dibuat.  | Jalankan perintah `aws dynamodb describe-table --table-name <table-name> \| grep TableStatus`. Jika tabel ada, perintah akan mengembalikan `"TableStatus": "ACTIVE",` hasilnya. | Administrator awan, Administrator basis data | 

### Membuat topik SNS untuk peristiwa pekerjaan yang gagal di AWS Batch
<a name="create-an-sns-topic-for-failed-job-events-in-aws-batch"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Membuat sebuah topik SNS. | Buka konsol Amazon SNS, pilih **Topik, dan buat topik** SNS dengan namanya. `JobFailedAlert` Berlangganan alamat email aktif ke topik tersebut, dan periksa kotak masuk email Anda untuk mengonfirmasi email langganan SNS dari Pemberitahuan AWS. | Administrator awan | 
| Buat aturan peristiwa pekerjaan yang gagal untuk AWS Batch.  | Buka CloudWatch konsol Amazon, pilih **Acara**, lalu pilih **Buat aturan**. Pilih **Tampilkan opsi lanjutan**, dan pilih **Edit**. Untuk **Membangun pola yang memilih peristiwa untuk diproses oleh target Anda**, ganti teks yang ada dengan kode “Peristiwa pekerjaan gagal” dari bagian *Informasi tambahan*. Kode ini mendefinisikan aturan CloudWatch Peristiwa yang dimulai saat AWS Batch memiliki `Failed` peristiwa. | Administrator awan | 
| Tambahkan target aturan acara.  | Di **Target**, pilih **Tambahkan target**, dan pilih topik `JobFailedAlert` SNS. Konfigurasikan detail yang tersisa dan buat aturan Cloudwatch Events. | Administrator awan | 

### Buat image Docker dan dorong ke repositori Amazon ECR
<a name="build-a-docker-image-and-push-it-to-an-amazon-ecr-repository"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat repositori Amazon ECR. | Buka konsol Amazon ECR dan pilih Wilayah AWS tempat Anda ingin membuat repositori. Pilih **Repositori**, lalu pilih **Buat** repositori. Konfigurasikan repositori sesuai dengan kebutuhan Anda. | Administrator awan | 
| Tulis Dockerfile.  | Masuk ke Docker dan gunakan “Sample Dockerfile” dan “Contoh file entrypoint.sh” dari bagian *Informasi tambahan* untuk membuat Dockerfile. | DevOps insinyur | 
| Buat image Docker dan dorong ke repositori Amazon ECR. | Bangun Dockerfile menjadi image Docker dan dorong ke repositori Amazon ECR. Untuk bantuan dengan cerita ini, lihat bagian *Sumber daya terkait*. | DevOps insinyur | 

### Membuat komponen AWS Batch
<a name="create-the-aws-batch-components"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat definisi pekerjaan AWS Batch. | Buka konsol AWS Batch dan buat definisi pekerjaan yang menyertakan Uniform Resource Identifier (URI) repositori Amazon ECR sebagai properti. `Image` | Administrator awan | 
| Konfigurasikan antrian pekerjaan AWS Batch.  | Di konsol AWS Batch, pilih **antrian Job**, lalu pilih **Buat** antrean. Buat antrean pekerjaan yang akan menyimpan pekerjaan hingga AWS Batch menjalankannya pada sumber daya dalam lingkungan komputasi Anda. Penting: Pastikan Anda menulis logika AWS Batch untuk merekam detail pencadangan ke tabel inventaris DynamoDB. | Administrator awan | 

### Membuat dan menjadwalkan fungsi Lambda
<a name="create-and-schedule-a-lambda-function"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat fungsi Lambda untuk mencari tag. | Buat fungsi Lambda yang mencari tag pada instans PostgreSQL DB Anda dan mengidentifikasi kandidat cadangan. Pastikan fungsi Lambda Anda dapat mengidentifikasi `bkp:AutomatedDBDump = Active` tag dan semua tag lain yang diperlukan. Penting: Fungsi Lambda juga harus dapat menambahkan pekerjaan ke antrean pekerjaan AWS Batch. | DevOps insinyur | 
| Buat CloudWatch acara Acara berbasis waktu.  | Buka CloudWatch konsol Amazon dan buat CloudWatch acara Acara yang menggunakan ekspresi cron untuk menjalankan fungsi Lambda Anda pada jadwal reguler. Penting: Semua acara terjadwal menggunakan zona waktu UTC. | Administrator awan | 

### Uji otomatisasi cadangan
<a name="test-the-backup-automation"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat kunci Amazon KMS. | Buka konsol Amazon KMS dan buat kunci KMS yang dapat digunakan untuk mengenkripsi kredensyal Amazon RDS yang disimpan di AWS Secrets Manager. | Administrator awan | 
| Buat rahasia AWS Secrets Manager. | Buka konsol AWS Secrets Manager dan simpan kredensyal database Amazon RDS for PostgreSQL Anda sebagai rahasia. | Administrator awan | 
| Tambahkan tag yang diperlukan ke instance PostgreSQL DB. | Buka konsol Amazon RDS dan tambahkan tag ke instans PostgreSQL DB yang ingin Anda cadangkan secara otomatis. Anda dapat menggunakan tag dari tabel di bagian *Alat*. Jika Anda memerlukan backup dari beberapa database PostgreSQL dalam instance Amazon RDS yang sama, maka gunakan sebagai nilai untuk tag. `-d test:-d test1` `bkp:pgdumpcommand` `test`dan `test1` merupakan nama database. Pastikan tidak ada spasi setelah usus besar (:). | Administrator awan | 
| Verifikasi otomatisasi cadangan.  | Untuk memverifikasi otomatisasi cadangan, Anda dapat menjalankan fungsi Lambda atau menunggu jadwal pencadangan dimulai. Setelah proses pencadangan selesai, periksa apakah tabel inventaris DynamoDB memiliki entri cadangan yang valid untuk instans PostgreSQL DB Anda. Jika cocok, maka proses otomatisasi cadangan berhasil. | Administrator awan | 

## Sumber daya terkait
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-resources"></a>

**Buat tabel inventaris di DynamoDB**
+ [Buat tabel Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)

 

**Membuat topik SNS untuk peristiwa pekerjaan yang gagal di AWS Batch**
+ [Buat topik Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/sns-tutorial-create-topic.html)
+ [Kirim peringatan SNS untuk peristiwa pekerjaan yang gagal di AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/batch_sns_tutorial.html)

 

**Buat image Docker dan dorong ke repositori Amazon ECR**
+ [Buat repositori Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)    
+ [Tulis Dockerfile, buat gambar Docker, dan dorong ke Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html)

 

**Membuat komponen AWS Batch**
+ [Membuat definisi pekerjaan AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/Batch_GetStarted.html#first-run-step-1)    
+ [Konfigurasikan lingkungan komputasi dan antrean pekerjaan AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/Batch_GetStarted.html#first-run-step-2)   
+ [Buat antrean pekerjaan di AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/create-job-queue.html)

 

**Buat fungsi Lambda**
+ [Buat fungsi Lambda dan tulis kode](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html)
+ [Gunakan Lambda dengan DynamoDB](https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html)

 

**Buat CloudWatch acara Acara**
+ [Buat CloudWatch acara Acara berbasis waktu](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-Scheduled-Rule.html)   
+ [Gunakan ekspresi cron di Acara Cloudwatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html)

 

**Uji otomatisasi cadangan**
+ [Buat kunci Amazon KMS](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)    
+ [Buat rahasia Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/tutorials_basic.html)
+ [Tambahkan tag ke instans Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html)

## Informasi tambahan
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-additional"></a>

**Acara pekerjaan yang gagal:**

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

**Contoh 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"]
```

**Contoh file 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 "$@"
```