ECSタスクスケジュールでmysqldumpを日次で実行してs3にアップ

# はじめに
EC2上でcron実行していたMySQLのdump実行環境をECSに移行しました。
ecsのタスクスケジュールでdumpを取得してS3にアップした備忘録になります。

# 利用するコンテナイメージ

https://hub.docker.com/r/mysql/mysql-server/

https://github.com/mysql/mysql-docker

# 作業の流れ

1. MySQLコンテナイメージの作成とAWSCLIのインストール
1. コンテナのbuildとイメージをECRにpush
1. パラメータストアにDBのアクセス情報を登録
1. ECSタスク定義に登録
1. タスクスケジュールに登録


# 1. MySQLコンテナイメージの作成とAWSCLIのインストール

公式からcloneして、既存のDockerfileとdocker-entrypoint.sh を書き換えます
MySQL+AWSCLIを入れます。

```
$ git clone https://github.com/mysql/mysql-docker.git
$ cd mysql-docker/mysql-server/8.0
$ vim Dockerfile 
```
以下に置き換えます。

```Dockerfile
FROM oraclelinux:7-slim

ARG MYSQL_SERVER_PACKAGE=mysql-community-server-minimal-8.0.20
ARG MYSQL_SHELL_PACKAGE=mysql-shell-8.0.20

# Install server
RUN yum install -y https://repo.mysql.com/mysql-community-minimal-release-el7.rpm \
      https://repo.mysql.com/mysql-community-release-el7.rpm \
  && yum-config-manager --enable mysql80-server-minimal \
  && yum install -y \
      $MYSQL_SERVER_PACKAGE \
      $MYSQL_SHELL_PACKAGE \
      libpwquality \
  && yum clean all \
  && mkdir /docker-entrypoint-initdb.d

#AWSCLI install
RUN yum install -y python3
RUN pip3 install awscli

VOLUME /var/lib/mysql

COPY docker-entrypoint.sh /docker-entrypoint.sh
CMD ["/docker-entrypoint.sh"]
```

docker-entrypoint.sh を以下に書き換えます。
BACKUP_DB_PASSWORD
DB_USER
DB_HOST
BACKUP_S3_BUCKET
については、後にパラメータストア等で定義します。

```
$ vim docker-entrypoint.sh 
```
```docker-entrypoint.sh
#!/bin/bash

BACKUP_DIR='/tmp'
DATE=$(date '+%Y%m%d')


mysqldump -R -u${DB_USER} -p${BACKUP_DB_PASSWORD} -h ${DB_HOST} --single-transaction --all-databases --default-character-set=binary --set-gtid-purged=off --skip-column-statistics | gzip > ${BACKUP_DIR}/${DATE}_mysqldump.sql.gz
aws s3 cp ${BACKUP_DIR}/${DATE}_mysqldump.sql.gz $BACKUP_S3_BUCKET/${DATE}_mysqldump.sql.gz --region ap-northeast-1
```

# 2. コンテナのbuildとイメージをECRにpush

ECRにログインします。
xxxxの部分は自AWS環境のECRレポジトリに置き換えてください。

```
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
```
buildとpushを行います。

```
$ docker build --no-cache -t dbbackup-task .
$ docker tag dbbackup-task:latest xxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/dbbackup-task:latest
$ docker push xxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/dbbackup-task:latest
```

# 3.パラメータストアにDBのアクセス情報を登録
BACKUP_DB_PASSWORD
BACKUP_S3_BUCKET
DB_USER
DB_HOST
docker-entrypoint.shで変数に設定した上記をパラメータストアに登録します。
passwordについてはSecureStringで、その他はStringで良いと思います。
このあたりの登録方法は割愛します。

# 4.ECSタスク定義に登録
先程作成したコンテナイメージをタスク定義に登録します。
タスク定義の登録方法は通常の作成方法と同じですので割愛します。
以下に変更ポイントを記載します。

・コンテナイメージの指定
先程ECRにアップしたコンテナイメージを設定します。

・DBへのアクセス情報をパラメータストアに登録したと思うのですが、そちらを環境変数に登録します。
Valueについては右側の黒い部分にテキストを入力します。
ValueFromは先程設定したパラメータストアの名前を入力します。
![スクリーンショット 2021-06-07 17.07.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1545164/05321cda-2c64-3e43-5a8f-f1552a6bebaa.png)


・タスクのソフトメモリ制限を設定
DBの容量によってはメモリを消費する可能性があるので増やします。
512MBもあれば十分かと思います。

・タスク実行ロール、タスクロールの設定
コンテナ内から、パラメータストア、S3にアクセスできるように、
タスク定義内のタスク実行ロール及びタスクロールの設定を行います


# 5.タスクスケジュールに登録

タスクスケジュールを利用するために登録をします。
実行したいクラスタを選択して、図のようにタスクのスケジューリングを選択して、作成をクリックします。
![スクリーンショット 2021-06-07 16.58.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1545164/8aa16994-7acf-bd3a-d974-e1163b7185a0.png)

この画面になります。
名前を入力
スケジュールルールタイプでcronを選択
cronの時間はUTCで指定します。
ターゲットIDは名前と同様で良いと思います。

タスク定義は先程作成したタスク定義を指定して、リビジョンも選択します。
タスクの数は１で。

![スクリーンショット 2021-06-07 17.21.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1545164/2d29ce6e-2ffe-a853-8c89-483dd4c65f49.png)

最後に環境変数の上書き設定を行います。
▼をクリックすると環境変数の上書きができます。
先程設定したBACKUP_S3_BUCKETを変更したい場合は変更先のバケットのURLを記載します。

![スクリーンショット 2021-06-07 17.29.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1545164/2b5cdcc8-144a-cfbd-165f-e5405d84b9d2.png)

以上で設定完了です。