【发布时间】:2017-10-26 20:34:04
【问题描述】:
如果我在 AWS ECS(EC2 容器服务)中运行基于 docker 的容器,有没有一种方法可以从应用程序内部识别我的容器是否在 AWS ECS 上运行?这是必需的,因为我的 docker 容器可以在任何平台上运行,但是当它运行在 AWS ECS 上时,我需要执行一些额外的操作。
【问题讨论】:
标签: amazon-web-services docker containers amazon-ecs
如果我在 AWS ECS(EC2 容器服务)中运行基于 docker 的容器,有没有一种方法可以从应用程序内部识别我的容器是否在 AWS ECS 上运行?这是必需的,因为我的 docker 容器可以在任何平台上运行,但是当它运行在 AWS ECS 上时,我需要执行一些额外的操作。
【问题讨论】:
标签: amazon-web-services docker containers amazon-ecs
也许你可以使用Amazon ECS Container Agent Introspection:
Amazon ECS 容器代理提供了一个 API,用于收集有关运行代理的容器实例以及在该实例上运行的相关任务的详细信息。
您可以在容器实例中使用
curl命令查询 Amazon ECS 容器代理(端口 51678)并返回容器实例元数据或任务信息。
例如,在您的容器中:
[ec2-user ~]$ curl http://localhost:51678/v1/metadata
输出:
{
"Cluster": "default",
"ContainerInstanceArn": "<container_instance_ARN>",
"Version": "Amazon ECS Agent - v1.14.1 (467c3d7)"
}
OP in the comments 提到的另一个标准是 Instance MetaData and User Data
实例元数据是关于您的实例的数据,您可以使用它来配置或管理正在运行的实例。实例元数据分为类别。
要从正在运行的实例中查看所有类别的实例元数据,请使用以下 URI:
http://169.254.169.254/latest/meta-data/
请注意,您无需为用于检索实例元数据和用户数据的 HTTP 请求付费。
您可以使用诸如 cURL 之类的工具,或者如果您的实例支持它,则可以使用 GET 命令;例如:
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/
所以一个成功的curl 就足够了:
curl -sL -w "%{http_code}\\n" "http://169.254.169.254/latest/meta-data/" -o /dev/null
如果正常,将显示 200。
见“Linux script with curl to check webservice is up”
【讨论】:
经过多次反复试验,我发现以下最有帮助:
调用http://169.254.169.254/latest/meta-data/
如果您获得 200 OK,那么您可以假设您在 AWS EC2/ECS 中运行。
但是如果你没有得到 200 OK,那么你就没有在 AWS EC2/ECS 中运行。
【讨论】:
我已经尝试过在此回复之前发布的其他替代方案,但它们都不适用于 ECS。我不知道它是否发生了变化,但是现在,如果您想验证容器是否在 ECS 上运行,您应该致电:http://169.254.170.2/v2/metadata/
更多信息:https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v2.html
如果你想验证容器是否在 EC2 上运行,你应该调用:http://169.254.169.254/latest/meta-data/
更多信息:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html
【讨论】: