无需CodeDeploy时是否可通过AWS CLI直接向EC2实例传输zip部署包
方案可行性结论
完全可行,无需依赖AWS CodeDeploy即可直接将zip包传输到已完成环境配置的EC2实例,AWS本身提供原生CLI命令支持直接文件传输,也可以搭配轻量中转方案适配Jenkins流水线场景。
1. AWS CLI原生直接传输命令
你可以使用AWS EC2 Instance Connect的文件传输功能实现直接上传,不需要提前在本地留存EC2的SSH密钥,权限通过IAM统一控制,安全性更高。目前AWS官方的主流系统AMI默认已经预装EC2 Instance Connect组件,未预装的实例手动安装对应组件即可使用。
命令示例:
aws ec2-instance-connect send-file \ --instance-id <你的EC2实例ID> \ --region <实例所属AWS区域> \ --local-file-path ./本地打包完成的zip包路径 \ --remote-file-path /EC2上的目标存储路径/xxx.zip \ --os-user <实例登录用户名>
说明:实例登录用户名根据系统镜像决定,Amazon Linux系列默认是ec2-user,Ubuntu默认是ubuntu;执行命令的IAM身份需要配置ec2-instance-connect:SendFile权限,EC2安全组仅需开放出站HTTPS访问,不需要额外开放入站SSH端口;该命令仅支持AWS CLI v2版本,CLI v1环境需要先升级版本
2. 适配Jenkins流水线的两种落地实现
你已经在EC2内部署好了带运行环境的Docker容器,传输完成后可以直接执行后续部署动作,以下是两种生产常用的流水线方案:
- 方案1:EC2 Instance Connect 全链路操作
先执行上述send-file命令传输zip包,再调用EC2 Instance Connect推送临时SSH公钥,执行远程部署命令即可,参考命令:# 推送临时SSH公钥,有效期60秒 aws ec2-instance-connect send-ssh-public-key \ --instance-id <你的EC2实例ID> \ --region <实例所属AWS区域> \ --instance-os-user <实例登录用户名> \ --ssh-public-key file://~/.ssh/id_rsa.pub # 执行远程部署命令 ssh <实例登录用户名>@<实例公网IP> "cd /目标存储路径 && unzip xxx.zip && docker compose up -d --build" - 方案2:S3中转+SSM远程执行(更稳定,适合大体积包)
不用开放EC2任何入站端口,安全性和传输稳定性更高,流程如下:- Jenkins打包完成后执行
aws s3 cp ./本地zip包路径 s3://你的存储桶路径/xxx.zip上传到S3 - 调用SSM Run Command让EC2主动拉取包并执行部署,参考命令:
aws ssm send-command \ --instance-ids <你的EC2实例ID> \ --document-name "AWS-RunShellScript" \ --parameters 'commands=["aws s3 cp s3://你的存储桶路径/xxx.zip /目标路径/xxx.zip", "cd /目标路径 && unzip xxx.zip && docker compose up -d --build"]' \ --region <实例所属AWS区域> - Jenkins打包完成后执行
说明:该方案需要EC2实例关联的IAM角色配置S3读取权限和SSM托管权限,同时实例需要预装SSM Agent(官方AMI默认预装)
注意事项
- 所有涉及IAM权限的操作,遵循最小权限原则配置即可
- 部署流程中可以增加zip包哈希值校验步骤,避免传输过程中文件损坏导致部署失败
内容的提问来源于stack exchange,提问作者Anton Cavanaugh
相关产品推荐
相关产品推荐

