Terraform创建的Secrets Manager密钥无法连接Redshift求助
问题解决:Terraform创建的Secrets Manager密钥无法用于Python连接Redshift
问题根源
- Host字段格式错误:Terraform中直接使用
aws_redshift_cluster.redshift_cluster.endpoint作为host,该值包含端口(如cluster-name.xxx.region.redshift.amazonaws.com:5439),导致DNS解析时将带端口的字符串当作域名,无法识别。 - 缺少必要字段:手动创建的Redshift凭证密钥包含
dbname字段,而Terraform生成的密钥中缺失该字段,awswrangler连接时依赖此信息。 - 密钥类型标识缺失:手动创建的密钥会自动添加Redshift类型的标签,Terraform创建的普通密钥缺少这些标识,导致awswrangler无法正确识别凭证类型。
解决方案:修改Terraform代码
1. 修正Secrets Manager密钥的标签
给密钥添加Redshift类型标识标签,与手动创建的密钥保持一致:
# Creating a AWS secret for Redshift resource "aws_secretsmanager_secret" "redshiftcred" { name = "redshift" recovery_window_in_days = 0 tags = { "aws:secretsmanager:resource:type" = "redshift" "SecretType" = "REDSHIFT" } }
2. 修正Secret Version的字段内容
拆分endpoint获取纯主机名,添加dbname字段:
# Creating a AWS secret versions for Redshift resource "aws_secretsmanager_secret_version" "redshiftcred" { secret_id = aws_secretsmanager_secret.redshiftcred.id secret_string = jsonencode({ engine = "redshift" host = split(":", aws_redshift_cluster.redshift_cluster.endpoint)[0] username = aws_redshift_cluster.redshift_cluster.master_username password = aws_redshift_cluster.redshift_cluster.master_password port = "5439" dbname = aws_redshift_cluster.redshift_cluster.database_name dbClusterIdentifier = aws_redshift_cluster.redshift_cluster.cluster_identifier }) depends_on = [ aws_secretsmanager_secret.redshiftcred, aws_redshift_cluster.redshift_cluster ] }
3. 额外检查项
- 确认Redshift集群的安全组允许Python脚本所在环境访问5439端口。
- 验证运行Python脚本的IAM实体拥有
secretsmanager:GetSecretValue权限(你已通过手动密钥验证过权限,此步可快速排查异常)。
内容的提问来源于stack exchange,提问作者Amir Damirov
相关产品推荐
相关产品推荐

