Skip to content

Commit 251ebc1

Browse files
authored
DBI-609: Add IAM auth support for CDC pipes with AWS Auruora' (#4495)
1 parent 1e7a9a9 commit 251ebc1

4 files changed

Lines changed: 40 additions & 17 deletions

File tree

docker-compose-dev.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ x-flow-worker-env: &flow-worker-env
4747
# https://cloud.google.com/storage/docs/authentication/managing-hmackeys
4848
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID:-}
4949
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY:-}
50+
# Temporary AWS Credentials for local IAM auth testing
51+
AWS_SESSION_TOKEN: ${AWS_SESSION_TOKEN:-}
5052
# For GCS, set this to "auto" without the quotes
5153
AWS_REGION: ${AWS_REGION:-}
5254
# For GCS, set this as: https://storage.googleapis.com

flow/connectors/postgres/postgres_source.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,22 @@ func (c *PostgresConnector) CreateReplConn(ctx context.Context, env map[string]s
114114
}
115115

116116
func (c *PostgresConnector) SetupReplConn(ctx context.Context, env map[string]string) error {
117+
// For IAM-authenticated connections, force a fresh token before connecting.
118+
// This guarantees each activity retry uses a new token rather than a potentially
119+
// stale cached one (cache TTL 10 min; token validity 15 min).
120+
if c.rdsAuth != nil {
121+
host := c.Config.Host
122+
if c.Config.TlsHost != "" {
123+
host = c.Config.TlsHost
124+
}
125+
if _, err := c.rdsAuth.GetFreshRdsToken(ctx, utils.RDSConnectionConfig{
126+
Host: host,
127+
Port: c.Config.Port,
128+
User: c.Config.User,
129+
}, "POSTGRES"); err != nil {
130+
return fmt.Errorf("failed to refresh RDS IAM token before replication setup: %w", err)
131+
}
132+
}
117133
conn, wst, err := c.CreateReplConn(ctx, env)
118134
if err != nil {
119135
return err

flow/connectors/utils/aws.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ func getPeerDBAWSEnv(connectorName string, awsKey string) string {
216216
func LoadPeerDBAWSEnvConfigProvider(connectorName string) *StaticAWSCredentialsProvider {
217217
accessKeyId := getPeerDBAWSEnv(connectorName, "AWS_ACCESS_KEY_ID")
218218
secretAccessKey := getPeerDBAWSEnv(connectorName, "AWS_SECRET_ACCESS_KEY")
219+
sessionToken := getPeerDBAWSEnv(connectorName, "AWS_SESSION_TOKEN")
219220
region := getPeerDBAWSEnv(connectorName, "AWS_REGION")
220221
endpointUrl := getPeerDBAWSEnv(connectorName, "AWS_ENDPOINT_URL_S3")
221222
rootCa := getPeerDBAWSEnv(connectorName, "ROOT_CA")
@@ -238,6 +239,7 @@ func LoadPeerDBAWSEnvConfigProvider(connectorName string) *StaticAWSCredentialsP
238239
AWS: aws.Credentials{
239240
AccessKeyID: accessKeyId,
240241
SecretAccessKey: secretAccessKey,
242+
SessionToken: sessionToken,
241243
},
242244
EndpointUrl: endpointUrlPtr,
243245
}, region, rootCAs, tlsHost)

flow/connectors/utils/rds.go

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -86,23 +86,26 @@ func GetRDSToken(ctx context.Context, connConfig RDSConnectionConfig, rdsAuth *R
8686
logger.Info("Using cached RDS token for connector", slog.String("connector", connectorName))
8787
return rdsAuth.token, nil
8888
}
89-
return func() (string, error) {
90-
logger.Info("Generating new RDS token for connector", slog.String("connector", connectorName))
91-
rdsAuth.lock.Lock()
92-
defer rdsAuth.lock.Unlock()
93-
newUpdateTime := time.Now()
94-
if rdsAuth.updateTime.Add(RDSAuthTokenTTL).After(now) && rdsAuth.token != "" {
95-
return rdsAuth.token, nil
96-
}
97-
peerAWSCredentials := BuildPeerAWSCredentials(rdsAuth.AwsAuthConfig)
98-
token, err := buildRdsToken(ctx, connConfig, peerAWSCredentials, connectorName)
99-
if err != nil {
100-
return "", err
101-
}
102-
rdsAuth.token = token
103-
rdsAuth.updateTime = newUpdateTime
104-
return token, nil
105-
}()
89+
logger.Info("Generating new RDS token for connector", slog.String("connector", connectorName))
90+
return rdsAuth.GetFreshRdsToken(ctx, connConfig, connectorName)
91+
}
92+
93+
// GetFreshRdsToken bypasses the cache TTL and immediately fetches a new RDS IAM token.
94+
// Use this when a connection break requires a guaranteed-fresh token for reconnect.
95+
func (r *RDSAuth) GetFreshRdsToken(
96+
ctx context.Context,
97+
connConfig RDSConnectionConfig,
98+
connectorName string,
99+
) (string, error) {
100+
r.lock.Lock()
101+
defer r.lock.Unlock()
102+
token, err := buildRdsToken(ctx, connConfig, BuildPeerAWSCredentials(r.AwsAuthConfig), connectorName)
103+
if err != nil {
104+
return "", err
105+
}
106+
r.token = token
107+
r.updateTime = time.Now()
108+
return token, nil
106109
}
107110

108111
func buildRdsToken(

0 commit comments

Comments
 (0)