Невозможно получить доступ к метаданным экземпляра из задачи FARGATE

У меня есть задача AWS FARGATE, которая запускает относительно простое приложение Python (с образом Docker, созданным из python: 3.6-stretch). Она отлично работает с задачами Amazon EC2 (где хост EC2 предоставляет контейнер докеров); но я пытаюсь переместить их в FARGATE.

Когда я развертываю свои изображения в Fargate, они пытаются получить локальные данные IPv4, используя URL-адрес:

'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.

Что мне нужно сделать, чтобы задача FARGATE могла получить доступ к локальному адресу ссылки?

TIA!


person chander    schedule 16.07.2019    source источник
comment
В качестве примечания - когда AWS FARGATE запускает контейнер, он устанавливает переменную AWS_CONTAINER_CREDENTIALS_RELATIVE_URI. Убедитесь, что вы распространяете эту переменную на все вызываемые вами процессы (например, если вы запускаете cron), потому что в противном случае они не получат переменную и не смогут получить учетные данные.   -  person chander    schedule 11.09.2020


Ответы (2)


Я считаю, что это связано с тем, что вы используете неправильную конечную точку для 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

Надеюсь, это поможет :)

person Shawn Clake    schedule 16.07.2019
comment
Насколько я понимаю, конечная точка 169.254.170.2/v2/metadata предназначена для метаданных контейнера докеров. Мне нужны метаданные IAM, которых нет в метаданных докера. - person chander; 17.07.2019
comment
@chander - это метаданные ec2, а не IAM. Фаргейт - это не ec2. - person jordanm; 17.07.2019
comment
Хорошо. Я исправлюсь - docs.aws.amazon.com/ AmazonECS / latest / developerguide /, похоже, указывает, что 169.254.170.2 $ AWS_CONTAINER_CREDENTIALS_RELATIVE_URI можно использовать для получения учетных данных IAM. - person chander; 17.07.2019
comment
@ shawn-clake - хотите обновить свой ответ, чтобы сослаться на документ и правильный способ получения данных, и я могу отметить это как ответ? :-) Мне всегда неприятно видеть ответ, который мне нужно прочитать в комментариях, чтобы добраться до сути .. - person chander; 17.07.2019
comment
Спасибо. Просто примечание (на случай, если это поможет другим ...) Конечная проблема, с которой я столкнулся, заключалась в том, что у меня был небольшой код, который зависел от старой библиотеки Python Boto, а не от boto3. Очевидно, Бото был слишком стар, чтобы знать, как получить учетные данные; но бото3 был. Я удалил компонент, зависящий от boto, и заменил его на компонент boto3. Виола, теперь все работает .. - person chander; 17.07.2019
comment
@shawn, как получить public-ipv4? - person liorha; 30.12.2019

Вот версия python для получения учетных данных роли из контейнера Fargate. Хотя приведенный ниже код предназначен для корзины S3 (протестирован в декабре 2020 г.), этот принцип применим и к другим сервисам 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'])
    
person Sal    schedule 30.12.2020