boto3 не работает на этапе сборки TeamCity при запуске на этапе построения контейнера в агенте построения контейнера - PullRequest
0 голосов
/ 11 мая 2018

В нашей системе сборки используются агенты сборки TeamCity в контейнерах.В некоторых шагах сборки используется boto3, и чтобы избежать необходимости настраивать базовый образ агента сборки TeamCity для использования boto3, мы вместо этого используем функцию TeamCity «Выполнить шаг в контейнере Docker», чтобы указать образ python с boto3 и кучу других модулей python.установлен.

При выполнении шага сборки выдает ошибки boto3 из-за отсутствия разрешений, например:

botocore.exceptions.ClientError: An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.

Агент сборки работает в AWS с«Роль задачи», которая имеет достаточные разрешения, так почему она не работает?

1 Ответ

0 голосов
/ 11 мая 2018

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 будет работать должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...