InfraAcademy

InfraAcademy Blog

【AWS】FargateからRDSへ接続できない場合の対処方法

| #aws
Linuxをブラウザで試してみる

Linux・ネットワーク・AWSを、環境構築なしで実践学習できます

こんにちは、フルスタックエンジニアのryuです。

今回の記事では、AWS FargateからRDSへ接続できないときに確認したいポイントを、原因ごとに分けて解説します。

FargateからRDSへ接続できないと、「RDSのエンドポイントが間違っているのか」「セキュリティグループなのか」「データベース側の設定なのか」と、どこから確認すればよいのか分かりづらいと思います。

ただ、原因は大きく分けるとそれほど多くありません。まずはエラーの内容を見ながら、ネットワークの問題なのか、認証やデータベースの問題なのかを切り分けていきましょう。

FargateからRDSへ接続できない主な原因

FargateからRDSへ接続できない場合は、主に次のポイントを確認します。

  • RDSのエンドポイントやポート番号が間違っている
  • FargateとRDSのネットワーク経路に問題がある
  • RDSのセキュリティグループでFargateからの通信を許可していない
  • ユーザー名やパスワードが間違っている
  • 接続先のデータベースが作成されていない

特に多いのが、RDSのセキュリティグループです。

Fargateではタスクごとにネットワークインターフェースが割り当てられ、セキュリティグループを設定できます。そのため、「FargateのIPアドレスを調べてRDS側で許可する」のではなく、基本的にはFargateタスクに設定したセキュリティグループをRDS側の許可元に指定すると考えると分かりやすいです。

では、順番に確認していきましょう。

1. RDSのエンドポイントを確認する

最初に確認したいのが、アプリケーションに設定しているRDSの接続先です。

RDSのエンドポイントは、AWSマネジメントコンソールから対象のRDSを開き、「接続とセキュリティ」付近で確認できます。

例えばMySQLへ接続する場合、アプリケーション側では次のような情報を設定します。

DB_HOST=xxxxxxxx.ap-northeast-1.rds.amazonaws.com
DB_PORT=3306
DB_DATABASE=sample
DB_USERNAME=admin
DB_PASSWORD=********

ここでよくあるのが、DB_HOST に余計な文字を入れてしまうケースです。

RDSのエンドポイントには通常、https:// のようなスキームは付けません。また、フレームワークによってはエンドポイントとポート番号を別々に設定するため、ホスト名:3306 のように書くと接続できない場合があります。

まずは、タスク定義の環境変数やSecrets Managerなどに設定している値と、RDSの画面に表示されているエンドポイントを見比べてみてください。

2. FargateとRDSが通信できるネットワークになっているか確認する

次に、FargateとRDSのネットワークを確認します。

FargateのタスクとRDSを同じVPC内で利用している一般的な構成であれば、プライベートIPアドレスを使って通信できます。そのため、RDSをインターネットへ公開する必要はありません。

まず確認したいのは、Fargateのサービスまたはタスクに設定しているVPCと、RDSが所属しているVPCです。

同じVPCであれば、次にサブネットとルートテーブル、セキュリティグループを確認します。別VPCの場合は、VPC PeeringやTransit Gatewayなど、VPC間を通信できる経路が別途必要です。

「RDSへ接続できないから、とりあえずRDSをパブリックアクセス可能にする」という対応はおすすめしません。FargateとRDSをVPC内で通信させる構成なら、RDSはプライベートな状態のまま接続できます。

3. RDSのセキュリティグループを確認する

ここが最も重要です。

RDSにはセキュリティグループが設定されており、許可されていない通信はRDSまで届きません。

MySQLを利用している場合は3306番ポート、PostgreSQLなら5432番ポートなど、利用しているデータベースエンジンのポートを許可します。

このとき、RDS側のインバウンドルールには、Fargateタスクに設定しているセキュリティグループを送信元として指定する方法がおすすめです。

イメージとしては次のようになります。

Fargateタスク
  ↓
セキュリティグループ:sg-fargate
  ↓ MySQL 3306
RDS
  セキュリティグループ:sg-rds
  インバウンド:3306 / 送信元 sg-fargate

これなら、FargateタスクからRDSへの通信だけを許可できます。

上の画像はこの記事を作成した当時の設定画面ですが、3306番ポートを 0.0.0.0/0 に開放する設定は避けてください。 0.0.0.0/0 はすべてのIPv4アドレスを表すため、RDSが外部から到達できる構成では不要なアクセスまで許可してしまいます。

以前は「FargateのIPアドレスが変わるので 0.0.0.0/0 にする」と考えてしまいがちでした。しかし、Fargateではタスクにセキュリティグループを割り当てられるため、IPアドレスではなくセキュリティグループ同士で通信を許可できます。

なお、Fargate側のセキュリティグループでアウトバウンド通信を厳しく制限している場合は、RDSへのポートが許可されているかも確認してください。

4. エラーが「タイムアウト」なのか「Access denied」なのか確認する

接続エラーは、表示されているメッセージを見るだけでも原因をかなり絞れます。

例えば、接続が長時間待たされたあとにタイムアウトする場合は、セキュリティグループやVPC、サブネット、ルートなどのネットワーク設定を疑います。

一方、RDSまでは到達しているものの、次のような認証エラーが返ってくる場合は、ネットワークではなくユーザー名やパスワードを確認します。

Access denied for user ...

また、次のようなエラーであれば、指定しているデータベース名が存在しているか確認します。

Unknown database 'sample'

「RDSに接続できない」と一括りにするのではなく、RDSまで通信が届いていないのか、届いたあとに拒否されているのかを分けて考えるのがポイントです。

5. 初期データベースが作成されているか確認する

私が実際にハマったのが、この部分です。

RDSの「DBインスタンス識別子」を設定したため、それと同じ名前のデータベースが自動で作成されると思っていました。しかし、DBインスタンス識別子と、MySQLなどの中に作成されるデータベース名は別物です。

RDSを作成するときは、追加設定から初期データベース名を指定できます。

MySQLなど一部のデータベースエンジンでは、初期データベース名を指定しなかった場合、RDSインスタンス自体は作成されても、アプリケーションが利用するデータベースは自動作成されません。

その状態でアプリケーション側に、

DB_DATABASE=sample

のように存在しないデータベース名を設定していると、当然接続時にエラーになります。

RDS作成時に初期データベース名を指定するか、作成後にMySQLクライアントなどからRDSへ接続し、必要なデータベースを作成してください。

CREATE DATABASE sample;

6. タスク定義の環境変数も確認する

AWS側のネットワーク設定が正しくても、Fargateのタスク定義に古い接続情報が残っていることがあります。

例えば、RDSを作り直してエンドポイントが変わったのに、タスク定義では以前のエンドポイントを使っているケースです。環境変数を修正しただけで安心せず、新しいタスク定義のリビジョンがサービスへ反映されているかも確認しましょう。

パスワードについても、タスク定義へ直接書くより、AWS Secrets ManagerやSystems Manager Parameter Storeなどを利用して管理する方が安全です。

FargateからRDSへ接続できないときの確認順序

原因が分からないときは、次の順番で確認すると切り分けやすくなります。

  1. RDSのエンドポイントとポート番号
  2. FargateとRDSのVPC
  3. RDSのセキュリティグループ
  4. Fargate側のアウトバウンドルール
  5. DBユーザー名・パスワード
  6. 接続先データベース名
  7. タスク定義に最新の設定が反映されているか

特に「タイムアウトする」のか、「Access denied」や「Unknown database」のようなエラーが返ってくるのかで、見るべき場所が変わります。

AWSでは、VPC、サブネット、ルートテーブル、セキュリティグループなどが組み合わさって通信が成立しています。最初は設定項目が多く感じますが、それぞれの役割が分かるようになると、今回のような接続トラブルもかなり切り分けやすくなります。

InfraAcademyのAWS講座では、AWSを初めて触る方でも理解できるように、AWSの基本から順番に学べます。「設定手順だけではなく、なぜこの設定が必要なのかまで理解したい」という方は、あわせて活用してみてください。

まとめ

今回は、FargateからRDSへ接続できない場合の確認方法を解説しました。

接続できないときに、いきなり設定を変更していくと原因が分からなくなります。まずはエラー内容を確認し、ネットワークの問題なのか、認証やデータベースの問題なのかを切り分けていきましょう。

特に重要なのは、RDSのセキュリティグループです。FargateからRDSへ接続させるために、RDSのポートをインターネット全体へ開放する必要はありません。Fargateタスクのセキュリティグループを送信元として許可することで、必要な通信だけに絞ることができます。

あわせて、エンドポイント、データベース名、タスク定義の環境変数まで順番に確認していけば、原因を見つけやすくなります。

あわせて読みたい

Next Action

記事で読んだ内容を、講座で実装してみましょう

InfraAcademyでは、ブラウザ上でLinuxやネットワークの実践環境を使いながら学習できます。無料で始められる講座から、学習の流れを試せます。

この記事を書いた人

ryu

InfraAcademy運営 / エンジニア

エンジニア歴10年。Linux、ネットワーク、クラウドを中心に、実務で役立つインフラ技術を初心者にもわかりやすく解説しています。

X: @ryu63614894

Related

関連記事

ブログ一覧へ

Roadmap

まずはこの4講座から

ログインすれば無料で始められる講座です。気になったテーマから手を動かして学べます。

講座一覧を見る