跨云环境下Web应用连接私有子网RDS的部署及SSH隧道配置咨询
针对fly.io连接AWS私有子网RDS的SSH隧道部署方案
一、将SSH隧道整合到部署流程的推荐工作流
1. 把隧道作为应用启动的前置/伴随进程
fly.io支持自定义启动命令,你可以把隧道启动逻辑和应用启动绑定,确保应用就绪前隧道已打通。比如在fly.toml里配置:
[processes] app = "sh -c 'autossh -M 0 -i /tmp/bastion-key.pem -N -L 5432:$RDS_ENDPOINT:5432 $BASTION_IP & sleep 3; ./your-app'"
这里用autossh代替普通ssh,它会自动监控隧道状态,断开后自动重连,比手动维护隧道可靠得多。sleep 3是给隧道建立留缓冲时间,避免应用启动时隧道还未就绪。
2. 用fly.io Secrets管理配置参数
把堡垒机IP、RDS端点这类敏感/可变配置存在fly.io的Secret中,不要硬编码在配置文件或镜像里:
# 将配置存入Secret fly secrets set BASTION_IP="xx.xx.xx.xx" RDS_ENDPOINT="your-rds-instance.xxxxxx.region.rds.amazonaws.com"
启动命令直接引用这些环境变量,后续修改配置只需更新Secret,无需重新构建镜像。
3. 添加启动前的连通性检查
为避免应用因隧道未就绪启动失败,可在启动命令里加入端口连通性校验:
[processes] app = "sh -c 'autossh -M 0 -i /tmp/bastion-key.pem -N -L 5432:$RDS_ENDPOINT:5432 $BASTION_IP & until nc -zv localhost 5432; do sleep 1; done; ./your-app'"
until nc -zv localhost 5432会循环检查本地转发端口,直到连通才启动应用。
二、私钥的安全处理(绝对不要复制到镜像里!)
直接把PEM私钥打包进镜像属于严重安全风险,镜像一旦泄露,堡垒机权限就会暴露。推荐两种安全方案:
1. 用fly.io Secrets存储私钥内容
把私钥内容作为Secret存储,启动时写入临时文件并设置严格权限:
# 将本地私钥内容存入fly.io Secret fly secrets set BASTION_PRIV_KEY="$(cat your-bastion-key.pem)"
然后在启动命令里处理私钥:
[processes] app = "sh -c 'echo \"$BASTION_PRIV_KEY\" > /tmp/bastion-key.pem && chmod 600 /tmp/bastion-key.pem && autossh -M 0 -i /tmp/bastion-key.pem -N -L 5432:$RDS_ENDPOINT:5432 $BASTION_IP & until nc -zv localhost 5432; do sleep 1; done; ./your-app'"
chmod 600是必须的,SSH要求私钥文件权限不能对其他用户开放,否则会拒绝使用。
2. 用AWS SSM会话管理器替代SSH私钥(更安全)
完全抛弃SSH私钥,用AWS SSM会话管理器建立端口转发,步骤如下:
- 给堡垒机EC2实例附加带有
AmazonSSMManagedInstanceCore权限的IAM角色,确保实例能被SSM管理。 - 在fly.io应用镜像中安装AWS CLI(可在Dockerfile里添加安装步骤)。
- 给fly.io应用配置AWS访问密钥(同样存入fly.io Secret:
fly secrets set AWS_ACCESS_KEY_ID="xxx" AWS_SECRET_ACCESS_KEY="xxx"),该密钥需要拥有ssm:StartSession权限。 - 启动命令替换为SSM端口转发:
[processes] app = "sh -c 'aws ssm start-session --target $BASTION_EC2_ID --document-name AWS-StartPortForwardingSession --parameters \"{\\\"portNumber\\\": [\\\"5432\\\"], \\\"localPortNumber\\\": [\\\"5432\\\"]}\" & until nc -zv localhost 5432; do sleep 1; done; ./your-app'"
这种方式完全无需管理私钥,所有认证通过AWS IAM完成,安全级别更高。
额外安全建议
- 堡垒机的安全组仅允许fly.io的出站IP段访问22端口(或SSM端口),可在AWS控制台查询fly.io的IP范围并配置安全组规则,缩小攻击面。
- 定期轮换AWS访问密钥或SSH私钥,降低泄露风险。
内容的提问来源于stack exchange,提问作者Morris
相关产品推荐
相关产品推荐

