Saltar al contenido

¿Cómo puedo permitir que una cuenta secundaria envíe o extraiga imágenes de mis repositorios de imágenes de Amazon ECR?

5 minutos de lectura
0

Quiero permitir que una cuenta de AWS secundaria envíe o extraiga imágenes de mi repositorio de imágenes de Amazon Elastic Container Registry (Amazon ECR).

Descripción corta

Para permitir que una cuenta secundaria inserte o extraiga imágenes de tu repositorio de Amazon ECR, crea una política de registro o repositorio en tu cuenta principal. Para proporcionar acceso a todos los repositorios de tu región de AWS o a varios repositorios diferentes, configura una política a nivel de registro. Para proporcionar acceso a un solo repositorio o restringir el acceso a diferentes identidades dentro de un solo repositorio, configura una política a nivel de repositorio. Configura la política para permitir llamadas a la API específicas desde la cuenta secundaria.

Luego, desde la cuenta secundaria, genera un token de autenticación de Docker para insertar y extraer imágenes del repositorio de la cuenta principal.

Resolución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.

Configuración de los permisos a nivel de registro

Requisito previo: Tu registro de Amazon ECR debe utilizar una política V2. Si usas una política V1, cambia a V2. Para obtener más información sobre la política V2, consulta Amazon ECR amplía la política de registros a todas las acciones de ECR.

Sigue estos pasos:

  1. Abre la consola de Amazon ECR de tu cuenta principal.
  2. En el panel de navegación, en Registro privado, selecciona Características y configuración.
  3. Selecciona Permisos.
  4. Selecciona Editar JSON.
  5. Introduce tu política en el editor. Ejemplo de política que permite a la cuenta secundaria enviar y extraer imágenes de todos los repositorios de la región:
     {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::account-id:root"
          },
          "Action": [
            "ecr:GetDownloadUrlForLayer",
            "ecr:BatchGetImage",
            "ecr:BatchCheckLayerAvailability",
            "ecr:PutImage",
            "ecr:InitiateLayerUpload",
            "ecr:UploadLayerPart",
            "ecr:CompleteLayerUpload"
          ],
          "Resource": "*"
        }
      ]
    }
    Nota: Sustituye account-id por el identificador de la cuenta secundaria. En Acción, introduce las acciones que la cuenta puede realizar en el repositorio. Para permitir el acceso a un rol específico, proporciona el nombre de recurso de Amazon (ARN) del rol para la entidad principal, como AWS: arn:aws:iam::account-id:role/ecsInstanceRole. Antes de guardar la política de registro, asegúrate de que el rol que has introducido existe en la cuenta secundaria. Si el rol no existe, recibirás el error «invalid registry policy provided».
  6. Selecciona Guardar.

Configuración de los permisos a nivel de repositorio

Sigue estos pasos:

  1. Abre la consola de Amazon ECR de tu cuenta principal.
  2. En el panel de navegación, en Registro privado, elige Repositorios.
  3. Selecciona el repositorio que quieras modificar.
  4. En el panel de navegación, selecciona Permisos.
  5. Selecciona Editar política JSON.
  6. En el editor de políticas, introduce tu instrucción de política.
    Ejemplo de política de repositorio que permite a una cuenta insertar y extraer imágenes:
    {  "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "AllowPushPull",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::account-id:root"
          },
          "Action": [
            "ecr:GetDownloadUrlForLayer",
            "ecr:BatchGetImage",
            "ecr:BatchCheckLayerAvailability",
            "ecr:PutImage",
            "ecr:InitiateLayerUpload",
            "ecr:UploadLayerPart",
            "ecr:CompleteLayerUpload"
          ]
        }
      ]
    }
    Nota: Sustituye account-id por el identificador de la cuenta secundaria. En Acción, introduce las acciones que la cuenta puede realizar en el repositorio. Para permitir el acceso a un rol específico, proporciona el nombre de recurso de Amazon (ARN) del rol para la entidad principal, como AWS: arn:aws:iam::account-id:role/ecsInstanceRole. Antes de guardar la política de registro, asegúrate de que el rol que has introducido existe en la cuenta secundaria. Si el rol no existe, recibirás el error «invalid registry policy provided».
  7. Selecciona Guardar.
  8. Si usas Amazon ECS para ejecutar el contenedor en la cuenta secundaria, define la imagen que deseas usar con Amazon ECS. El repositorio de Amazon ECR de la cuenta principal aloja la imagen.

Nota: Asegúrate de que la política administrada AmazonEC2ContainerRegistryPowerUser incluya los permisos de Amazon ECR para tu cuenta secundaria. Debes tener estos permisos para extraer o enviar archivos desde tu cuenta principal.

Generación de un token de autenticación de Docker temporal

Nota: La cuenta que recibe el token debe tener los permisos de API de AWS Identify and Access Management (IAM) necesarios para modificar el repositorio. Para ver ejemplos, consulta Políticas administradas por AWS para Amazon ECR. Para solucionar problemas con Docker, activa el modo de depuración en tu daemon de Docker.

Sigue estos pasos:

  1. Para generar un token de autenticación de Docker para una cuenta que envía y extrae imágenes fuera de Amazon ECS, ejecuta el siguiente comando get-login-password de la AWS CLI:

    aws ecr get-login-password --region regionID | docker login --username AWS --password-stdin AWS_ACCOUNT_ID.dkr.ecr.REGION-ID.amazonaws.com

    Alternativa:
    Ejecuta el siguiente comando de AWS Tools para Windows PowerShell:

    (Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin AWS_ACCOUNT_ID.dkr.ecr.regionID.amazonaws.com

    Nota: Sustituye AWS-ACCOUNT-ID por tu ID de cuenta principal y REGION-ID por tu región. El token de autenticación temporal es válido durante 12 horas.
    Resultado de ejemplo:

    aws ecr get-login-password --region ap-south-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-south-1.amazonaws.com
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    Login Succeeded
    
    or
    
    Login Succeeded
  2. Para realizar una extracción de imagen de prueba de la cuenta principal o enviarla a ella, ejecuta el siguiente comando:

    docker pull ACCOUNT-ID.dkr.ecr.REGION.amazonaws.com/REPOSITORY-NAME:TAG-NAME

    Nota: Sustituye ACCOUNT-ID por tu ID de cuenta principal, REGION por tu región, REPOSITORY-NAME por el nombre de tu repositorio y TAG-NAME por el nombre de la etiqueta de tu imagen.

  3. Para comprobar que has descargado la imagen correctamente, ejecuta el siguiente comando:

    docker images | grep IMAGE-NAME

    Nota: Sustituye IMAGE-NAME por el nombre de tu imagen.