Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

RDS をスナップショットからリストアしたときに利用可能(available)になるのを待ってセキュリティグループを変更するシェルスクリプト

More than 5 years have passed since last update.

下記の記事のように RDS をシェルスクリプトで削除→リストアしようとしたところ、

なぜか --vpc-security-group-ids が指定できませんでした。

しかも、セキュリティグループはリストアを開始した後、利用可能になるまで変更できないようです。

なので、最新のスナップショットからリストアをしつつ、利用可能になるまで待って、セキュリティグループを変更するシェルスクリプトを作成しました。

#!/bin/bash

set -eu

function rds_start()
{
    for id in "$@"; do
        aws rds describe-db-instances \
            --db-instance-identifier "$id" \
            --query "DBInstances[].DBInstanceStatus" \
            --output text >/dev/null 2>&1 &&:

        if [ $? -eq 0 ]; then
            echo "rds $id has been created"
        else
            snapshot=$(aws rds describe-db-snapshots \
                --query "reverse(sort_by(DBSnapshots,&SnapshotCreateTime))
                    [?DBInstanceIdentifier==\`${id}\`]|[0].[DBSnapshotIdentifier]" \
                --output text)

            echo "rds $id restore from $snapshot"

            aws rds restore-db-instance-from-db-snapshot \
                --db-instance-identifier "${id}" \
                --db-snapshot-identifier "${snapshot}" \
                --db-instance-class "db.t2.micro" \
                --db-subnet-group-name "ore-subnet" \
                --no-multi-az \
                --no-publicly-accessible \
                --no-auto-minor-version-upgrade \
                --storage-type gp2 > /dev/null
        fi
    done
}

function rds_wait()
{
    for id in "$@"; do
        echo -n "rds $id wait for available"
        while :; do
            status=$(aws rds describe-db-instances \
                --db-instance-identifier "$id" \
                --query "DBInstances[].DBInstanceStatus" \
                --output text)

            if [ "$status" == "available" ]; then
                echo " now $status"
                break
            fi

            echo -n .
            sleep 1
        done
    done
}

function rds_sg()
{
    for id in "$@"; do
        echo "rds $id modify security-group"

        sg=$(aws ec2 describe-security-groups \
            --filter 'Name=group-name,Values=ore-group' \
            --query 'SecurityGroups[].GroupId' \
            --output text)

        aws rds modify-db-instance \
            --db-instance-identifier "$id" \
            --vpc-security-group-ids "$sg" \
            --apply-immediately > /dev/null
    done
}

function rds_start_wait_sg()
{
    rds_start "$@"
    rds_wait "$@"
    rds_sg "$@"
}

rds_start_wait_sg ore-db are-db

インスタンスのサイズとか、サブネットグループの名前とか、セキュリティグループの名前とかはベタ書きしているので、変更する必要があります。

ngyuki
テック系男子。 ただのやってみた系の記事ははてなブログに、それ以外の技術系のネタは Qiita に投稿します。
https://ngyuki.jp/
headjapan
中規模~大規模の安定した基幹システム・大規模サイトの分析・要件定義・設計・開発を得意とする、総合的な開発会社です。
http://www.headjapan.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away