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

AWS上LAMP栈应用CI/CD流水线搭建:实现代码自动部署

无停机快速部署EC2上LAMP应用的CI/CD方案

针对你遇到的CodePipeline+CodeDeploy部署停机、耗时久的问题,推荐采用直接在EC2实例触发Git拉取+增量同步的轻量方案,跳过S3打包环节,同时实现无停机更新。以下是具体步骤:

一、配置EC2实例访问CodeCommit权限

让EC2能安全拉取CodeCommit仓库,推荐两种方式:

  • IAM角色授权:给EC2实例关联带codecommit:GitPull权限的IAM策略,策略示例:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "codecommit:GitPull",
                "Resource": "arn:aws:codecommit:<region>:<account-id>:<repo-name>"
            }
        ]
    }
    
    同时确保EC2实例能访问CodeCommit(私有子网需配置VPC端点或NAT网关)。
  • SSH密钥认证:在EC2上生成SSH密钥对,将公钥添加到CodeCommit用户的安全凭证中,拉取时使用SSH地址即可。

二、设置分支合并后的自动触发机制

当开发者合并代码到目标分支(如main)时,自动触发EC2上的部署脚本,推荐用CloudWatch Events + Lambda + SSM Run Command的组合(安全且无需开放额外端口):

  1. 创建Lambda函数:编写代码调用SSM Run Command执行EC2上的部署脚本,示例Python代码:
    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']}
    
    给Lambda角色添加AmazonSSMFullAccess(或更细粒度的权限)。
  2. 配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:42:04