如何从S3存储桶正确使用AWS EC2 CodeDeploy部署Python脚本
AWS CodeDeploy 部署Python脚本(S3源)必知要点
核心结论:必须使用AppSpec文件
不管部署源是GitHub还是S3,AWS CodeDeploy都强制要求部署包根目录包含appspec.yml文件——它是CodeDeploy的核心配置,用来定义部署时的文件分发规则、各阶段执行的操作,没有它部署一定会失败,这和你之前从GitHub部署失败的原因一致。
部署包结构与配置步骤
1. 整理部署包文件
在本地创建一个目录,放入以下文件(所有文件直接放在根目录,不要嵌套子文件夹):
appspec.yml:CodeDeploy配置文件- 你的Python脚本(比如
my_script.py) requirements.txt(如果脚本有第三方依赖)- 配套的shell脚本(用来处理依赖安装、脚本启动/定时设置)
2. 编写最简appspec.yml(以Linux实例为例)
version: 0.0 os: linux files: # 定义要从S3复制到EC2实例的文件 - source: /my_script.py destination: /home/ec2-user/scripts/ - source: /requirements.txt destination: /home/ec2-user/scripts/ hooks: # 安装依赖阶段(部署后执行) AfterInstall: - location: install_deps.sh timeout: 300 runas: ec2-user # 启动/配置定时任务阶段 ApplicationStart: - location: setup_script.sh timeout: 300 runas: ec2-user
3. 编写配套shell脚本
install_deps.sh(安装Python依赖):
#!/bin/bash cd /home/ec2-user/scripts/ pip3 install -r requirements.txt
setup_script.sh(设置定时任务+可选立即运行):
#!/bin/bash # 可选:部署完成后立即运行一次脚本 python3 /home/ec2-user/scripts/my_script.py # 设置定时任务(示例:每3天凌晨0点运行,可根据需求调整) # 先备份现有crontab crontab -l > current_crontab 2>/dev/null # 添加新任务(输出日志到指定文件) echo "0 0 */3 * * python3 /home/ec2-user/scripts/my_script.py >> /home/ec2-user/scripts/script_logs.log 2>&1" >> current_crontab # 应用新的crontab配置 crontab current_crontab rm current_crontab
注意:给两个shell脚本添加可执行权限:
chmod +x install_deps.sh setup_script.sh
4. 打包上传到S3
把目录里的所有文件打包成ZIP包(不要把目录本身打包进去,确保ZIP根目录直接是上述文件),然后上传到你的S3存储桶。
5. 启动CodeDeploy部署
在CodeDeploy控制台选择S3作为部署源,指定ZIP文件的S3路径,选择已配置好的部署组即可启动部署。
关键注意事项
- EC2实例必须已安装CodeDeploy代理,否则无法接收部署指令
- 确保CodeDeploy服务角色有读取目标S3存储桶的权限
- 根据你的EC2实例操作系统(Linux/Windows)调整
appspec.yml的os字段和脚本内容
内容的提问来源于stack exchange,提问作者Sami Souayah
相关产品推荐
相关产品推荐

