boto3 не работает на этапе сборки TeamCity при запуске на этапе сборки контейнера в агенте сборки контейнера

Наша система сборки использует контейнерные агенты сборки 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 с «задачной ролью», имеющей достаточные разрешения, так почему же он не работает?


person tul    schedule 11.05.2018    source источник


Ответы (1)


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