如何让ASG实例的AMI启动时加载GitHub分支最新代码?
解决ASG实例启动时自动拉取GitHub最新代码并跳过主机确认的方案
一、提前处理Git主机确认问题
要避免实例启动时Git拉取代码出现已知主机确认提示,有两种可靠方案:
方案1:预加载GitHub SSH指纹(推荐,更安全)
制作基础AMI时,手动执行以下命令,将GitHub的SSH主机指纹写入实例的known_hosts文件:
ssh-keyscan github.com >> /home/ec2-user/.ssh/known_hosts # 对应EC2默认用户,根据实际用户调整 chmod 600 /home/ec2-user/.ssh/known_hosts chown ec2-user:ec2-user /home/ec2-user/.ssh/known_hosts
后续Git通过SSH拉取代码时,就不会弹出主机确认的交互提示。
方案2:配置Git跳过主机检查(简单但安全性稍低)
如果对安全要求不高,可在AMI中配置Git全局参数,强制跳过主机密钥检查:
git config --global core.sshCommand "ssh -o StrictHostKeyChecking=no"
二、配置私有仓库拉取凭证(若仓库非公开)
如果你的GitHub仓库是私有库,需要提前在AMI中配置拉取凭证:
- SSH密钥方式:将具有仓库拉取权限的SSH私钥(
id_rsa)放到实例的/home/ec2-user/.ssh/目录,设置权限为600,同时将对应公钥添加到GitHub账号的SSH密钥列表中。 - PAT方式:使用GitHub个人访问令牌(PAT),拉取地址改为
https://<你的PAT>@github.com/用户名/仓库名.git,无需配置SSH密钥。
三、添加实例启动脚本(User Data)
在Auto Scaling Group的启动配置/模板中,添加User Data脚本,让实例启动时自动拉取最新代码:
#!/bin/bash set -e # 遇到错误立即退出 # 定义代码目录和仓库信息 APP_DIR="/opt/your-app" REPO_URL="git@github.com:your-username/your-repo.git" TARGET_BRANCH="main" # 创建代码目录并切换 mkdir -p $APP_DIR cd $APP_DIR # 首次启动克隆仓库,后续启动拉取最新代码 if [ ! -d .git ]; then git clone -b $TARGET_BRANCH $REPO_URL . else git pull origin $TARGET_BRANCH fi # 可选:执行后续部署操作(比如安装依赖、启动服务) # cd $APP_DIR # npm install --production # systemctl enable --now your-app-service
四、可选优化:结合CodeBuild更新AMI
如果你希望进一步减少实例启动时的拉取时间,可在现有的CodeBuild流水线中添加步骤,每次代码推送后自动更新基础AMI:
- 在CodeBuild中完成代码构建、依赖安装后,使用Packer或EC2 Image Builder创建包含最新代码的AMI。
- 更新Auto Scaling Group的启动模板,指向新生成的AMI。
- 保留启动脚本中的
git pull作为兜底,确保实例启动时能获取到最新的代码变更。
内容的提问来源于stack exchange,提问作者Juan
相关产品推荐
相关产品推荐

