亚马逊云国际账号 国际AWS亚马逊云私有镜像制作

亚马逊aws / 2026-04-25 16:13:14

下载.png

为什么非得自己做私有AMI?别被官方文档绕晕了

先说句大实话:AWS控制台里那个「Create Image」按钮,点下去容易,用起来真不一定靠谱——尤其是当你需要批量部署、合规审计、或把一套跑得飞起的生产环境原样复制到另一套VPC时。官方AMI就像盒装方便面,能吃,但调料包永远少一包;而私有AMI,是你亲手熬了三小时的高汤底料+手擀面+溏心蛋,端出来就是标准答案。

我见过太多人踩坑:有人用默认Ubuntu镜像装完JDK、Nginx、Python一堆东西,直接打AMI,结果下次启动发现/tmp里堆着5G临时日志、~/.ssh/authorized_keys里还留着自己测试用的密钥、甚至MySQL root密码明文写在/etc/my.cnf里……这哪是镜像?这是安全隐患压缩包。

动手前:三问自己,省下两小时排错时间

第一问:你到底想固化什么?

不是所有东西都该打进AMI。操作系统补丁?该打。公司内部证书?该放。但应用数据、数据库文件、用户上传目录?千万别!AMI本质是「系统快照」,不是「数据备份」。建议只固化:基础OS层(含内核参数)、运行时环境(Java/Node/Python版本)、中间件(Nginx配置模板、Redis systemd服务单元)、安全基线(fail2ban规则、UFW策略)、以及统一日志轮转脚本。其余,交给UserData或Ansible。

第二问:实例选型是否匹配目标场景?

别图便宜选t3.micro打AMI——它内存小、磁盘I/O弱,打包过程可能因OOM直接卡死。推荐起步用m5.large(2vCPU+8GB),哪怕最终部署用t3.small,制作镜像时也请「高配起步,低配交付」。另外注意:ARM64(Graviton)和x86_64镜像不互通,选错架构=白干。

第三问:网络与安全组是否已「脱敏」?

启动实例时,务必禁用「Auto-assign Public IP」,安全组只开SSH(22端口)且限制源IP段(比如你的办公IP)。别让一台正在做镜像的机器暴露在公网——曾经有位同事忘了关,凌晨三点被扫出27个暴力破解会话,第二天镜像里直接多了3个可疑用户……

实战四步法:从裸机到可复用AMI

第一步:干净启动 + 基础加固

亚马逊云国际账号 用AWS最新版Amazon Linux 2023或Ubuntu 22.04 LTS启动实例(别用老古董16.04)。登录后立刻执行:

sudo apt update && sudo apt upgrade -y  # Ubuntu
# 或
sudo dnf update -y  # AL2023
sudo systemctl enable --now unattended-upgrades  # Ubuntu自动更新
sudo ufw enable && sudo ufw default deny incoming  # 防火墙兜底
sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo systemctl restart sshd

顺手删掉默认用户(ubuntu/ec2-user)的家目录下.bash_history.viminfo——这些文件会记录你执行过的每条命令,包括带密码的curl、mysql连接串。

第二步:装软件 + 配环境(但别留「指纹」)

装JDK?用tar.gz手动解压到/opt/java,别用apt install openjdk-17-jdk——后者会在/var/log/apt/history.log里记下安装时间、包名、甚至你当时用的代理地址。装Nginx?配置文件里别写server_name your-dev-server.local,换成server_name _;,用反向代理逻辑解耦主机名。

关键技巧:所有配置文件修改后,立即执行sudo chown root:root /etc/nginx/nginx.conf && sudo chmod 644 /etc/nginx/nginx.conf。AMI打包时若发现文件属主是普通用户,AWS可能拒绝创建(尤其涉及systemd服务时)。

第三步:深度清理 + 解绑服务

这是90%的人跳过的致命步骤:

  • 清空所有日志:sudo journalctl --vacuum-size=1M && sudo truncate -s 0 /var/log/*.log
  • 删除SSH主机密钥:sudo rm -f /etc/ssh/ssh_host_*(否则所有用此AMI启动的实例,SSH指纹全一样!)
  • 清空/var/lib/cloud/instances/(Cloud-init缓存,否则新实例启动时会复用旧元数据)
  • 停用并禁用cloud-init:sudo systemctl stop cloud-init && sudo systemctl disable cloud-init(防止后续实例重复初始化)

最后执行:sudo aws s3 cp s3://your-bucket/cleanup-script.sh /tmp/ && sudo bash /tmp/cleanup-script.sh——把清理逻辑写成脚本存S3,确保每次流程一致。

第四步:创建AMI + 验证可用性

回到控制台,右键实例 →「Create image」,填名称如prod-web-ubuntu2204-v2.3.1-20240520(含版本号+日期,别用「latest」这种玄学命名)。勾选「No reboot」——AWS会静默快照,比重启更安全。

AMI生成后,立刻启动一台新实例验证:
• 检查SSH能否连通(别用密钥对,试试SSM Session Manager)
• 运行curl -I http://localhost看Nginx是否响应
• 执行java -version确认JDK路径和版本
sudo ss -tlnp | grep :8080确认应用端口监听正常

验证通过?恭喜,你拥有了第一个真正意义上的「可交付AMI」。

进阶操作:跨区共享、加密与权限锁死

跨区域复制?别直接Copy,先Check再Copy

在us-east-1打好AMI后,想同步到ap-northeast-1?别急着点「Copy AMI」。先去目标区域检查KMS密钥是否存在(若源AMI用了加密EBS卷,目标区必须有同名KMS key)。更稳妥做法:在目标区新建一个未加密AMI,用aws ec2 register-image命令手动注册,指定--block-device-mappings映射加密卷,全程可控。

权限最小化:谁都不能乱删你的AMI

默认情况下,你账户下所有人(包括刚入职的实习生)都能删除AMI。解决方案:用Resource-based Policy锁定。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "ec2:DeregisterImage",
      "Resource": "arn:aws:ec2:us-east-1:123456789012:image/ami-0abcdef1234567890",
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "AROA...:admin-role",
            "AIDA...:your-personal-id"
          ]
        }
      }
    }
  ]
}

粘贴进AMI的「Modify Image Permissions」→「Add statement」,从此只有指定角色/用户能注销它。

最后送你三条血泪经验

1. 版本号不是摆设:给AMI加语义化版本(v1.2.0),比「web-server-final-2」强一百倍。CI/CD流水线靠它自动拉取,审计时靠它追溯变更。

2. 别信「一次制作,永久有效」:Linux内核每月更新,OpenSSL漏洞半年爆发一次。建议设置Lambda定时任务,每月扫描所有AMI的CVE漏洞(用Amazon Inspector),超期未更新的自动标记为「Deprecated」。

3. 文档比代码重要:在AMI描述栏里写清楚:基于哪个基础镜像、安装了哪些组件及版本、清理脚本S3路径、已知限制(如「不支持IPv6」、「需手动挂载EFS」)。别等三个月后自己重装时,对着控制台发呆。

做完这些,你交出去的就不是一张镜像,而是一份可审计、可回滚、可传承的云基础设施契约。下次老板说「再起十台一样的」,你敲一行aws ec2 run-instances --image-id ami-xxx,然后泡杯茶,看进度条走完——这才是云原生该有的体面。

Telegram售前客服
客服ID
@cloudcup
联系
Telegram售后客服
客服ID
@yanhuacloud
联系