AWS上LAMP栈应用CI/CD流水线搭建:实现代码自动部署
无停机快速部署EC2上LAMP应用的CI/CD方案
针对你遇到的CodePipeline+CodeDeploy部署停机、耗时久的问题,推荐采用直接在EC2实例触发Git拉取+增量同步的轻量方案,跳过S3打包环节,同时实现无停机更新。以下是具体步骤:
一、配置EC2实例访问CodeCommit权限
让EC2能安全拉取CodeCommit仓库,推荐两种方式:
- IAM角色授权:给EC2实例关联带
codecommit:GitPull权限的IAM策略,策略示例:
同时确保EC2实例能访问CodeCommit(私有子网需配置VPC端点或NAT网关)。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codecommit:GitPull", "Resource": "arn:aws:codecommit:<region>:<account-id>:<repo-name>" } ] } - SSH密钥认证:在EC2上生成SSH密钥对,将公钥添加到CodeCommit用户的安全凭证中,拉取时使用SSH地址即可。
二、设置分支合并后的自动触发机制
当开发者合并代码到目标分支(如main)时,自动触发EC2上的部署脚本,推荐用CloudWatch Events + Lambda + SSM Run Command的组合(安全且无需开放额外端口):
- 创建Lambda函数:编写代码调用SSM Run Command执行EC2上的部署脚本,示例Python代码:
给Lambda角色添加import boto3 def lambda_handler(event, context): ssm_client = boto3.client('ssm') # 替换为你的EC2实例ID和部署脚本路径 response = ssm_client.send_command( InstanceIds=['i-xxxxxxxxx'], DocumentName='AWS-RunShellScript', Parameters={'commands': ['bash /var/www/scripts/deploy.sh']} ) return {'command_id': response['Command']['CommandId']}AmazonSSMFullAccess(或更细粒度的权限)。 - 配置CloudWatch Event规则:
- 事件源选择
CodeCommit,事件类型为CodeCommit Repository State Change - 指定目标仓库和分支(如
main),触发条件设为分支有推送事件(合并操作会触发推送) - 目标选择刚才创建的Lambda函数
- 事件源选择
三、编写EC2上的无停机部署脚本
在EC2实例的/var/www/scripts/目录下创建deploy.sh,实现增量同步和无停机更新,示例脚本:
#!/bin/bash set -e # 出错时终止脚本 # 配置参数 REPO_URL="https://git-codecommit.<region>.amazonaws.com/v1/repos/<your-repo>" TARGET_DIR="/var/www/html" BACKUP_DIR="/var/www/backups" TMP_DEPLOY_DIR="/tmp/lamp-deploy" TARGET_BRANCH="main" # 创建备份目录 mkdir -p $BACKUP_DIR # 备份当前代码(部署失败可回滚) BACKUP_FILE="$BACKUP_DIR/html-backup-$(date +%Y%m%d%H%M).tar.gz" tar -czf $BACKUP_FILE $TARGET_DIR # 拉取最新代码到临时目录 rm -rf $TMP_DEPLOY_DIR git clone $REPO_URL $TMP_DEPLOY_DIR cd $TMP_DEPLOY_DIR git checkout $TARGET_BRANCH # 增量同步代码到网站根目录,排除不必要文件 rsync -av --delete \ --exclude='.git' \ --exclude='tests/' \ --exclude='.env.example' \ $TMP_DEPLOY_DIR/ $TARGET_DIR/ # 安装生产依赖(如果用Composer) cd $TARGET_DIR composer install --no-dev --optimize-autoloader # 重载PHP-FPM(避免重启服务导致停机) systemctl reload php-fpm # 清理临时文件 rm -rf $TMP_DEPLOY_DIR echo "部署完成,备份文件路径: $BACKUP_FILE"
给脚本添加执行权限:chmod +x /var/www/scripts/deploy.sh
四、关键优化点(解决原方案痛点)
- 跳过S3打包:直接从CodeCommit拉取代码,省去上传下载包的耗时
- 无停机更新:用
rsync增量同步文件,systemctl reload php-fpm重载服务而非重启,避免服务中断 - 快速回滚:脚本自动备份当前代码,若部署失败可通过解压备份文件快速恢复
内容的提问来源于stack exchange,提问作者Megh Vora
相关产品推荐
相关产品推荐

