Спинакер + доступ ECR

У меня проблемы с настройкой Spinnaker с доступом ECR.

Справочная информация: я установил спинакер с помощью helm на кластер EKS и подтвердил, что кластер имеет необходимые разрешения ECR (путем ручного запуска команд ECR из модуля clouddriver). Я следую приведенным здесь инструкциям, чтобы настроить Spinnaker + ECR: https://www.spinnaker.io/setup/install/providers/docker-registry/

Проблема. Когда я бегаю:

hal config provider docker-registry account add my-ecr-registry \
--address $ADDRESS \
--username AWS \
--password-command "aws --region us-west-2 ecr get-authorization-token --output text --query 'authorizationData[].authorizationToken' | base64 -d | sed 's/^AWS://'"

Получаю следующий результат:

+ Get current deployment
  Success
- Add the some-ecr-registry account
  Failure
Problems in default.provider.dockerRegistry.some-ecr-registry:
- WARNING Resolved Password was empty, missing dependencies for
  running password command?
- WARNING You have a supplied a username but no password.
! ERROR Unable to fetch tags from the docker repository: code, 400
  Bad Request
? Can the provided user access this repository?
- WARNING None of your supplied repositories contain any tags.
  Spinnaker will not be able to deploy any docker images.
? Push some images to your registry.
Problems in halconfig:
- WARNING There is a newer version of Halyard available (1.28.0),
  please update when possible
? Run 'sudo apt-get update && sudo apt-get install
  spinnaker-halyard -y' to upgrade
- Failed to add account some-ecr-registry for provider
  dockerRegistry.
  • Я подтвердил, что aws-cli установлен на модуле clouddriver. И я подтвердил, что могу вводить пароль напрямую из модуля облачного драйвера, и он успешно возвращает токен.
  • Я также подтвердил, что если я вручную сгенерирую токен ECR и run hal config provider docker-registry account add my-ecr-registry --address $ADDRESS --username AWS --password-command "echo $MANUALLY_GENERATED_TOKEN" все будет работать нормально. Итак, есть что-то специфическое для команды пароля, которая работает неправильно, и я не уверен, как это отладить.
  • Еще одно странное поведение: если я упрощу команду пароля до: hal config provider docker-registry account add some-ecr-registry --address $ADDRESS --username AWS --repositories code --password-command "aws --region us-west-2 ecr get-authorization-token", я получу дополнительный фрагмент вывода, который говорит "- WARNING Password command returned non 0 return code stderr/stdout was:bash: aws: command not found". Этот вывод появляется только для этой упрощенной команды.

Мы будем очень благодарны за любые советы о том, как отладить это.


person diego_c    schedule 22.11.2019    source источник
comment
Если эта команда работает aws --region us-west-2 ecr get-authorization-token --output text --query 'authorizationData[].authorizationToken' | base64 -d | sed 's/^AWS://, я бы просто отправил ее в переменную PASSWORD="aws --region us-west-2 ecr get-authorization-token --output text --query 'authorizationData[].authorizationToken' | base64 -d | sed 's/^AWS://" и использовал бы как в run hal config provider docker-registry account add my-ecr-registry --address $ADDRESS --username AWS --password-command "echo $PASSWORD".   -  person Mark Watney    schedule 25.11.2019


Ответы (2)


Я также установил Spinnaker на AKS, и все, что я сделал, это использовал управляющего пользователя AWS с правильной политикой AWS IAM для ECR: * У меня есть доступ к репозиториям ECR напрямую. Я не думаю, что hal, основанный на java, выполнит команду Bash в --password-command

  • установите AWS ECS provider в своем развертывании спинакера.
  • Используйте следующую политику AWS IAM (SpinnakerManagingPolicy), чтобы присоединиться к пользователю AWS MAnaging, чтобы предоставить доступ к ECR. Пожалуйста, замените учетные записи AWS в соответствии с вашими потребностями.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:*",
                "cloudformation:*",
                "ecr:*"                
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::123456789012:role/SpinnakerManagedRoleAccount1",
                "arn:aws:iam::101121314157:role/SpinnakerManagedRoleAccount2",
                "arn:aws:iam::202122232425:role/SpinnakerManagedRoleAccount3"
            ],
            "Effect": "Allow"
        }
    ]
}
person Andre Leon Rangel    schedule 04.03.2020

Если, как и я, ваш реестр ECR находится в другой учетной записи, вы должны принудительно взять на себя роль целевой учетной записи, в которой находится ваш реестр.

passwordCommand: read -r AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN <<< `aws sts assume-role --role-arn arn:aws:iam::<AWS_ACCOUNT>:role/<SPINNAKER ROLE_NAME> --query "[Credentials.AccessKeyId, Credentials.SecretAccessKey, Credentials.SessionToken]" --output text --role-session-name spinnakerManaged-w2`; export AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN; aws ecr get-authorization-token --region us-west-2 --output text --query 'authorizationData[].authorizationToken' --registry-ids <AWS_ACCOUNT> | base64 -d | sed 's/^AWS://'

Кредиты на https://github.com/spinnaker/spinnaker/issues/5374#issuecomment-607468678

person miggy282    schedule 08.07.2020