如何从以 awsvpc 网络模式运行的 ECS 容器中获取我的 IP 地址?

Posted

技术标签:

【中文标题】如何从以 awsvpc 网络模式运行的 ECS 容器中获取我的 IP 地址?【英文标题】:How do I get my IP address from inside an ECS container running with the awsvpc network mode? 【发布时间】:2019-09-07 03:45:01 【问题描述】:

从以桥接模式运行的常规 ECS 容器,或从标准 EC2 实例,我通常运行

curl http://169.254.169.254/latest/meta-data/local-ipv4

检索我的 IP。

在以 awsvpc 网络模式运行的 ECS 容器中,我得到了底层 EC2 实例的 IP,这不是我想要的。我想要将 ENI 的地址附加到我的容器。我该怎么做?

【问题讨论】:

【参考方案1】:

AWS 容器代理将一个新的便利环境变量注入到 AWS ECS 中的每个容器中:$ECS_CONTAINER_METADATA_URI

这包含元数据端点的 URL,所以现在你可以这样做

curl $ECS_CONTAINER_METADATA_URI

输出看起来像

  
   "DockerId":"redact",
   "Name":"redact",
   "DockerName":"ecs-redact",
   "Image":"redact",
   "ImageID":"redact",
   "Labels":  ,
   "DesiredStatus":"RUNNING",
   "KnownStatus":"RUNNING",
   "Limits":  ,
   "CreatedAt":"2019-04-16T22:39:57.040286277Z",
   "StartedAt":"2019-04-16T22:39:57.29386087Z",
   "Type":"NORMAL",
   "Networks":[  
        
         "NetworkMode":"awsvpc",
         "IPv4Addresses":[  
            "172.30.1.115"
         ]
      
   ]

Networks 键下,您会找到IPv4Address

然后您的应用程序代码可以看起来像这样 (python)

METADATA_URI = os.environ['ECS_CONTAINER_METADATA_URI']
container_metadata = requests.get(METADATA_URI).json()
ALLOWED_HOSTS.append(container_metadata['Networks'][0]['IPv4Addresses'][0])

【讨论】:

【参考方案2】:
import * as publicIp from 'public-ip';

const publicIpAddress = await publicIp.v4(); // your container's public IP

【讨论】:

【参考方案3】:

来自 Amazon ECS 控制台:

    点击 点击 单击“任务”选项卡 点击 在那里查看网络详细信息

来自 CLI:

如果是EC2,登录实例并运行docker exec -it hostname -f 或者直接询问 ecs - ecs-cli ps --cluster < your cluster >

作为 VPC 连接的资源,在 EC2 模式下,它也列在:

EC2 集群实例 IP(即检查 EC2 实例详细信息) EC2 中的“网络接口”部分(搜索“arn:aws:ecs”的描述)

【讨论】:

以上是关于如何从以 awsvpc 网络模式运行的 ECS 容器中获取我的 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章

如何链接在 AWS ECS 任务中运行的 2 个容器

无法访问 AWS ECS EC2 实例中的端口

AWS ECS Fargate 和端口映射

在私有子网内的集群中运行 ECS 任务仍处于配置状态

ECS集群基于CPU/内存的扩缩容任务

可以从以长模式运行的 BSP 发送 SIPI 吗?