在调用ssm.ap-southeast-2.amazonaws.com时,ECS似乎挂起。下面是它挂起的调试结果
2020-06-11 22:47:10,831 - MainThread - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (2): ssm.ap-southeast-2.amazonaws.com:443这在EC2实例上可以很好地工作。就在ECS任务容器内不工作,连接被超时。
这背后的原因是什么?
发布于 2020-06-11 14:08:03
在EC2实例上工作良好
嗯..。我认为你的容器是IMDSv2的受害者。请允许我解释一下。
实例元数据是有关实例的数据,可用于配置或管理正在运行的实例。实例元数据分为类别,例如主机名、事件和安全组。可以通过调用以下URL来查询实例元数据:
http://169.254.169.254/latest/meta-data/2019年11月19日,实例元数据服务的v2发布。EC2实例元数据服务版本2 (IMDSv2)引入的特性之一是“防止开放的第3层防火墙和NAT”1,它在包含秘密令牌的低级别IP数据包上设置1的TTL (或跳限2),这样数据包只能跨越一个主机。TTL为1意味着实例无法将数据包转发到运行在ECS容器实例上的Docker容器,因为这将被视为另一跳。
来自1
对于IMDSv2,将TTL值设置为“1”意味着来自EC2实例本身的请求将工作,因为它们在减法发生之前返回给调用方(在实例上)。但是,如果EC2实例被错误地配置为开放路由器、第三层防火墙、VPN、隧道或NAT设备,则包含令牌的响应在离开实例之前将其TTL降为零,并且包含响应的数据包在离开实例时将被丢弃,从而阻止向攻击者传输。这些信息不会比EC2实例本身更深入,这意味着攻击者将无法获得带有令牌的响应,以及访问实例元数据的能力,即使他们已经成功地通过了所有其他防御措施。
此更改的一个结果是,在桥或AWSVPC模式下运行在ECS实例上的Docker容器不再能够查询元数据端点。下列请求将超时:
$ curl -X PUT -H "x-aws-ec2-metadata-token-ttl-seconds: 120" "http://169.254.169.254/latest/api/token"如果使用AWS,它有一个IMDSv1的回退机制,但是经过长时间的延迟(5秒),这使得它相当不可用。
出发地:https://github.com/aws/aws-sdk-js/issues/3024#issuecomment-589135606:
从v2.575.0开始,SDK被配置为默认为IMDSv2工作流,默认情况下,将尝试三次(每次尝试超时1秒)以获得所需的令牌。如果三次尝试都失败,SDK将返回到IDMSv1工作流。
备选案文1(谨慎使用)
可以使用“修改-实例-元数据-选项”对容器实例进行3. AWS调用,通过为--http-put-响应-hop限制标志指定一个值,从而将TTL更改为更高的值。
以下AWS命令在EC2实例上运行时将值修改为“2”:
$ aws ec2 modify-instance-metadata-options --instance-id $(curl 169.254.169.254/latest/meta-data/instance-id) --http-put-response-hop-limit 2 --http-endpoint enabled..。之后,对令牌端点的curl命令从Docker容器中成功执行。
可以从自动标注生命周期挂钩调用Lambda函数,以便使用ModifyInstanceMetadataOptions api调用在任何启动实例上配置值“2”。另一种选择是将此命令放在EC2实例的UserData中,这样每个实例都可以使用更新的跳限制“自我配置”自己。请注意,在这种情况下,实例配置文件应该有与'ec2:ModifyInstanceMetadataOptions‘权限相关联的策略,这样调用才能成功。
备选案文2(建议)
关于ECS,从容器访问实例凭据并不是最佳实践,相反,建议是设置一个任务角色,并使用AWS_CONTAINER_CREDENTIALS_RELATIVE_URI环境变量从ECS代理检索容器特定的凭据,例如使用"curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI“命令,直到最新版本的AWS默认使用此方法”。
您可以在这里阅读更多有关任务角色凭据的信息,4.。任务元数据的一个类似端点也是可用的5。
在这里可以找到更多的讨论:
https://stackoverflow.com/questions/62324816
复制相似问题