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

won*_*ton 4 amazon-ecs docker aws-vpc

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

curl http://169.254.169.254/latest/meta-data/local-ipv4
Run Code Online (Sandbox Code Playgroud)

检索我的IP。

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

won*_*ton 13

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

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

curl ${ECS_CONTAINER_METADATA_URI}
Run Code Online (Sandbox Code Playgroud)

输出看起来像

{  
   "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"
         ]
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

在钥匙下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])
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这只是私有 IP 地址,而不是公共 IP 地址。 (3认同)