无法从 FARGATE 任务中访问实例元数据

Cannot access instance metadata from within a FARGATE Task

我有一个 AWS FARGATE 任务,它是 运行 一个相对简单的 python 应用程序(具有从 python:3.6-stretch 构建的 Docker 图像。)它使用 Amazon EC2 任务运行良好(其中 EC2 主机提供 docker 容器);但我正在尝试将这些移动到 FARGATE。

当我在 Fargate 中部署图像时,它们尝试使用 URL:

获取本地 IPv4 数据

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

我收到错误:

HTTPConnectionPool(host='169.254.169.254', port=80): Max retries exceeded with url: /latest/meta-data/local-ipv4 (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f086aa8d438>: Failed to establish a new connection: [Errno 22] Invalid argument',))

附带说明一下,我的 FARGATE 容器位于一个私有子网上(配置了一个 nat 网关,实例可以连接到 Internet)。 IP space 是 10.160.16.0/20 .

图像基于 python:3.6-stretch docker 图像。

我需要做些什么才能让 FARGATE 任务能够访问 link-本地地址吗?

TIA!

我认为这是因为您为 AWS Fargate 使用了错误的端点。根据下面列出的文档,您的 IP 是错误的。

使用 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 获取 IAM 元数据。

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html

希望对您有所帮助:)

这是从 Fargate 容器中获取角色凭证的过程的 python 版本。尽管下面的代码适用于 S3 存储桶(2020 年 12 月测试),但该原则也适用于其他 AWS 服务。只需为该服务启动您的 boto3 客户端,并使用正确的策略将正确的角色附加到 Fargate 任务。如果您感兴趣,相对凭据 URI 看起来类似于“/v2/credentials/xxxx-xxxx-xxxx-xxxx”(注意开头的正斜杠)。

creds_uri = os.environ.get('AWS_CONTAINER_CREDENTIALS_RELATIVE_URI')
r = requests.get('http://169.254.170.2{}'.format(creds_uri))
credentials = r.json()
s3_client = boto3.client('s3',
                         aws_access_key_id=credentials['AccessKeyId'],
                         aws_secret_access_key=credentials['SecretAccessKey'],
                         aws_session_token=credentials['Token'])