CloudShell VPC environment で RDS に dump を流し込む

はじめに

結構前の話ですが VPC 内に CloudShell 環境を作ることが出来るようになってました。

Amazon VPC AWS CloudShell での の使用 - AWS CloudShell
VPC での CloudShell の使用に関するガイダンスを提供します。これには、運用上の制約、CloudShell VPC 環境を作成する手順、作成と使用に必要な IAM アクセス許可が含まれます。

従来はプライベートサブネット内の RDS へのアクセスは、Bastion host を ECS で構築しておいて ECS Exec する方法が主流だったと思いますが、CloudShell VPC environment であればコンテナを用意する必要が無いということになります。更に嬉しいことに mysql や psql コマンドが標準でインストールされています。

利用時の注意点として、ファイルのアップロード/ダウンロードが出来ないというのがあります。よって、RDS に dump データを流し込む際は S3 を経由するなどをする必要があります。

実際にやってみます。

構成

同じ VPC 内に RDS と CloudShell を用意することになります。

今回は dump ファイルを持っていきたいので S3 に sql ファイルをアップロードしておきます。プライベートサブネット内から S3 へのアクセスはゲートウェイエンドポイントを介して行います。

AWS Cloud の中の VPC にPrivate subnet がある。その中に RDS と CloudShell が入っており、相互に矢印で結線している。S3 は VPC の外に配置され、dump.sql が重なっている。CloudShell と S3 は Gateway を介して結線している。

事前準備

必要なリソースをマネジメントコンソールから作成します。

VPC ネットワークの作成

VPC とその関連リソースを作成します。作成するリソースを「VPCなど」とすることで周辺のリソースも併せて作成出来ます。

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

プライベートサブネットの数の選択肢の2を選択している

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

VPCエンドポイントの選択肢のなしを選択している

RDS の作成

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

RDSのネットワーク設定画面

セキュリティグループを新規作成する場合は、CloudShell のセキュリティグループからのインバウンドアクセスを許可するようにする必要があります。

S3 バケットの作成と dump ファイルのアップロード

S3 バケットを用意します。パブリックアクセスは off のままで OK です。

dump ファイルは今回は以下のものを利用します。

https://dev.mysql.com/doc/index-other.html

実行

CloudShell の起動

マネジメントコンソールにログインし、CloudShell を起動します。

画面上部のアイコンをクリックすると、画面下段に CloudShell が起動します。

CloudShell のアイコンが赤枠で示されている

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

Create VPC environment が赤枠で示されている

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

Create a VPC environment の設定画面

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 を使う機会がほとんどありませんでしたが、今後は使う頻度が増えそうです。

ちなみにスマホからも使えれば良いと思ったのですが、現在はモバイルアプリでは使えないようでした。

AWS CloudShell 概念 - AWS CloudShell
AWS CloudShell インターフェイスのナビゲーションを示します。
タイトルとURLをコピーしました