GitLab托管版CI/CD配置Alembic自动升级AWS RDS Postgres实例
我之前在GitLab托管版上配置Alembic连接AWS RDS Postgres的时候,也碰到过一模一样的问题——没法精准白名单Runner IP,又不想把证书提交到仓库。给你分享几个我亲测有效的方案:
方案1:用GitLab CI/CD变量存储证书内容,临时生成文件
这是最直接的方案,利用GitLab的敏感变量存储证书内容,在流水线执行时临时写入文件:
- 先获取AWS RDS的根证书(比如
rds-ca-2019-root.pem),把证书的全部内容复制下来。 - 打开GitLab项目的「Settings -> CI/CD -> Variables」,添加一个名为
RDS_CA_CERT的变量,粘贴证书内容,同时勾选「Mask variable」和「Protect variable」来保护敏感信息。 - 在
.gitlab-ci.yml中添加前置步骤,把变量内容写入临时文件:
before_script: # 将证书内容写入临时文件 - echo "$RDS_CA_CERT" > /tmp/rds-ca.pem
- 修改Alembic的配置(可以是
alembic.ini或者env.py),指定SSL参数:- 如果用
alembic.ini:
sqlalchemy.url = postgresql+psycopg2://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?sslmode=verify-full&sslrootcert=/tmp/rds-ca.pem- 如果用
env.py动态生成连接:
from sqlalchemy import create_engine import os db_url = ( f"postgresql+psycopg2://{os.getenv('DB_USER')}:{os.getenv('DB_PASSWORD')}" f"@{os.getenv('DB_HOST')}:{os.getenv('DB_PORT')}/{os.getenv('DB_NAME')}" "?sslmode=verify-full&sslrootcert=/tmp/rds-ca.pem" ) engine = create_engine(db_url) - 如果用
方案2:借助AWS Secrets Manager管理证书和凭证
如果你的团队已经在使用AWS Secrets Manager,用它来统一管理证书和数据库凭证会更安全,也方便后续更新:
- 将RDS根证书内容(或证书文件)上传到AWS Secrets Manager,创建一个独立的Secret;同时把数据库的用户名、密码也存入另一个Secret。
- 在GitLab变量中添加AWS访问密钥(
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY),同样勾选敏感保护选项。 - 在流水线中通过AWS CLI拉取证书和凭证:
before_script: # 拉取RDS证书并写入临时文件 - aws secretsmanager get-secret-value --secret-id rds-ca-cert --query SecretString --output text > /tmp/rds-ca.pem # 拉取数据库凭证并设置为环境变量 - DB_CRED=$(aws secretsmanager get-secret-value --secret-id db-production-creds --query SecretString --output text) - export DB_USER=$(echo "$DB_CRED" | jq -r '.username') - export DB_PASSWORD=$(echo "$DB_CRED" | jq -r '.password')
- 后续的Alembic配置和方案1一致,指向临时证书文件即可。
方案3:直接下载AWS官方RDS根证书
如果你的RDS实例使用的是AWS官方提供的根证书,可以直接在流水线中下载,不需要提前存储:
before_script: # 下载AWS最新的RDS根证书 - curl -o /tmp/rds-ca.pem https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem
注意:AWS会定期更新根证书,需要关注官方通知,及时更新下载链接。
几个关键注意事项
- SSL模式选择:建议使用
sslmode=verify-full,这是最安全的配置,会验证证书的真实性以及服务器主机名是否匹配,避免中间人攻击。 - 临时文件安全:GitLab Runner的每个Job都是独立运行在容器或虚拟机中,Job结束后所有临时文件会被自动销毁,不用担心证书残留。
- 敏感变量保护:所有涉及凭证、密钥、证书的变量,一定要勾选「Mask variable」防止在日志中泄露,勾选「Protect variable」限制仅在保护分支中使用。
内容的提问来源于stack exchange,提问作者gwoody1984
相关产品推荐
相关产品推荐

