I’d like to use IMDSv2 inside a container running on an EC2 instance.
I want to use the tokens because they are required in my metadata options:
metadata_options {
http_tokens = "required"
http_endpoint = "enabled"
}
Calling the API from the EC2 instance returns my token as expected.
curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"
However, if I try to call it from a docker container:
docker run -it curlimages/curl sh
/ $ curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"
curl: (56) Recv failure: Connection reset by peer
I just have a timeout.
According to this answer, it should work out of the box, but it’s not. If I add a --network=host
flag, it works, but that’s not a solution for me.
Thanks
2
Answers
I order to access IMDSv2 metadata from a docker container, you must increase the hop limit for IMDSv2 in the instance metadata configuration. From the aws docs:
To change the hop limit, you can use
modify-instance-metadata-options
in awscli:In case of in does not really work, you can try to increase the hop limit value.
Our context is: RKE2 + cilium on EC2 instances.
We have increase the hop limit from 2 to 3 and it works.
With hop limit=2
After increased hop-limit=3