Skip to content

Commit ab12ae6

Browse files
committed
Support AWS RDS IAM Authentication for Redash database
1 parent 85f0019 commit ab12ae6

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

redash/models/base.py

+18
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import functools
22

3+
import boto3
34
from flask_sqlalchemy import BaseQuery, SQLAlchemy
45
from sqlalchemy.dialects.postgresql import UUID
6+
from sqlalchemy.engine import Engine
7+
from sqlalchemy.event import listens_for
58
from sqlalchemy.orm import object_session
69
from sqlalchemy.pool import NullPool
710
from sqlalchemy_searchable import SearchQueryMixin, make_searchable, vectorizer
@@ -42,6 +45,21 @@ def apply_pool_defaults(self, app, options):
4245
make_searchable(db.metadata, options={"regconfig": "pg_catalog.simple"})
4346

4447

48+
# IAM database authentication for AWS RDS
49+
# See https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html
50+
if settings.REDASH_DATABASE_IAM_AUTH:
51+
52+
@listens_for(Engine, "do_connect")
53+
def db_connect_hook(dialect, conn_rec, cargs, cparams):
54+
rds_client = boto3.client("rds")
55+
auth_token = rds_client.generate_db_auth_token(
56+
DBHostname=cparams["host"],
57+
Port=cparams["port"],
58+
DBUsername=cparams["user"],
59+
)
60+
cparams["password"] = auth_token
61+
62+
4563
class SearchBaseQuery(BaseQuery, SearchQueryMixin):
4664
"""
4765
The SQA query class to use when full text search is wanted.

redash/settings/__init__.py

+3
Original file line numberDiff line numberDiff line change
@@ -459,3 +459,6 @@ def email_server_is_configured():
459459

460460
# Email blocked domains, use delimiter comma to separated multiple domains
461461
BLOCKED_DOMAINS = set_from_string(os.environ.get("REDASH_BLOCKED_DOMAINS", "qq.com"))
462+
463+
# AWS
464+
REDASH_DATABASE_IAM_AUTH = parse_boolean(os.environ.get("REDASH_DATABASE_IAM_AUTH", "false"))

0 commit comments

Comments
 (0)