Search code examples
dockeramazon-ecsaws-vpc

How do I get my IP address from inside an ECS container running with the awsvpc network mode?


From a regular ECS container running with the bridge mode, or from a standard EC2 instance, I usually run

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

to retrieve my IP.

In an ECS container running with the awsvpc network mode, I get the IP of the underlying EC2 instance which is not what I want. I want the address of the ENI attached to my container. How do I do that?


Solution

  • A new convenience environment variable is injected by the AWS container agent into every container in AWS ECS: ${ECS_CONTAINER_METADATA_URI}

    This contains the URL to the metadata endpoint, so now you can do

    curl ${ECS_CONTAINER_METADATA_URI}
    

    The output looks something like

    {  
       "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"
             ]
          }
       ]
    }
    

    Under the key Networks you'll find IPv4Address

    You application code can then look something like this (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])