MagicStack / MagicStack/asyncpg
Unable to connect to RDS Proxy
- Dominant language
- Python
- Stars
- 8.1k
- Forks
- 468
- PR merge metrics
- No merged PRs in 30d
Description
asyncpg=0.26.0
postgres=13.4
We're trying to connect to RDS through and RDS proxy with IAM auth and it doesn't work. We've verified that the provided code works fine when connecting straight to the database with IAM auth. We've also tested that we can connect through the proxy to the database. The only piece that does not work is asyncpg. This also works when using aiopg.
EDIT:
I suspect that it's something with SSL but we've gotten nowhere pretty fast on it. The logs on RDS Proxy don't say anything other than Internal Error which is very.... unhelpful.
```python
import asyncio
import aiopg
import asyncpg
import boto3
import os
import sys
import ssl
import certifi
from urllib.parse import quote_plus
ENDPOINT=""
PORT="5432"
USER=""
REGION="us-east-1"
DBNAME=""
session = boto3.Session(profile_name='profile')
client = session.client('rds')
token = client.generate_db_auth_token(DBHostname=ENDPOINT, Port=PORT, DBUsername=USER, Region=REGION) # type: ignore
async def main():
try:
print("trying connection")
conn = await asyncpg.connect(dsn=f"postgres://{USER}:{quote_plus(token)}@{ENDPOINT}:5432/{DBNAME}?sslmode=require&sslrootcert=./AmazonRootCA1.pem")
#conn = await asyncpg.connect(user=USER, password=quote_plus(token), database=DBNAME, host=ENDPOINT, ssl='require')
print("connected, trying query")
print(await conn.fetch("SELECT 'connected'"))
except Exception as e:
print("CAUSE", e.__cause__)
raise
# async with aiopg.connect(f'dbname={DBNAME} user={USER} password={token} host={ENDPOINT} sslmode=require') as conn:
# async with conn.cursor() as cur:
# await cur.execute("SELECT 'connected'")
# async for row in cur:
# print(row)
asyncio.run(main())
```
The error we get back is
```
Traceback (most recent call last):
File "/tmp/test/__init__.py", line 50, in
asyncio.run(main())
File "/usr/lib/python3.10/asyncio/runners.py", line 44, in run
return loop.run_until_complete(main)
File "/usr/lib/python3.10/asyncio/base_events.py", line 646, in run_until_complete
return future.result()
File "/tmp/test/__init__.py", line 35, in main
conn = await asyncpg.connect(dsn=f"postgres://{USER}:{quote_plus(token)}@{ENDPOINT}:5432/{DBNAME}?sslmode=require&sslrootcert=./AmazonRootCA1.pem")
File "/home/charles/.local/lib/python3.10/site-packages/asyncpg/connection.py", line 2093, in connect
return await connect_utils._connect(
File "/home/charles/.local/lib/python3.10/site-packages/asyncpg/connect_utils.py", line 889, in _connect
return await _connect_addr(
File "/home/charles/.local/lib/python3.10/site-packages/asyncpg/connect_utils.py", line 776, in _connect_addr
return await __connect_addr(params, timeout, False, *args)
File "/home/charles/.local/lib/python3.10/site-packages/asyncpg/connect_utils.py", line 839, in __connect_addr
await compat.wait_for(connected, timeout=timeout)
File "/home/charles/.local/lib/python3.10/site-packages/asyncpg/compat.py", line 66, in wait_for
return await asyncio.wait_for(fut, timeout)
File "/usr/lib/python3.10/asyncio/tasks.py", line 445, in wait_for
return fut.result()
asyncpg.exceptions.ConnectionDoesNotExistError: connection was closed in the middle of operation```
Contributor guide
No contributing guide indexed for this repository
Research direction
Start by running the provided Python reproducer with asyncpg 0.26.0 against the RDS Proxy, then trace the connection path through asyncpg.connect and asyncpg.connect_utils._connect. Compare its IAM-authenticated SSL connection with the working direct PostgreSQL and aiopg cases. Done means identifying whether asyncpg can connect through the proxy and documenting or correcting the failing behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- aws, postgresql, python
- Domain
- databases
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100