はじめに
結構前の話ですが VPC 内に CloudShell 環境を作ることが出来るようになってました。
従来はプライベートサブネット内の RDS へのアクセスは、Bastion host を ECS で構築しておいて ECS Exec する方法が主流だったと思いますが、CloudShell VPC environment であればコンテナを用意する必要が無いということになります。更に嬉しいことに mysql や psql コマンドが標準でインストールされています。
利用時の注意点として、ファイルのアップロード/ダウンロードが出来ないというのがあります。よって、RDS に dump データを流し込む際は S3 を経由するなどをする必要があります。
実際にやってみます。
構成
同じ VPC 内に RDS と CloudShell を用意することになります。
今回は dump ファイルを持っていきたいので S3 に sql ファイルをアップロードしておきます。プライベートサブネット内から S3 へのアクセスはゲートウェイエンドポイントを介して行います。

事前準備
必要なリソースをマネジメントコンソールから作成します。
VPC ネットワークの作成
VPC とその関連リソースを作成します。作成するリソースを「VPCなど」とすることで周辺のリソースも併せて作成出来ます。

プライベートサブネットがあれば良いのでいくつか作成しておきます。

VPC エンドポイントは S3 ゲートウェイエンドポイントが必要なのでここで一緒に作成するか、別で作成する必要があります。別で作成する場合はサブネットのルートテーブルに忘れずにアタッチしておきましょう。

RDS の作成
今回は MySQL を使います。先程作成した VPC リソースに合わせて VPC とサブネットを選択します。

セキュリティグループを新規作成する場合は、CloudShell のセキュリティグループからのインバウンドアクセスを許可するようにする必要があります。
S3 バケットの作成と dump ファイルのアップロード
S3 バケットを用意します。パブリックアクセスは off のままで OK です。
dump ファイルは今回は以下のものを利用します。
実行
CloudShell の起動
マネジメントコンソールにログインし、CloudShell を起動します。
画面上部のアイコンをクリックすると、画面下段に CloudShell が起動します。

アクションボタンをクリックして「Create VPC environment」を選択します。

VPC, Subnet, Security group は事前に作成したものを選択します。

dump ファイルのダウンロード
S3 にアップロードした dump ファイルをダウンロードしてきます。
~ $ aws --version aws-cli/2.32.3 Python/3.13.9 Linux/6.1.156-177.286.amzn2023.x86_64 exec-env/CloudShell exe/x86_64.amzn.2023
# S3 への疎通確認
~ $ aws s3 ls
# dump ファイルのダウンロード
~ $ aws s3 cp s3://{bucket-name}/world.sql ./world.sql
download: s3://{bucket-name}/world.sql to ./world.sql
~ $ ls world.sql
world.sqlこのとき、S3 への疎通が取れない場合は S3 ゲートウェイエンドポイントの作成に失敗しているかルートテーブルにアタッチしていないことが考えられます。
dump データのインポート
念の為、インポートの前に mysql コマンドで RDS と疎通を取ると良いでしょう。
~ $ mysql -h {database-endpoint} -u {user} -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.43 Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>うまくログイン出来ない場合は RDS が停止しているか、RDS のセキュリティグループのインバウンドルールが漏れている可能性があります。
mysql コマンドを使って dump データを RDS に流し込みます。
~ $ mysql -h {database-endpoint} -u {user} -p < ./world.sql
Enter password: インポートしたデータを確認します。
~ $ mysql -h {database-endpoint} -u {user} -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.43 Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| world |
+--------------------+
5 rows in set (0.005 sec)
MySQL [(none)]> use world
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MySQL [world]> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city |
| country |
| countrylanguage |
+-----------------+
3 rows in set (0.001 sec)
MySQL [world]> select * from city limit 10;
+----+----------------+-------------+---------------+------------+
| ID | Name | CountryCode | District | Population |
+----+----------------+-------------+---------------+------------+
| 1 | Kabul | AFG | Kabol | 1780000 |
| 2 | Qandahar | AFG | Qandahar | 237500 |
| 3 | Herat | AFG | Herat | 186800 |
| 4 | Mazar-e-Sharif | AFG | Balkh | 127800 |
| 5 | Amsterdam | NLD | Noord-Holland | 731200 |
| 6 | Rotterdam | NLD | Zuid-Holland | 593321 |
| 7 | Haag | NLD | Zuid-Holland | 440900 |
| 8 | Utrecht | NLD | Utrecht | 234323 |
| 9 | Eindhoven | NLD | Noord-Brabant | 201843 |
| 10 | Tilburg | NLD | Noord-Brabant | 193238 |
+----+----------------+-------------+---------------+------------+
10 rows in set (0.001 sec)
MySQL [world]> 問題なくインポートされていることが確認出来ました。
おわりに
CloudShell であればすぐに起動することが出来ますし、Bastion のように使用していない時間帯に停止する必要も無いので、今回のような用途であれば手軽に始められそうです。欠点としては、操作ログが標準では残らないので、ログを取得する仕組みを自前で用意する必要があることぐらいでしょうか。
最近は簡単な作業であれば CLI で、インフラの構築は CDK を利用することが多く、マネジメントコンソールを開いて CloudShell を使う機会がほとんどありませんでしたが、今後は使う頻度が増えそうです。
ちなみにスマホからも使えれば良いと思ったのですが、現在はモバイルアプリでは使えないようでした。

