RDS Proxy経由でRDSにつながらない場合対処法

RDS Proxy経由でRDSにつながらない場合対処法

RDS Proxyの設定は結構ややこしいです。

version
MySQL8.0.28

ターゲットグループの設定

RDS Proxy経由でRDSにつながらない場合対処法

関連付けられたデータベースが設定されているか確認します。されていない場合は、編集をクリックして設定します。

RDS Proxy経由でRDSにつながらない場合対処法

コマンドで接続状態を確認

LambdaからRDSには繋がるのにRDSProxy経由すると接続できない場合、コマンドで状態を確かめます。

$ aws rds describe-db-proxy-targets --db-proxy-name <プロキシ識別子>
{
    "Targets": [
        {
            "RdsResourceId": "xxxxxxx",
            "Port": 3306,
            "Type": "TRACKED_CLUSTER"
        },
        {
            "Endpoint": "xxxxxxx-instance-1.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com",
            "TrackedClusterId": "xxxxxxx",
            "RdsResourceId": "xxxxxxx-instance-1",
            "Port": 3306,
            "Type": "RDS_INSTANCE",
            "Role": "UNKNOWN",
            "TargetHealth": {
                "State": "UNAVAILABLE",
                "Reason": "PENDING_PROXY_CAPACITY",
                "Description": "DBProxy Target is waiting for proxy to scale to desired capacity"
            }
        }
    ]
}

DBProxy Target is waiting for proxy to scale to desired capacity

30分程度待ってから再度接続を試みてください。

            "TargetHealth": {
                "State": "UNAVAILABLE",
                "Description": "DBProxy Target unavailable due to an internal error"
            }

次に出るエラーがこのエラーだとセキュリティグループ周りのエラーです。

VPCLambda → RDS Proxy → RDSというフローなのでセキュリティグループの設定は以下の通りにします。

セキュリティグループタイプソース
VPCLambdaのセキュリティグループインバウンド未設定インバウンド未設定
RDSのセキュリティグループMYSQL/AuroraRDS Proxyのセキュリティグループ
RDS ProxyのセキュリティグループMYSQL/Aurora0.0.0.0/0

VPC Lambdaのセキュリティグループのインバウンドは未設定で問題ありません。

これで再度コマンド実行します。

$ aws rds describe-db-proxy-targets --db-proxy-name <プロキシ識別子>
{
    "Targets": [
        {
            // ....省略
            "Port": 3306,
            "Type": "RDS_INSTANCE",
            "TargetHealth": {
                "State": "AVAILABLE" // OK
            }
        }
    ]
}

これで接続OKです。

VPC Lambdaから接続

同じVPC上に配置したVPC Lambdaから接続します。

import * as mysql from 'promise-mysql'

export async function handler(event, context) {
    const conn = await mysql.createConnection({
        host: 'rdspro.proxy-cjvwtdcasc7l.ap-northeast-1.rds.amazonaws.com',
        port: 3306,
        user: 'admin',
        password: '12345678',
        database: 'mysql',
        dateStrings: true
      })
      const results = await conn.query('select * from mysql.user',[])
      console.log(results)
      await conn.end()
    return {
      statusCode: 200,
      body: 'Hello World!!!'
    }
  }

RDS Proxyのcloudwatchのログが出ていればVPC Lambdaからの接続はOKです。

RDS Proxy経由でRDSにつながらない場合対処法

ちなみにパスワード認証の場合はLambda側でのデータベースプロキシの追加は不要です。

RDS Proxy経由でRDSにつながらない場合対処法

ローカルからRDS Proxy接続は不可

ローカルにあるDBツール(A5M2やDBeavere)からRDS Proxyエンドポイントに接続することはできません。

RDSプロキシは、データベースと同じ仮想プライベートクラウド(VPC)内にある必要があります。プロキシは一般にはアクセスできませんが、データベースにはアクセスできます。例えば、ローカルホストでプロトタイピングを行っている場合、専用のネットワーキングを設定しない限り、RDS Proxyに接続することはできません。これは、ローカルホストがプロキシの VPC の外にあるためです。

Using Amazon RDS Proxy - Amazon Relational Database Service
Learn about Amazon RDS Proxy. RDS Proxy is a fully managed, highly available database proxy that uses connection pooling to share database connections securely ...

DBProxy Target unavailable due to an internal error

「DBProxy Target unavailable due to an internal error」エラーが出たらRDSProxyのセキュリティグループの設定ミスと思われます。

参考サイト

RDS Proxy のトラブルシューティング - Amazon Relational Database Service
RDS Proxy の問題をトラブルシューティングする方法について説明します。

https://qiita.com/mmmm/items/0486f6f4be44109b5e32

コメント

タイトルとURLをコピーしました