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, но env var AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
не задан, и поэтому роль IAM контейнера не найдена. Мы хотели, чтобы роль IAM была установлена для агента сборки TeamCity.
В нашем случае, поскольку boto3 не нашел роль IAM в ECS, он вернулся к роли IAM в EC2, и у этой роли не было достаточных привилегий для выполнения операций boto, что привело к ошибке.
Исправление
Исправление заключается в том, чтобы использовать «Дополнительные аргументы запуска docker:» для пересылки env var из docker-контейнера TeamCity в docker-контейнер, который он запускает для выполнения шага сборки. Отредактируйте шаг сборки, содержащий тестовые команды, чтобы они имели:
-e AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
Теперь контейнер шага сборки будет правильно наследовать роль IAM контейнера контейнера агента сборки, и boto3 будет работать должным образом.