ECS fargate コンテナ上からRDS(MySQL)に接続する方法
はじめに
この記事は、すでにECS (Fargate) 上にプロジェクトのデプロイが完了したことを前提にしており、ECS (Fargate) 上に Nginx + PHP + Laravel の環境をデプロイした内容に焦点を当てています。
また、ECSのタスク定義とサービスの作成についてはコンソールではなく、AWS CLIを使用しています。
seederの実行について
の部分は自分で解決できなかったのでアドバイスいただけると助かります😭😭
RDSの作成
エンジンのオプション
エンジンのタイプ情報はMySQL
を選択してください。
テンプレート
今回は無料利用枠
を選択します。
設定
DBインスタンス識別子にはお好きな名前を設定してください。今回はdb
としています。
マスターユーザー名は編集せずにそのままadmin
、パスワードの自動生成にはチェックを入れました。
自動生成されたパスワードはこの後データベースの作成
を選択した後に画面の右上に以下のような表示がされるので、認証情報の詳細の表示
を選択することで確認できます。
以下の黒枠の部分が自動生成されたパスワードになります。この後確認することができなくなるため、メモしておいてください。
接続
Virtual Private Cloud (VPC)ではECSタスクと同じVPCを選択してください。選択後、DBサブネットグループはVPCのものに自動的に変更されると思います。
既存のVPCセキュリティグループは、default
の選択を外し、VPCと同じセキュリティグループを選択してください。
追加設定
最初のデータベース名を入力してください。今回はdb
とします。
上記全ての設定が終わったら、右下のデータベースの作成
を選択してください。
IAMロールとポリシーの設定
使用しているIAMロールにAmazonRDSFullAccess
ポリシーをアタッチしてください。
セキュリティグループの設定
セキュリティグループの設定ページで、以下のようなインバウンドルールを追加してください。
ソースは検索窓からECSのセキュリティグループを選択してください。
環境変数の設定
タスク定義のファイルの該当コンテナのenvironment
に以下を追記します。
"environment": [
{
"name": "DB_HOST",
"value": "<エンドポイント>"
},
{
"name": "DB_PORT",
"value": "3306" // データベースサーバーのポート番号を指定します。通常、MySQLデータベースの場合、ポート番号は3306します
},
{
"name": "DB_DATABASE",
"value": "db" // データベースの名前を指定。今回はdbとしたためdbを指定
},
{
"name": "DB_USERNAME",
"value": "admin" // データベースに接続するためのユーザー名
},
{
"name": "DB_PASSWORD",
"value": "<自動生成されたパスワード>"
}
],
DB_HOST
にはRDSのデータ詳細>接続とセキュリティ>エンドポイントから以下の黒塗りの部分を入力してください。
RDSに接続できたか確認する
ECS Execを使用してFargateコンテナにアクセスして接続を確認します。
今回はmigrate,seederを行い接続を確認します。
ECS Execを使用してFargateコンテナにアクセスする方法は、以下の記事を参考にしてください。
php artisan migrate
を実行すると以下のように表示されると思うので、yes
と入力してください。
seederの実行について(アドバイスいただきたいです!)
php artisan db:seed
またはphp artisan db:seed --class=<Seederクラス>
でseederを実行すると、ローカルで事前に作成したファイルではdoes not exist.
と表示され、実行できませんでした。
Execでアクセスした後にphp artisan make:seeder <Seederクラス>
を実行してSeederファイルを再度作成すると実行できました。
タイポかなと思ってのですが間違いが見つからず...わかる方がいれば教えていただけますと助かります🙇!
MySQLにアクセスしてデータが入っているか確認する
次のコマンドでアクセスしてください。
mysql -h <エンドポイント> -u <ユーザー名> -p <データベース名>
以下の表示がされると、接続に成功するとしています。
MySQL [db]>
で表示されているdb
は、MySQLデータベース内のデータベース名を表しています。
次のSQL文でデータベースにテーブルとデータが入っているか確認してください。
SHOW TABLES; // テーブルの一覧を表示
SELECT * FROM <テーブル名>; // テーブルの内容を表示
終わりに
何かありましたらお気軽にコメント等いただけると助かります。
ここまでお読みいただきありがとうございます🎉
Discussion