- Published on
RDS+ECSで定期的にダンプをS3に保存してみる
- Authors
- Name
- 丸山 竜輝
- @5yuim
概要
AWSにてRDSの定期ダンプを取得したかったのでECSにあるcron的な機能を使ってダンプを定期取得する設定をしてみた ECSで動かす定期実行用のコンテナのイメージやタスクも管理を自動化してみた 今回postgresが対象ですmysql等は適宜dockerfileを変更してください
前提条件
- AWSのアカウント取得済み
- RDS構築済み
- bitbucketのアカウント取得済み
準備
IAMユーザーの作成
今回bitbucket pipelineからのデプロイとダンプデータS3へのアップロード用にユーザーを作成する。 通常はデプロイとS3でユーザーを分けた方がいいのだが今回は管理コストの面で一つで作成します。
IAMロールの作成
バケットの作成
特別設定する項目はありません。適宜設定の上作成しておいてください。 その際作成した名前をメモしておいてください。
ECRリポジトリの作成
こちらも特別設定する項目はありませんが、パイプラインでタグを上書きする関係上タグのイミュータビリティは無効化しておいてください(デフォルトで無効) 作成した後URIのカラムにあるURLみたいなものをメモしておいてください。
bitbucketでリポジトリの作成
いつも通りリポジトリを作成してください。 ローカルで下記の通りファイルを作成してください。
~/
├ .pgpass
├ bitbucket-pipelines.yml
├ Dockerfile
└ docker-entrypoint.sh
.pgpassはpostgresにパスワードを省略してアクセスするためのパスワードファイルですダ下記の通り記述してください。
hostname:port:database:username:password
bitbucket-pipelines.ymlはbitbucketのパイプラインの定義を記述するファイルです下記の通り記述してください。 execution-role-arnのところに先ほどメモしたロール ARN
を記入してください。
# enable Docker for your repository
options:
docker: true
pipelines:
default:
- step:
name: build-push
image: atlassian/pipelines-awscli:latest
deployment: test
caches:
- docker
script:
# aws login
- eval $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION})
# docker
- export BUILD_ID=$BITBUCKET_BRANCH_$BITBUCKET_COMMIT_$BITBUCKET_BUILD_NUMBER
- docker build -t ${AWS_REGISTRY_URL}:$BUILD_ID -t ${AWS_REGISTRY_URL}:development .
- docker push ${AWS_REGISTRY_URL}
- step:
name: deploy
image: atlassian/pipelines-awscli:latest
deployment: production
script:
- export BUILD_ID=$BITBUCKET_BRANCH_$BITBUCKET_COMMIT_$BITBUCKET_BUILD_NUMBER
- export IMAGE_NAME="${AWS_REGISTRY_URL}:$BUILD_ID"
# ECS variables
- export ECS_CLUSTER_NAME="${BITBUCKET_REPO_OWNER}"
- export ECS_SERVICE_NAME="${BITBUCKET_REPO_SLUG}"
- export ECS_TASK_NAME="${BITBUCKET_REPO_SLUG}"
# Create ECS cluster, task, service
- aws ecs list-clusters | grep "${ECS_CLUSTER_NAME}" || aws ecs create-cluster --cluster-name "${ECS_CLUSTER_NAME}"
# Updating the existing cluster, task, service
- export TASK_VERSION=$(aws ecs register-task-definition
--family "${ECS_TASK_NAME}"
--execution-role-arn ""
--network-mode "awsvpc"
--requires-compatibilities "FARGATE"
--cpu "256"
--memory "512"
--container-definitions "[{\"name\":\"${ECS_TASK_NAME}\",\"image\":\"${IMAGE_NAME}\",\"logConfiguration\":{\"logDriver\":\"awslogs\",\"options\":{\"awslogs-group\":\"/ecs\",\"awslogs-region\":\"${AWS_DEFAULT_REGION}\",\"awslogs-stream-prefix\":\"${ECS_TASK_NAME}\"}}}]"
| jq --raw-output '.taskDefinition.revision')
- echo "Registered ECS Task Definition:" "${TASK_VERSION}"
DockerfileはECSでデプロイする用のコンテナ定義です下記の通り記述してください。 補足がある箇所は先ほどメモしたものから適宜いれてください。
FROM alpine
RUN apk --no-cache add postgresql-client python3
RUN pip3 install awscli
ENV AWS_DEFAULT_REGION ap-northeast-1
ENV AWS_ACCESS_KEY_ID {アクセスキーID}
ENV AWS_SECRET_ACCESS_KEY {シークレットアクセスキー}
RUN mkdir dump
WORKDIR /root/dump
ADD .pgpass /root/.pgpass
RUN chmod 0600 /root/.pgpass
ADD docker-entrypoint.sh /root/docker-entrypoint.sh
RUN chmod +x /root/docker-entrypoint.sh
CMD ["/root/docker-entrypoint.sh"]
docker-entrypoint.shはdocker起動時に実行するコマンド群ですいわゆるcronの中身です。 補足がある箇所は先ほどメモしたものから適宜いれてください。 保存構成的には最初のプレフィックスが削除周期次にDB名最後にファイルの接頭辞が今回はダンプの周期を入れています。
#!/bin/sh
mkdir -p yearly/{DB名}
pg_dump -Fc -h {DBのホスト} -U {ユーザー} {DB名} > yearly/{DB名}/weekly-`date "+%Y%m%d_%H%M%S"`.custom
aws s3 sync . s3://{S3のバケット}
準備が完了したらいつもの通り先ほど作成したリポジトリにプッシュしてください。