You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨云环境下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:26:08