- AWS
AWS CLIでRDSを操作|起動・停止・スナップショット・接続先取得
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期連続の黒字決算。