2
1

More than 3 years have passed since last update.

CodeBuild で Aurora スナップショットから Aurora クラスタを作る

Last updated at Posted at 2019-11-04

RDS Aurora では、他と異なり「クラスタ」というのがあるため、awscliのコマンドのパラメータや実行順序が面倒なことになってます。しかもAWSマネジメントコンソールでぽちぽちやるのとも挙動が異なるので、いっそう面倒です。

awscliでの実行手順は、

  • Aurora クラスタ削除は、クラスタのインスタンスを全部削除の完了を待って、クラスタを削除
  • Aurora クラスタ作成は、クラスタ作成して、クラスタのインスタンス作成完了を待つ

わりと時間もかかるので、AWSマネジメントコンソールでちまちまやるのもダルいです。CodeBuildにやらせます。

buildspec.yml

  • variables の変数と値をよしなに設定して使ってください。
  • $SOURCE_DB_CLUSTER_NAME の RDS Aurora のデイリーバックアップスナップショットの最新を 使って、 RDS クラスタ&インスタンスをつくります。
  • 復元先のクラスタ&インスタンスが存在してたら、まず削除して、それから復元します。
    • $RDS_CLUSTER_NAME は復元 のクラスタ名だぞ。
    • 間違っても復元 のクラスタ名を指定するんじゃないぞ。
  • RDSストレージ暗号化してないなら --kms-key-id を外してください。
version: 0.2

env:
  variables:
    SOURCE_DB_CLUSTER_NAME: hoge-rds-aurora
    RDS_CLUSTER_NAME: maskdb
    DB_INSTANCE_CLASS: db.t3.small
    ENGINE_VERSION: 5.6.mysql_aurora.1.19.2
    OPTION_GROUP_NAME: default:aurora-5-6
    CLUSTER_PARAM_GROUP: maskdb-cluster-param
    DB_PARAM_GROUP: maskdb-db-param
    SUBNET_GROUP_NAME: maskdb-subnet-rds
    SECURITY_GROUP_ID: sg-xxxxxxxxxxxxxxx
    KMS_KEY_ID: xxxxxxxx-xxxxxx-xxxxxxxxx-xxxxxxxxxxxx

phases:
  install:
    commands:
      - env | sort
      - yum install -y -q wget which unzip jq
      - pip install --upgrade --quiet pip
      - pip install --quiet awscli
      - aws --version

  build:
    commands:
      - |
        # Auroraの削除手順は、クラスタのインスタンスを全部削除する、待つ、クラスタを削除
        aws rds delete-db-instance \
            --db-instance-identifier "${RDS_CLUSTER_NAME}" \
            --skip-final-snapshot || true
      - |
        aws rds wait db-instance-deleted \
            --db-instance-identifier "${RDS_CLUSTER_NAME}"
      - | 
        aws rds delete-db-cluster \
            --db-cluster-identifier "${RDS_CLUSTER_NAME}" \
            --skip-final-snapshot || true
      - |
        # Auroraの作成手順は、スナップショットからクラスタを作成、インスタンスを作成、待つ
        # 自動バックアップから最新のスナップショット名を取得
        SNAPSHOT_NAME=$(
            aws rds describe-db-cluster-snapshots \
                --db-cluster-identifier "${SOURCE_DB_CLUSTER_NAME}" \
                --snapshot-type automated \
            | jq -r '.DBClusterSnapshots[].DBClusterSnapshotIdentifier' \
            | sort \
            | tail -n1
        )
        echo ${SNAPSHOT_NAME}

        aws rds restore-db-cluster-from-snapshot \
            --snapshot-identifier ${SNAPSHOT_NAME} \
            --db-cluster-identifier "${RDS_CLUSTER_NAME}" \
            --engine "aurora" \
            --engine-version "${ENGINE_VERSION}" \
            --db-subnet-group-name "${SUBNET_GROUP_NAME}" \
            --vpc-security-group-ids "${SECURITY_GROUP_ID}" \
            --db-cluster-parameter-group-name "${CLUSTER_PARAM_GROUP}" \
            --kms-key-id "${KMS_KEY_ID}" \
            --no-deletion-protection
      - |
        aws rds create-db-instance \
            --db-instance-identifier "${RDS_CLUSTER_NAME}" \
            --db-cluster-identifier "${RDS_CLUSTER_NAME}" \
            --db-instance-class "${DB_INSTANCE_CLASS}" \
            --engine "aurora" \
            --no-publicly-accessible
      - |
        aws rds wait db-instance-available \
            --db-instance-identifier ${RDS_CLUSTER_NAME}

IAM

CodeBuildにつけるIAMロールは、RDS Auroraのクラスタ名&インスタンス名限定にするのが安全です。扱うモノがモノだけに、てへぺろが通用しないと思いますので。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "rds:AuthorizeDBSecurityGroupIngress",
                "rds:StartDBCluster",
                "rds:RestoreDBClusterFromSnapshot",
                "rds:StartDBInstance",
                "rds:ModifyDBSnapshot",
                "rds:CreateDBSnapshot",
                "rds:RestoreDBInstanceFromDBSnapshot",
                "rds:RebootDBInstance",
                "rds:CreateDBCluster",
                "rds:CreateDBInstance",
                "rds:ModifyDBInstance",
                "rds:ModifyDBCluster",
                "rds:CreateDBClusterSnapshot",
                "rds:ModifyDBClusterSnapshotAttribute",
                "rds:ModifyDBSnapshotAttribute",
                "rds:DeleteDBCluster",
                "rds:DeleteDBInstance"
            ],
            "Resource": [
                "arn:aws:rds:*:*:cluster-snapshot:*",
                "arn:aws:rds:*:*:snapshot:*",
                "arn:aws:rds:*:*:cluster:maskdb",
                "arn:aws:rds:*:*:db:maskdb",
                "arn:aws:rds:*:*:secgrp:*",
                "arn:aws:rds:*:*:subgrp:*",
                "arn:aws:rds:*:*:og:*",
                "arn:aws:rds:*:*:cluster-pg:maskdb",
                "arn:aws:rds:*:*:pg:maskdb"
            ]
        }
    ]
}

CodeBuildから awscli を実行するので PassRole も付けておきましょう。

実行時間

CodeBuildは最大で 8 時間まで実行できます。8時間以上かかるなら、

  • 最後の aws rds wait db-instance-available を外す
    • 終わるのを目視なりで確認する必要がある
  • CodeBuildでやるのを諦める
    • EC2インスタンスでやるとか

などを検討してください。

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1