Boto3 попытается автоматически пройти аутентификацию с использованием ролей IAM, установленных в контейнере с помощью определения задачи ECS, и в случае неудачи вернется к использованию роли IAM, связанной с хостом EC2, на котором запущен контейнер.
Вы можете увидеть, какие роли IAM активны для каждой из них, добавив следующие команды на этапе сборки:
echo "EC2 IAM role"
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
echo
echo "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI = $AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
curl http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
Эти команды curl извлекают текущую роль IAM из метаданных EC2, а затем из метаданных контейнера. Env var AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
устанавливается автоматически для контейнеров, работающих под управлением ECS.
Если вы запустите эти команды на неконтейнерном этапе сборки, будут выведены две роли. Если бы вы запускали boto3 таким же образом, он предпочел бы роль контейнера, если бы он был найден, а затем откатился бы к роли EC2.
Теперь отметьте «Выполнить шаг в контейнере Docker» и укажите произвольный базовый образ, например library/python:2.7.15-stretch
.
На этот раз вы увидите, что выводится та же роль IAM EC2, но переменная AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
env не установлена, поэтому роль IAM контейнера не найдена. Нам нужна была роль IAM, которая была установлена в агенте сборки TeamCity.
В нашем случае, поскольку boto3 не нашла роль ECS IAM, она переключилась на роль IAM EC2, а у этой роли не было достаточных привилегий для выполнения операций boto, отсюда и сбой.
Исправление
Исправление состоит в том, чтобы использовать «Дополнительные аргументы запуска докера:» для пересылки env var из контейнера докера TeamCity в контейнер докера, который он запускает для выполнения шага сборки. Отредактируйте шаг сборки, содержащий тестовые команды, чтобы он имел:
-e AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
Теперь контейнер шага сборки будет правильно наследовать роль контейнера IAM контейнера агента сборки, а boto3 будет работать как положено.
person
tul
schedule
11.05.2018