📘

ECS fargate コンテナ上からRDS(MySQL)に接続する方法

2023/09/27に公開

はじめに

この記事は、すでに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に以下を追記します。

task-definition.json
"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コンテナにアクセスする方法は、以下の記事を参考にしてください。
https://zenn.dev/nenenemo/articles/9f66924801114c

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