我有一个AWS FARGATE任务,该任务正在运行一个相对简单的python应用程序(具有从python:3.6-stretch构建的Docker映像。)使用Amazon EC2 Tasks可以正常运行(其中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!
答案 0 :(得分:0)
我相信这是因为您为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
我希望这会有所帮助:)
答案 1 :(得分:0)
这是从 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'])