ECS 任务有没有办法检索它(任务)部署位置的 ec2 元数据?
Is there a way for an ECS Task to retrieve ec2 metadata of where it(the task) is deployed?
有没有办法让 ECS 任务能够获取其部署位置的 EC2 元数据?
从 AWS documentation of ec2 instance metadata 开始,当我在 ec2 实例本身内部时,我可以检索 EC2 实例元数据。我对获取 instance-id 更感兴趣并且可以通过命令
实现
curl http://169.254.169.254/latest/meta-data/instance-id
这只有在我直接转到 ec2 实例并执行 query/command 时才能实现,但是如果我想在执行 ECS 任务时获取 ec2 元数据,这将如何实现 运行 在 EC2 实例上?基于 AWS documentation of task metadata,我只能获取 ECS 任务本身的详细信息,但无法获取任务 运行 所在的 ec2 元数据。
这可能吗?
设置:
- ec2 实例在 ecs 集群中
- ecs 任务随机部署在集群内的任何 ec2 实例上
IP 为 169.254.169.254
的元数据端点仅用于检索 EC2 详细信息。
其中 169.254.170.2
用于检索 ECS 任务元数据。
您仍然应该能够在任务中调用 EC2 元数据端点并获取 EC2 详细信息。
在下面的示例设置中,我有一个 ECS 集群的 EC2 实例部分,上面有一个 nginx
任务 运行。
我通过 ssh'ed (docker exec -it ab8 /bin/sh
) 进入我的 nginx
任务并且仍然能够正确到达 EC2 元数据端点并获得 EC2 instanceId(i-0086xxxxxxxxxxx
).
现在,根据您的任务运行时(java、nodejs、python 等),您应该能够在任务中进行 EC2 元数据调用。
[root@ip-172-31-91-251 ec2-user]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab825479c673 ewoutp/docker-nginx-curl:latest "nginx" 11 minutes ago Up 11 minutes 0.0.0.0:80->80/tcp ecs-nginx-17-nginx-c6d8ba82f0afc3f96b00
c99dede7f091 amazon/amazon-ecs-agent:latest "/agent" 11 days ago Up 11 days ecs-agent
[root@ip-172-31-91-251 ec2-user]# docker exec -it ab8 /bin/sh
# curl http://169.254.169.254/latest/meta-data/instance-id -v
* Hostname was NOT found in DNS cache
* Trying 169.254.169.254...
* Connected to 169.254.169.254 (169.254.169.254) port 80 (#0)
> GET /latest/meta-data/instance-id HTTP/1.1
> User-Agent: curl/7.37.1
> Host: 169.254.169.254
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Content-Type: text/plain
< Accept-Ranges: bytes
< ETag: "916097910"
< Last-Modified: Tue, 30 Apr 2019 01:59:51 GMT
< Content-Length: 19
< Connection: close
< Date: Tue, 30 Apr 2019 02:07:38 GMT
< Server: EC2ws
<
* Closing connection 0
i-0086xxxxxxxxxxx
有没有办法让 ECS 任务能够获取其部署位置的 EC2 元数据?
从 AWS documentation of ec2 instance metadata 开始,当我在 ec2 实例本身内部时,我可以检索 EC2 实例元数据。我对获取 instance-id 更感兴趣并且可以通过命令
实现curl http://169.254.169.254/latest/meta-data/instance-id
这只有在我直接转到 ec2 实例并执行 query/command 时才能实现,但是如果我想在执行 ECS 任务时获取 ec2 元数据,这将如何实现 运行 在 EC2 实例上?基于 AWS documentation of task metadata,我只能获取 ECS 任务本身的详细信息,但无法获取任务 运行 所在的 ec2 元数据。
这可能吗?
设置:
- ec2 实例在 ecs 集群中
- ecs 任务随机部署在集群内的任何 ec2 实例上
IP 为 169.254.169.254
的元数据端点仅用于检索 EC2 详细信息。
其中 169.254.170.2
用于检索 ECS 任务元数据。
您仍然应该能够在任务中调用 EC2 元数据端点并获取 EC2 详细信息。
在下面的示例设置中,我有一个 ECS 集群的 EC2 实例部分,上面有一个 nginx
任务 运行。
我通过 ssh'ed (docker exec -it ab8 /bin/sh
) 进入我的 nginx
任务并且仍然能够正确到达 EC2 元数据端点并获得 EC2 instanceId(i-0086xxxxxxxxxxx
).
现在,根据您的任务运行时(java、nodejs、python 等),您应该能够在任务中进行 EC2 元数据调用。
[root@ip-172-31-91-251 ec2-user]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab825479c673 ewoutp/docker-nginx-curl:latest "nginx" 11 minutes ago Up 11 minutes 0.0.0.0:80->80/tcp ecs-nginx-17-nginx-c6d8ba82f0afc3f96b00
c99dede7f091 amazon/amazon-ecs-agent:latest "/agent" 11 days ago Up 11 days ecs-agent
[root@ip-172-31-91-251 ec2-user]# docker exec -it ab8 /bin/sh
# curl http://169.254.169.254/latest/meta-data/instance-id -v
* Hostname was NOT found in DNS cache
* Trying 169.254.169.254...
* Connected to 169.254.169.254 (169.254.169.254) port 80 (#0)
> GET /latest/meta-data/instance-id HTTP/1.1
> User-Agent: curl/7.37.1
> Host: 169.254.169.254
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Content-Type: text/plain
< Accept-Ranges: bytes
< ETag: "916097910"
< Last-Modified: Tue, 30 Apr 2019 01:59:51 GMT
< Content-Length: 19
< Connection: close
< Date: Tue, 30 Apr 2019 02:07:38 GMT
< Server: EC2ws
<
* Closing connection 0
i-0086xxxxxxxxxxx