You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将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工具的问题,有两个靠谱的解决方向:

  1. 改回json-file驱动:在/etc/docker/daemon.json里配置:
    {
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "10m",
        "max-file": "3"
      }
    }
    
    配置后执行systemctl restart dockersystemctl restart ecs.service生效,这样日志就回到了你熟悉的/var/lib/docker/containers/目录结构,原有日志收集工具可以直接复用。
  2. 原生journald日志收集:如果想保留AL2的原生特性,可以用Fluent Bit(AWS现在主推这个)来收集journald日志,直接推送到CloudWatch。AL2的ECS优化AMI默认已经预装了Fluent Bit,只需要配置对应的systemd服务和CloudWatch权限就行,官方有现成的配置逻辑可以参考。

三、包管理与脚本依赖检查

  • AL2的yum源包名和AL1有差异,比如原来的python27包现在叫python2gcc48换成了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>来过滤日志,非常方便。
  • 实例注册验证:在实例上执行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导致后续版本更新麻烦。

六、分步迁移建议

为了降低风险,建议按以下步骤来:

  1. 先搭建一个测试集群,用AL2的优化AMI部署你的任务定义,验证任务启动、日志收集、监控等核心功能是否正常。
  2. 逐步修改你的ecs-cluster.yaml模板,替换AMI来源、调整UserData脚本、更新服务配置。
  3. 测试环境验证通过后,再用滚动更新的方式替换生产环境的ECS实例,确保业务不中断。

内容的提问来源于stack exchange,提问作者briancaffey

火山引擎 最新活动