如何将AWS ECS容器实例升级至Amazon Linux 2优化AMI?
嘿,我刚好在几个月前完成了从Amazon Linux 1到Amazon Linux 2的ECS集群迁移,结合自己踩过的坑,给你补充一些关键注意事项和调试思路,帮你少走弯路:
Amazon Linux 2 ECS迁移关键注意事项与调试指南
一、系统服务与ECS代理适配
- AL2彻底抛弃了sysvinit,改用systemd管理所有服务,ECS代理也不例外。原来在AL1里用
service ecs start/restart的命令,现在要换成systemctl start/restart ecs.service。 - 如果你的CloudFormation模板里有自定义ECS代理配置(比如修改代理启动参数),不能再直接改init脚本了,得用systemd的drop-in配置:在
/etc/systemd/system/ecs.service.d/目录下创建.conf文件,添加自定义的ExecStart参数,比如调整代理的日志级别或者绑定的端口。 - 务必在UserData里加上
systemctl enable --now ecs.service,确保ECS代理开机自启,这一步我当初就差点忘,结果导致实例注册失败。
二、Docker日志收集方案调整
你提到的journald日志不兼容现有Cloud工具的问题,有两个靠谱的解决方向:
- 改回json-file驱动:在
/etc/docker/daemon.json里配置:
配置后执行{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }systemctl restart docker和systemctl restart ecs.service生效,这样日志就回到了你熟悉的/var/lib/docker/containers/目录结构,原有日志收集工具可以直接复用。 - 原生journald日志收集:如果想保留AL2的原生特性,可以用Fluent Bit(AWS现在主推这个)来收集journald日志,直接推送到CloudWatch。AL2的ECS优化AMI默认已经预装了Fluent Bit,只需要配置对应的systemd服务和CloudWatch权限就行,官方有现成的配置逻辑可以参考。
三、包管理与脚本依赖检查
- AL2的yum源包名和AL1有差异,比如原来的
python27包现在叫python2,gcc48换成了gcc。如果你的UserData脚本里有安装依赖包的命令,一定要逐个检查包名是否正确,我当初就是因为脚本里还在用python27导致安装失败,实例启动异常。 - AL2默认安装了Python3(不同AMI版本可能是3.7或3.8),如果你的自定义脚本依赖Python2,记得在脚本里先执行
yum install -y python2 python2-pip。
四、网络配置适配
- AL2用
systemd-networkd管理网络,原来AL1里的/etc/sysconfig/network-scripts/ifcfg-*配置文件不再生效。如果你的实例需要静态IP或者自定义路由,得在/etc/systemd/network/目录下创建.network配置文件,按照systemd-networkd的语法来写。不过如果是在VPC里用DHCP(大部分场景都是),这一步基本不用改,默认配置就能正常工作。
五、调试与排障实用技巧
- ECS代理状态排查:
- 用
systemctl status ecs.service快速查看代理是否正常运行,有没有启动失败的错误提示。 - 查看代理详细日志:
journalctl -u ecs.service -f(-f是实时跟踪日志),比AL1里的/var/log/ecs/ecs-agent.log更直观,能看到代理和ECS集群的交互过程。
- 用
- 容器日志排查:
- 如果用json-file驱动:直接去
/var/lib/docker/containers/<容器ID>/<容器ID>-json.log查看,或者用docker logs <容器名/ID>。 - 如果用journald:用
journalctl CONTAINER_NAME=<你的容器名>或者CONTAINER_ID=<容器ID>来过滤日志,非常方便。
- 如果用json-file驱动:直接去
- 实例注册验证:在实例上执行
curl http://localhost:51678/v1/metadata,如果返回正常的实例元数据,说明代理已经和ECS集群建立连接,注册成功;如果访问失败,大概率是代理没启动或者IAM权限有问题。 - CloudFormation脚本调试:把UserData里的命令都加上日志输出,比如
echo "Starting ECS proxy..." >> /var/log/userdata.log,这样脚本执行失败时,可以去/var/log/userdata.log里找具体的错误点。另外,用SSM参数/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id来自动获取最新的AL2 ECS优化AMI,避免硬编码AMI ID导致后续版本更新麻烦。
六、分步迁移建议
为了降低风险,建议按以下步骤来:
- 先搭建一个测试集群,用AL2的优化AMI部署你的任务定义,验证任务启动、日志收集、监控等核心功能是否正常。
- 逐步修改你的
ecs-cluster.yaml模板,替换AMI来源、调整UserData脚本、更新服务配置。 - 测试环境验证通过后,再用滚动更新的方式替换生产环境的ECS实例,确保业务不中断。
内容的提问来源于stack exchange,提问作者briancaffey




