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

EB部署时ebextension命令无法找到EC2中已存在文件的问题咨询

问题原因分析

这个问题的核心是Elastic Beanstalk扩展命令的执行时机和SSM Agent配置文件生成时机不匹配:

  • ebextensions中的commands是在EC2实例初始化的早期阶段执行的,此时实例还在完成基础系统配置,SSM Agent还没完成安装和初始化,所以/etc/sudoers.d/ssm-agent-users这个文件还没被创建出来。
  • 当你通过SSM会话连接到EC2实例时,实例已经完全启动,SSM Agent早就完成了安装和配置,对应的sudo授权文件也已经生成,所以你能看到这个文件。
解决方案

根据你想要在实例启动时自动禁用SSM访问的需求,推荐以下几种可行方案:

1. 使用container_commands替代commands

container_commands是在应用部署的后期阶段执行的,此时实例的基础服务(包括SSM Agent)都已经配置完成,目标文件肯定存在。修改你的ebextension配置如下:

container_commands:
  01-remove-ssm-sudo:
    command: "sed -i '/ssm-user ALL=(ALL) NOPASSWD:ALL/d' /etc/sudoers.d/ssm-agent-users"

注意:container_commands默认以root身份执行,不需要额外加sudo。

2. 彻底禁用SSM Agent(更直接的方式)

如果你的目标是完全阻止SSM访问,除了修改sudo配置,还可以直接停止并禁用SSM Agent服务,确保它无法运行:

commands:
  01-stop-disable-ssm-agent:
    command: "systemctl stop amazon-ssm-agent && systemctl disable amazon-ssm-agent"
    ignoreErrors: true  # 避免Agent未安装时命令报错导致部署失败

container_commands:
  01-cleanup-sudo-config:
    command: "sed -i '/ssm-user ALL=(ALL) NOPASSWD:ALL/d' /etc/sudoers.d/ssm-agent-users"

3. 通过IAM角色限制SSM访问(推荐最佳实践)

从权限层面彻底阻断SSM访问是最可靠的方式:修改Elastic Beanstalk实例关联的IAM角色,移除所有和SSM相关的权限策略(比如常见的AmazonSSMManagedInstanceCore)。

这种方式不需要修改实例上的任何配置,即使SSM Agent安装在实例上,没有IAM权限也无法建立SSM会话,安全性和可靠性更高。

备选方案:检查文件存在后再执行命令

如果你坚持要用commands,可以先判断文件是否存在,再执行修改命令,避免报错:

commands:
  01-remove-ssm-sudo:
    command: "if [ -f /etc/sudoers.d/ssm-agent-users ]; then sed -i '/ssm-user ALL=(ALL) NOPASSWD:ALL/d' /etc/sudoers.d/ssm-agent-users; fi"

不过这种方式依然可能因为文件生成延迟导致修改不生效,所以优先推荐前面的方案。

内容的提问来源于stack exchange,提问作者new-dev-123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:02:44