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
相关产品推荐
相关产品推荐

