AWS CLIでRDSを操作するには、aws rds に続けて describe-db-instances(状態と接続先の確認)、stop-db-instance / start-db-instance(停止・起動)、create-db-snapshot(スナップショット作成)を使います。 どのコマンドも、対象は --db-instance-identifier で渡すDBインスタンスIDです。

この記事では、インスタンスの作成から削除までを1本の流れで実行し、各コマンドの出力と、--query でエンドポイント・ポート・ステータスだけを取り出す形を載せます。エラーになる例は実際のエラー文つきで示し、最後に同じ流れの boto3 版も用意しました。

確認環境:Ubuntu 24.04、AWS CLI 1.46.1、Python 3.11.15、boto3 1.43.103。AWS の API をローカルで再現するツール(moto 5.2.3)で実行しています。掲載するコマンドは、実際の AWS でそのまま使える形(--endpoint-url なし)で書いています。

RDS操作コマンドの早見表

やりたいこと コマンド(aws rds 〜) 主なオプション
一覧・状態を見る describe-db-instances --db-instance-identifier、--query
接続先(エンドポイント)を取る describe-db-instances --query 'DBInstances[0].Endpoint.Address'
作成する create-db-instance --engine、--db-instance-class、--allocated-storage
停止する stop-db-instance --db-snapshot-identifier(停止直前にスナップショット)
起動する start-db-instance --db-instance-identifier
再起動する reboot-db-instance --force-failover(マルチAZ構成のとき)
設定を変える modify-db-instance --db-instance-class、--apply-immediately
使える状態になるまで待つ wait db-instance-available --db-instance-identifier
スナップショットを作る create-db-snapshot --db-snapshot-identifier
スナップショットを一覧する describe-db-snapshots --snapshot-type manual
スナップショットから復元する restore-db-instance-from-db-snapshot 新しいインスタンスIDを指定
削除する delete-db-instance --final-db-snapshot-identifier または --skip-final-snapshot
スナップショットを消す delete-db-snapshot --db-snapshot-identifier

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「AWS CLIでRDSを操作|起動・停止・スナップショット・接続先取得」

全体の流れ

flowchart LR
  A[create-db-instance] --> B[wait db-instance-available]
  B --> C[describe-db-instances]
  C --> D[stop-db-instance]
  D --> E[start-db-instance]
  E --> F[create-db-snapshot]
  F --> G[restore-db-instance-from-db-snapshot]
  G --> H[delete-db-instance]

以降の例では、DBインスタンスIDを demo-db、エンジンを PostgreSQL、リージョンを ap-northeast-1 とします。

DBインスタンスを作成する

aws rds create-db-instance \
  --db-instance-identifier demo-db \
  --db-instance-class db.t3.micro \
  --engine postgres \
  --engine-version 16.4 \
  --allocated-storage 20 \
  --master-username appadmin \
  --master-user-password 'Passw0rd-Example' \
  --db-name appdb \
  --no-publicly-accessible \
  --backup-retention-period 1
オプション 意味
--db-instance-identifier DBインスタンスID。以降のすべての操作でこの名前を使う
--db-instance-class インスタンスの大きさ
--engine / --engine-version データベースの種類と版
--allocated-storage ストレージの容量(GiB)
--master-username / --master-user-password 管理ユーザーの名前とパスワード
--db-name 最初に作るデータベース名
--no-publicly-accessible インターネット側に公開しない
--backup-retention-period 自動バックアップを残す日数

パスワードをコマンドに直接書くとシェルの履歴に残ります。パスワードは --manage-master-user-password を付けて Secrets Manager に管理を任せる形にすると、コマンドに書かずに済みます(その場合 --master-user-password は付けません)。

使える状態になるまで待つ(wait)

作成コマンドはすぐ戻りますが、接続できるようになるまでには時間がかかります。wait db-instance-available を挟むと、ステータスが available になるまでコマンドが止まって待ってくれます。

aws rds wait db-instance-available --db-instance-identifier demo-db
echo "終了コード: $?"
終了コード: 0

AWS CLI のリファレンスによると、このコマンドは describe-db-instances を30秒ごとに呼び、60回確認しても available にならなければ終了コード255で終わります(最長で約30分)。シェルスクリプトで「作成 → 待つ → 接続先を取る」とつなげるときの基本形です。

rds の wait には次の種類があります(aws rds wait help の一覧)。

waiter 待つ内容
db-instance-available インスタンスが available になる
db-instance-deleted インスタンスが消える
db-snapshot-available スナップショットが available になる
db-snapshot-completed スナップショットの作成が終わる
db-snapshot-deleted スナップショットが消える
db-cluster-available クラスターが available になる
db-cluster-deleted クラスターが消える
db-cluster-snapshot-available クラスタースナップショットが available になる
db-cluster-snapshot-deleted クラスタースナップショットが消える
tenant-database-available / tenant-database-deleted テナントデータベース用

「stopped になるまで待つ」waiter はありません。停止の待ち合わせは、後述のループで書きます。

状態と接続先を確認する(describe-db-instances)

オプションなしで実行すると、インスタンスごとに多くの項目が返ります。

aws rds describe-db-instances --db-instance-identifier demo-db
{
    "DBInstances": [
        {
            "DBInstanceIdentifier": "demo-db",
            "DBInstanceClass": "db.t3.micro",
            "Engine": "postgres",
            "DBInstanceStatus": "available",
            "MasterUsername": "appadmin",
            "DBName": "appdb",
            "Endpoint": {
                "Address": "demo-db.aaaaaaaaaa.ap-northeast-1.rds.amazonaws.com",
                "Port": 5432
            },
            "AllocatedStorage": 20,
            "InstanceCreateTime": "2026-10-05T06:00:31.566429Z",
            "PreferredBackupWindow": "13:14-13:44",
            "BackupRetentionPeriod": 1,
            "AvailabilityZone": "ap-northeast-1a",
            "MultiAZ": false,
            "EngineVersion": "16.4",
            "PubliclyAccessible": false,
            "StorageType": "gp2",
            "StorageEncrypted": false,
            "DBInstanceArn": "arn:aws:rds:ap-northeast-1:123456789012:db:demo-db",
            "DeletionProtection": false,
            …(省略)…
        }
    ]
}

エンドポイントの aaaaaaaaaa の部分は、実際にはアカウントとリージョンごとに決まる文字列になります。

エンドポイント・ポート・ステータスだけを抜く

必要な項目だけを取るには --query を使います。 DBInstances は配列なので、IDを1つ指定したときは [0] で先頭を取り出します。

aws rds describe-db-instances --db-instance-identifier demo-db \
  --query 'DBInstances[0].[Endpoint.Address,Endpoint.Port,DBInstanceStatus]' \
  --output text
demo-db.aaaaaaaaaa.ap-northeast-1.rds.amazonaws.com 5432    available

名前を付けて JSON で受け取る形です。

aws rds describe-db-instances --db-instance-identifier demo-db \
  --query 'DBInstances[0].{Host:Endpoint.Address,Port:Endpoint.Port,Status:DBInstanceStatus,DB:DBName,User:MasterUsername}'
{
    "Host": "demo-db.aaaaaaaaaa.ap-northeast-1.rds.amazonaws.com",
    "Port": 5432,
    "Status": "available",
    "DB": "appdb",
    "User": "appadmin"
}

取り出した接続先をそのまま psql に渡す

--output text はタブ区切りなので、read で変数に分けられます。

read -r HOST PORT <<< "$(aws rds describe-db-instances --db-instance-identifier demo-db \
  --query 'DBInstances[0].[Endpoint.Address,Endpoint.Port]' --output text)"
echo "psql -h $HOST -p $PORT -U appadmin -d appdb"
psql -h demo-db.aaaaaaaaaa.ap-northeast-1.rds.amazonaws.com -p 5432 -U appadmin -d appdb

全インスタンスを表で見る

aws rds describe-db-instances \
  --query 'DBInstances[].{ID:DBInstanceIdentifier,Status:DBInstanceStatus,Engine:Engine,Class:DBInstanceClass,AZ:AvailabilityZone}' \
  --output table
------------------------------------------------------------------------
|                          DescribeDBInstances                         |
+------------------+--------------+-----------+----------+-------------+
|        AZ        |    Class     |  Engine   |   ID     |   Status    |
+------------------+--------------+-----------+----------+-------------+
|  ap-northeast-1a |  db.t3.micro |  postgres |  demo-db |  available  |
+------------------+--------------+-----------+----------+-------------+

よく使う --query の形

取りたいもの --query の値
ホスト名 DBInstances[0].Endpoint.Address
ポート DBInstances[0].Endpoint.Port
ステータス DBInstances[0].DBInstanceStatus
エンジンと版 DBInstances[0].[Engine,EngineVersion]
インスタンスクラス DBInstances[0].DBInstanceClass
ARN(タグ付けで使う) DBInstances[0].DBInstanceArn
全インスタンスのIDと状態 DBInstances[].[DBInstanceIdentifier,DBInstanceStatus]
停止中のIDだけ DBInstances[?DBInstanceStatus==`stopped`].DBInstanceIdentifier

最後の行は、コマンドでは次のように書きます(値の stopped をバッククォートで囲みます)。

aws rds describe-db-instances \
  --query 'DBInstances[?DBInstanceStatus==`stopped`].DBInstanceIdentifier' --output text

停止する(stop-db-instance)

aws rds stop-db-instance --db-instance-identifier demo-db

AWS CLI のリファレンスの出力例では、このコマンドの応答の DBInstanceStatus は stopping です。その後しばらくして stopped に変わります。止まったかどうかは describe-db-instances のステータスで確かめます。

aws rds describe-db-instances --db-instance-identifier demo-db \
  --query 'DBInstances[0].DBInstanceStatus' --output text
stopped

止まるまで待つループ

stopped 用の waiter はないので、ステータスを見るループを書きます。

aws rds stop-db-instance --db-instance-identifier demo-db > /dev/null
until [ "$(aws rds describe-db-instances --db-instance-identifier demo-db \
          --query 'DBInstances[0].DBInstanceStatus' --output text)" = "stopped" ]; do
  echo "停止を待っています..."
  sleep 30
done
echo "停止しました"
停止しました

(今回の確認環境では状態がすぐ切り替わるため、待ちのメッセージは出ていません。)

停止について知っておくこと(公式ユーザーガイドより)

項目 内容
止めておける期間 連続で最大7日。7日たつと RDS が自動で起動する
止めている間にかからない料金 DBインスタンスの時間料金
止めている間もかかる料金 確保したストレージ(プロビジョンドIOPSを含む)、バックアップ用ストレージ(手動スナップショット・保持期間内の自動バックアップ)、公開している場合のパブリックIPv4アドレス
止めても保たれるもの インスタンスID、DNSエンドポイント、パラメータグループ、セキュリティグループ、オプショングループ
止められない構成 リードレプリカを持つインスタンス、リードレプリカ自身、マルチAZ構成の RDS for SQL Server

エンドポイントは停止しても変わらないので、起動後にアプリケーション側の接続先を書き換える必要はありません。

停止済みに stop を打つと InvalidDBInstanceState

すでに止まっているインスタンスに、もう一度 stop を実行した結果です。

aws rds stop-db-instance --db-instance-identifier demo-db
An error occurred (InvalidDBInstanceState) when calling the StopDBInstance operation: Instance demo-db is not in available state.

stop-db-instance が通るのは available のときだけです。スクリプトでは、先にステータスを見て available のときだけ停止する形にすると、何度実行しても同じ結果になります。

STATUS=$(aws rds describe-db-instances --db-instance-identifier demo-db \
  --query 'DBInstances[0].DBInstanceStatus' --output text)
if [ "$STATUS" = "available" ]; then
  aws rds stop-db-instance --db-instance-identifier demo-db > /dev/null
  echo "停止を受け付けました"
else
  echo "現在の状態は $STATUS のため、停止は行いません"
fi

起動する(start-db-instance)

aws rds start-db-instance --db-instance-identifier demo-db
aws rds wait db-instance-available --db-instance-identifier demo-db

起動のあとは wait db-instance-available がそのまま使えます。動いているインスタンスに start を打つと、こちらも InvalidDBInstanceState になります。

An error occurred (InvalidDBInstanceState) when calling the StartDBInstance operation: Instance demo-db is not stopped, it cannot be started.
操作 通る状態 それ以外の状態で実行したとき
stop-db-instance available InvalidDBInstanceState
start-db-instance stopped InvalidDBInstanceState

存在しないIDを指定すると DBInstanceNotFound

IDの打ち間違いや、リージョンの指定違いで出るエラーです。

aws rds describe-db-instances --db-instance-identifier no-such-db
An error occurred (DBInstanceNotFound) when calling the DescribeDBInstances operation: DBInstance no-such-db not found.
確認すること コマンド
IDの綴り aws rds describe-db-instances --query 'DBInstances[].DBInstanceIdentifier'
リージョン 同じコマンドに --region ap-northeast-1 などを付けて実行
使っているアカウント aws sts get-caller-identity
Aurora かどうか aws rds describe-db-clusters --query 'DBClusters[].DBClusterIdentifier'

スナップショットを作成する(create-db-snapshot)

aws rds create-db-snapshot \
  --db-instance-identifier demo-db \
  --db-snapshot-identifier demo-db-20261005
{
    "DBSnapshot": {
        "DBSnapshotIdentifier": "demo-db-20261005",
        "DBInstanceIdentifier": "demo-db",
        "SnapshotCreateTime": "2026-10-05T06:00:44.925820Z",
        "Engine": "postgres",
        "AllocatedStorage": 20,
        "Port": 5432,
        "MasterUsername": "appadmin",
        "EngineVersion": "16.4",
        "SnapshotType": "manual",
        "Encrypted": false,
        "DBSnapshotArn": "arn:aws:rds:ap-northeast-1:123456789012:snapshot:demo-db-20261005",
        …(省略)…
    }
}

作成が終わるまで待つには、スナップショット用の waiter を使います。

aws rds wait db-snapshot-available --db-snapshot-identifier demo-db-20261005

スナップショットを一覧する

aws rds describe-db-snapshots --db-instance-identifier demo-db \
  --query 'DBSnapshots[].{ID:DBSnapshotIdentifier,Status:Status,Type:SnapshotType,Created:SnapshotCreateTime}' \
  --output table
-------------------------------------------------------------------------------------------
|                                   DescribeDBSnapshots                                   |
+------------------------------+--------------------------------+------------+------------+
|            Created           |              ID                |  Status    |   Type     |
+------------------------------+--------------------------------+------------+------------+
|  2026-10-05T06:00:31.897533Z |  rds:demo-db-2026-10-05-06-00  |  available |  automated |
|  2026-10-05T06:00:44.925820Z |  demo-db-20261005              |  available |  manual    |
+------------------------------+--------------------------------+------------+------------+
Type 作られ方 ID
automated 自動バックアップ(--backup-retention-period が1以上のとき) rds: で始まる
manual create-db-snapshot で自分で作ったもの 自分で付けた名前

手動のものだけを見るときは --snapshot-type manual を付けます。

同じ名前で作ると DBSnapshotAlreadyExists

An error occurred (DBSnapshotAlreadyExists) when calling the CreateDBSnapshot operation: Cannot create the snapshot because a snapshot with the identifier demo-db-20261005 already exists.

すでにあるスナップショットIDは使えません。日付や時刻を名前に入れると、定期実行でも重なりません。

aws rds create-db-snapshot \
  --db-instance-identifier demo-db \
  --db-snapshot-identifier "demo-db-$(date +%Y%m%d-%H%M)"

スナップショットから復元する

復元は、既存のインスタンスを巻き戻すのではなく、新しいインスタンスを作る操作です。 公式ユーザーガイドにも「DBスナップショットから既存のDBインスタンスへは復元できず、復元時に新しいDBインスタンスを作成する」と書かれています。

aws rds restore-db-instance-from-db-snapshot \
  --db-instance-identifier demo-db-restored \
  --db-snapshot-identifier demo-db-20261005 \
  --db-instance-class db.t3.micro
aws rds wait db-instance-available --db-instance-identifier demo-db-restored

復元後に2つのインスタンスの接続先を並べると、エンドポイントが別になっていることがわかります。

aws rds describe-db-instances \
  --query 'DBInstances[].[DBInstanceIdentifier,DBInstanceStatus,Endpoint.Address]' --output text
demo-db available   demo-db.aaaaaaaaaa.ap-northeast-1.rds.amazonaws.com
demo-db-restored    available   demo-db-restored.aaaaaaaaaa.ap-northeast-1.rds.amazonaws.com

既存のIDをそのまま指定すると、次のエラーになります。

An error occurred (DBInstanceAlreadyExists) when calling the RestoreDBInstanceFromDBSnapshot operation: DB instance already exists

復元時に指定しておきたいオプション

公式ユーザーガイドによると、復元したインスタンスには、指定しなければデフォルトの VPC・DBサブネットグループ・VPCセキュリティグループと、デフォルトのDBパラメータグループが関連付けられます。元と同じ設定で使うには、次のオプションを付けます。

オプション 指定するもの
--db-subnet-group-name 元と同じDBサブネットグループ
--vpc-security-group-ids 元と同じセキュリティグループ
--db-parameter-group-name 元と同じパラメータグループ
--db-instance-class インスタンスクラス
--no-publicly-accessible 公開しない設定

元の設定値は、復元の前に控えておけます。

aws rds describe-db-instances --db-instance-identifier demo-db \
  --query 'DBInstances[0].{Subnet:DBSubnetGroup.DBSubnetGroupName,SG:VpcSecurityGroups[].VpcSecurityGroupId,Param:DBParameterGroups[].DBParameterGroupName}'

設定変更と再起動

インスタンスクラスの変更は modify-db-instance です。

aws rds modify-db-instance \
  --db-instance-identifier demo-db \
  --db-instance-class db.t3.small \
  --apply-immediately
aws rds wait db-instance-available --db-instance-identifier demo-db
aws rds describe-db-instances --db-instance-identifier demo-db \
  --query 'DBInstances[0].DBInstanceClass' --output text
db.t3.small

--apply-immediately を付けない場合、変更は次のメンテナンスウィンドウで反映されます。再起動は reboot-db-instance です。

aws rds reboot-db-instance --db-instance-identifier demo-db

タグは ARN を指定して付けます。

aws rds add-tags-to-resource \
  --resource-name arn:aws:rds:ap-northeast-1:123456789012:db:demo-db \
  --tags Key=env,Value=dev
aws rds list-tags-for-resource \
  --resource-name arn:aws:rds:ap-northeast-1:123456789012:db:demo-db
{
    "TagList": [
        {
            "Key": "env",
            "Value": "dev"
        }
    ]
}

削除する(delete-db-instance)

削除では、最後のスナップショットを残すか、残さないかのどちらかを指定します。 API リファレンスの説明では、--skip-final-snapshot を付けない場合は --final-db-snapshot-identifier の指定が必要です。

# 最後のスナップショットを残して削除
aws rds delete-db-instance \
  --db-instance-identifier demo-db \
  --final-db-snapshot-identifier demo-db-final

# スナップショットを残さず削除(検証用のインスタンス向け)
aws rds delete-db-instance \
  --db-instance-identifier demo-db-restored \
  --skip-final-snapshot

# 消えるまで待つ
aws rds wait db-instance-deleted --db-instance-identifier demo-db

削除後にスナップショットを一覧すると、最終スナップショットが manual として残っています。

aws rds describe-db-snapshots \
  --query 'DBSnapshots[].[DBSnapshotIdentifier,SnapshotType,Status]' --output text
demo-db-20261005    manual  available
demo-db-final   manual  available

手動スナップショットは、インスタンスを消しても残ります。不要になったら個別に消します。

aws rds delete-db-snapshot --db-snapshot-identifier demo-db-20261005
aws rds delete-db-snapshot --db-snapshot-identifier demo-db-final

消したあとのIDをもう一度指定すると、それぞれ次のエラーになります。

An error occurred (DBInstanceNotFound) when calling the DeleteDBInstance operation: DBInstance demo-db not found.
An error occurred (DBSnapshotNotFound) when calling the DeleteDBSnapshot operation: DBSnapshot nope not found.

インスタンス用とAuroraクラスター用のコマンド対応表

Aurora は「クラスター」の下にインスタンスがぶら下がる構成で、停止・起動やスナップショットはクラスター単位で行います。AWS CLI のリファレンスにも、stop-db-instance は Aurora MySQL と Aurora PostgreSQL には適用されず、Aurora クラスターには StopDBCluster を使うと書かれています。

操作 RDS インスタンス用 Aurora クラスター用
状態・接続先の確認 describe-db-instances describe-db-clusters
IDの指定 --db-instance-identifier --db-cluster-identifier
作成 create-db-instance create-db-cluster + create-db-instance(--db-cluster-identifier 付き)
停止 stop-db-instance stop-db-cluster
起動 start-db-instance start-db-cluster
待ち合わせ wait db-instance-available wait db-cluster-available
スナップショット作成 create-db-snapshot create-db-cluster-snapshot
スナップショット一覧 describe-db-snapshots describe-db-cluster-snapshots
復元 restore-db-instance-from-db-snapshot restore-db-cluster-from-snapshot
削除 delete-db-instance delete-db-instance(全インスタンス)→ delete-db-cluster
スナップショット削除 delete-db-snapshot delete-db-cluster-snapshot

クラスターの接続先を取る

クラスターには、書き込み用(Endpoint)と読み取り用(ReaderEndpoint)の2つのエンドポイントがあります。

aws rds describe-db-clusters --db-cluster-identifier demo-cluster \
  --query 'DBClusters[0].{Writer:Endpoint,Reader:ReaderEndpoint,Port:Port,Status:Status,Members:DBClusterMembers[].DBInstanceIdentifier}'
{
    "Writer": "demo-cluster.cluster-yefnq4rsgcun.ap-northeast-1.rds.amazonaws.com",
    "Reader": "demo-cluster.cluster-ro-yefnq4rsgcun.ap-northeast-1.rds.amazonaws.com",
    "Port": 5432,
    "Status": "available",
    "Members": [
        "demo-cluster-1"
    ]
}
項目 インスタンス(describe-db-instances) クラスター(describe-db-clusters)
ホスト名 DBInstances[0].Endpoint.Address DBClusters[0].Endpoint
読み取り用ホスト名 なし DBClusters[0].ReaderEndpoint
ポート DBInstances[0].Endpoint.Port DBClusters[0].Port
ステータス DBInstances[0].DBInstanceStatus DBClusters[0].Status

クラスターでは Endpoint が文字列そのもので、インスタンスのように Address を持つオブジェクトではない点が違いです。

クラスターの停止・起動・スナップショット

aws rds stop-db-cluster  --db-cluster-identifier demo-cluster
aws rds start-db-cluster --db-cluster-identifier demo-cluster
aws rds wait db-cluster-available --db-cluster-identifier demo-cluster

aws rds create-db-cluster-snapshot \
  --db-cluster-identifier demo-cluster \
  --db-cluster-snapshot-identifier demo-cluster-20261005
aws rds wait db-cluster-snapshot-available \
  --db-cluster-snapshot-identifier demo-cluster-20261005

存在しないクラスターIDを指定したときのエラーコードは DBClusterNotFoundFault です。

An error occurred (DBClusterNotFoundFault) when calling the DescribeDBClusters operation: DBCluster nope not found.

boto3で同じ流れを書く

Python から操作するときは boto3 の rds クライアントを使います。メソッド名は CLI のコマンド名のハイフンをアンダースコアに変えたもの、引数はオプション名を大文字始まりでつなげたものです。

CLI boto3
describe-db-instances --db-instance-identifier demo-db describe_db_instances(DBInstanceIdentifier="demo-db")
stop-db-instance stop_db_instance
start-db-instance start_db_instance
create-db-snapshot create_db_snapshot
restore-db-instance-from-db-snapshot restore_db_instance_from_db_snapshot
wait db-instance-available get_waiter("db_instance_available").wait(...)
--skip-final-snapshot SkipFinalSnapshot=True

作成から削除までを通したスクリプトです(rds_ops.py)。

import time

import boto3
from botocore.exceptions import ClientError

rds = boto3.client("rds", region_name="ap-northeast-1")
DB = "demo-db"
SNAP = "demo-db-20261005"


def status(db_id):
    """状態と接続先をまとめて返す"""
    db = rds.describe_db_instances(DBInstanceIdentifier=db_id)["DBInstances"][0]
    ep = db.get("Endpoint", {})
    return db["DBInstanceStatus"], ep.get("Address"), ep.get("Port")


def wait_status(db_id, want, interval=30, tries=60):
    """専用の waiter がない状態(stopped など)を待つ"""
    for _ in range(tries):
        if status(db_id)[0] == want:
            return
        time.sleep(interval)
    raise TimeoutError(f"{db_id} が {want} になりませんでした")


# 1. 作成 → available になるまで待つ
rds.create_db_instance(
    DBInstanceIdentifier=DB,
    DBInstanceClass="db.t3.micro",
    Engine="postgres",
    EngineVersion="16.4",
    AllocatedStorage=20,
    MasterUsername="appadmin",
    MasterUserPassword="Passw0rd-Example",
    DBName="appdb",
    PubliclyAccessible=False,
)
rds.get_waiter("db_instance_available").wait(DBInstanceIdentifier=DB)
print("1 作成後 :", status(DB))

# 2. 停止(すでに止まっていても続行できる形)
def stop_if_running(db_id):
    try:
        rds.stop_db_instance(DBInstanceIdentifier=db_id)
        return "停止を受け付けました"
    except ClientError as e:
        if e.response["Error"]["Code"] == "InvalidDBInstanceState":
            return "停止できる状態ではありません: " + e.response["Error"]["Message"]
        raise

print("2 停止1回目:", stop_if_running(DB))
print("2 停止2回目:", stop_if_running(DB))
wait_status(DB, "stopped")
print("2 停止後 :", status(DB))

# 3. 起動 → 待つ
rds.start_db_instance(DBInstanceIdentifier=DB)
rds.get_waiter("db_instance_available").wait(DBInstanceIdentifier=DB)
print("3 起動後 :", status(DB))

# 4. スナップショット作成 → 待つ
rds.create_db_snapshot(DBInstanceIdentifier=DB, DBSnapshotIdentifier=SNAP)
rds.get_waiter("db_snapshot_available").wait(DBSnapshotIdentifier=SNAP)
for s in rds.describe_db_snapshots(DBInstanceIdentifier=DB, SnapshotType="manual")["DBSnapshots"]:
    print("4 スナップショット:", s["DBSnapshotIdentifier"], s["Status"], s["SnapshotType"])

# 5. 復元(別名の新しいインスタンスになる)
rds.restore_db_instance_from_db_snapshot(
    DBInstanceIdentifier=DB + "-restored",
    DBSnapshotIdentifier=SNAP,
    DBInstanceClass="db.t3.micro",
)
rds.get_waiter("db_instance_available").wait(DBInstanceIdentifier=DB + "-restored")
print("5 復元後 :", status(DB + "-restored"))

# 6. 存在しないIDを指定したとき
try:
    status("no-such-db")
except ClientError as e:
    err = e.response["Error"]
    print("6 エラー :", err["Code"], "/", err["Message"])

# 7. 削除 → 消えるまで待つ
for db_id in (DB + "-restored", DB):
    rds.delete_db_instance(DBInstanceIdentifier=db_id, SkipFinalSnapshot=True)
    rds.get_waiter("db_instance_deleted").wait(DBInstanceIdentifier=db_id)
rds.delete_db_snapshot(DBSnapshotIdentifier=SNAP)
print("7 残り   :", [d["DBInstanceIdentifier"] for d in rds.describe_db_instances()["DBInstances"]])
1 作成後 : ('available', 'demo-db.aaaaaaaaaa.ap-northeast-1.rds.amazonaws.com', 5432)
2 停止1回目: 停止を受け付けました
2 停止2回目: 停止できる状態ではありません: Instance demo-db is not in available state.
2 停止後 : ('stopped', 'demo-db.aaaaaaaaaa.ap-northeast-1.rds.amazonaws.com', 5432)
3 起動後 : ('available', 'demo-db.aaaaaaaaaa.ap-northeast-1.rds.amazonaws.com', 5432)
4 スナップショット: demo-db-20261005 available manual
5 復元後 : ('available', 'demo-db-restored.aaaaaaaaaa.ap-northeast-1.rds.amazonaws.com', 5432)
6 エラー : DBInstanceNotFound / DBInstance no-such-db not found.
7 残り   : []

boto3 でのエラーの見分け方

boto3 では、エラーコードは e.response["Error"]["Code"] に入ります。クライアントが持つ専用の例外クラスで受けることもできます。

import boto3

rds = boto3.client("rds", region_name="ap-northeast-1")
try:
    rds.describe_db_instances(DBInstanceIdentifier="no-such-db")
except rds.exceptions.DBInstanceNotFoundFault as e:
    print(type(e).__name__, "/", e)
DBInstanceNotFoundFault / An error occurred (DBInstanceNotFound) when calling the DescribeDBInstances operation: DBInstance no-such-db not found.

例外クラスの名前は DBInstanceNotFoundFault、エラーコードの文字列は DBInstanceNotFound と、末尾の Fault の有無が違います。Code で比べるときは Fault なしの文字列を使います。

エラーと直し方の一覧

エラーコード 出る場面 直し方
InvalidDBInstanceState 停止済みに stop、稼働中に start 先にステータスを確認し、available なら stop、stopped なら start
DBInstanceNotFound 存在しないID、別リージョン IDの一覧と --region を確認
DBInstanceAlreadyExists 既存のIDで作成・復元 別のIDを指定する
DBSnapshotAlreadyExists 同じスナップショットIDで作成 日付・時刻を名前に入れる
DBSnapshotNotFound 存在しないスナップショットID describe-db-snapshots で一覧を確認
DBClusterNotFoundFault 存在しないクラスターID describe-db-clusters で一覧を確認

よくある質問

Q. エンドポイントだけを1行で取るには? A. aws rds describe-db-instances --db-instance-identifier (ID) --query 'DBInstances[0].Endpoint.Address' --output text です。ポートも要るときは [Endpoint.Address,Endpoint.Port] と並べます。

Q. 停止したままにしておくと、どうなりますか? A. 公式ユーザーガイドによると、連続で止めておけるのは最大7日で、7日たつと RDS が自動で起動します。長く使わない場合は、スナップショットを取って削除し、必要になったら復元する方法もあります。

Q. スナップショットから元のインスタンスに上書きで戻せますか? A. 復元は新しいインスタンスを作る操作です。復元先に別のIDを指定し、アプリケーションの接続先を新しいエンドポイントに切り替えます。

Q. Aurora に stop-db-instance を使えますか? A. Aurora はクラスター単位で stop-db-cluster / start-db-cluster を使います。接続先も describe-db-clusters の Endpoint と ReaderEndpoint から取ります。

まとめ

  • 状態と接続先は describe-db-instances。--query 'DBInstances[0].[Endpoint.Address,Endpoint.Port,DBInstanceStatus]' で必要な3つだけを抜ける
  • 作成・起動・復元のあとは wait db-instance-available。30秒ごとに確認し、available になるまで待つ
  • stop は available のときだけ、start は stopped のときだけ通る。それ以外は InvalidDBInstanceState
  • stopped 用の waiter はないので、ステータスを見るループで待つ
  • スナップショットの復元は新しいインスタンスの作成。セキュリティグループなどは復元時に指定する
  • 削除は --final-db-snapshot-identifier か --skip-final-snapshot のどちらかを指定。手動スナップショットは残るので個別に消す
  • Aurora はクラスター用のコマンド(stop-db-cluster、create-db-cluster-snapshot など)に読み替える

参考・出典

  • AWS CLI Command Reference「rds」「rds stop-db-instance」「rds wait db-instance-available」(docs.aws.amazon.com/cli/latest/reference/rds/)
  • Amazon RDS ユーザーガイド「Stopping an Amazon RDS DB instance temporarily」(docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_StopInstance.html)
  • Amazon RDS ユーザーガイド「Restoring to a DB instance」(docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_RestoreFromSnapshot.html)

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「AWS CLIでRDSを操作|起動・停止・スナップショット・接続先取得」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?