如何从Github Actions向私有网络内的Amazon EC2实例上传文件
解决方案汇总
以下是三种可落地的方案,不需要手动维护Github Actions全量IP白名单:
方案1:通过AWS Systems Manager Session Manager建立SSH隧道(最推荐)
该方案无需EC2实例开放公网SSH端口,也无需配置任何IP白名单,安全性最高。
- 前置准备:
- 给目标EC2实例绑定拥有SSM托管权限的IAM角色
- 给Github Actions运行环境配置拥有
ssm:StartSession权限的IAM凭证
- 操作流程:
- 在Github Actions运行环境中提前安装
session-manager-plugin - 配置SSH代理规则,让SSH流量默认走SSM隧道,参考配置示例:
Host i-* mi-* ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"- 直接使用scp/rsync命令,指定EC2实例ID作为地址即可完成文件上传,示例命令:
rsync -av ./local-file/ ec2-user@<EC2实例ID>:/remote/path/
- 在Github Actions运行环境中提前安装
方案2:动态调整安全组临时白名单
适合不想改动现有SSH访问逻辑的场景,仅在工作流运行期间开放当前运行节点的IP权限。
- 操作流程:
- 工作流启动后,先获取当前Github Actions运行节点的公网IP:
CURRENT_IP=$(curl -s https://api.ipify.org) - 调用AWS CLI给EC2对应的安全组添加临时入站规则,开放22端口给当前IP:
aws ec2 authorize-security-group-ingress --group-id <安全组ID> --protocol tcp --port 22 --cidr $CURRENT_IP/32 --tag-specifications 'ResourceType=security-group-rule,Tags=[{Key=Type,Value=GithubActionsTemp},{Key=WorkflowId,Value=${GITHUB_RUN_ID}}]' - 执行scp/rsync上传文件
- 上传完成后,不管任务成功失败,都执行规则清理命令删除临时白名单:
aws ec2 revoke-security-group-ingress --group-id <安全组ID> --protocol tcp --port 22 --cidr $CURRENT_IP/32
- 工作流启动后,先获取当前Github Actions运行节点的公网IP:
- 注意事项:建议额外配置定时任务,定期清理残留的临时安全组规则,避免工作流异常中断导致规则未被删除。
方案3:S3中转传输
适合大文件传输场景,全程不需要暴露EC2的SSH端口到公网。
- 操作流程:
- 工作流先把需要上传的文件同步到指定的私有S3桶
- 调用AWS SSM Run Command向目标EC2实例下发命令,主动从S3桶拉取对应文件到目标路径
- 可选:拉取完成后删除S3桶中的临时文件
内容的提问来源于stack exchange,提问作者Berimbolinho
相关产品推荐
相关产品推荐

