【问题标题】:Cannot access instance metadata from within a FARGATE Task无法从 FARGATE 任务中访问实例元数据
【发布时间】:2019-11-25 16:10:44
【问题描述】:

我有一个 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 网关,并且实例可以连接到互联网)。 IP 空间为 10.160.16.0/20 。

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

我需要做些什么来让 FARGATE 任务能够访问链接本地地址吗?

TIA!

【问题讨论】:

  • 请注意 - 当 AWS FARGATE 启动容器时,它会设置 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 变量。确保将该变量传播到您调用的任何进程(例如,如果您启动 cron),否则它们将无法获取 var 并且无法获取凭据。

标签: python amazon-web-services aws-fargate


【解决方案1】:

我认为这是因为您为 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

我希望这会有所帮助:)

【讨论】:

  • 我的理解是 169.254.170.2/v2/metadata 端点用于 docker 容器元数据。我需要 IAM 元数据——这在 docker 元数据中不可用。
  • @chander 这是 ec2 元数据,而不是 IAM。 Fargate 不是 ec2。
  • 好的。我的立场已得到纠正 - docs.aws.amazon.com/AmazonECS/latest/developerguide/… 似乎表明“169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI”可用于检索 IAM 凭证。
  • @shawn-clake - 想要更新您的答案以引用文档以及获取数据的正确方法,我可以将其标记为答案吗? :-) 我总是讨厌看到一个我需要通读 cmets 才能深入了解的答案。
  • @shawn,有什么方法可以获取 public-ipv4?
【解决方案2】:

这是从 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'])
    

【讨论】:

    猜你喜欢
    • 2022-11-14
    • 1970-01-01
    • 2020-01-31
    • 2020-08-07
    • 2021-10-31
    • 2019-04-06
    • 2018-01-22
    • 2019-08-14
    • 1970-01-01
    相关资源
    最近更新 更多