Compartir vía


Transferencia de ACR con plantillas de Resource Manager

Realización de los requisitos previos

Complete los requisitos previos descritos aquí antes de intentar las acciones de este artículo. Esto significa que:

  • Ya tiene un registro de SKU prémium existente en ambas nubes.
  • Tiene un contenedor de cuenta de almacenamiento en ambas nubes.
  • Tiene un almacén de claves existente con un secreto que contiene un token de SAS válido con los permisos necesarios en ambas nubes.
  • Tiene una versión reciente de la CLI de Azure instalada en ambas nubes.

Importante

La transferencia de ACR admite artefactos con los límites de tamaño de capa a 8 GB debido a las limitaciones técnicas.

Considere la posibilidad de usar la extensión de la CLI de Azure.

En la mayoría de los casos de uso no automatizados, se recomienda usar la extensión de la CLI de Azure si fuera posible. Puede ver la documentación de la extensión de la CLI de Azure aquí.

Crear ExportPipeline con Resource Manager

Cree un recurso ExportPipeline para el registro de contenedor de origen mediante la implementación de plantillas de Azure Resource Manager.

Copie los archivos de plantilla de Resource Manager del recurso ExportPipeline en una carpeta local.

Escriba los siguientes valores de parámetro en el archivo azuredeploy.parameters.json:

Parámetro Value
registryName Nombre del registro de contenedor de origen
exportPipelineName Nombre que elija para la canalización de exportación
targetUri URI del contenedor de almacenamiento en el entorno de origen (el destino de la canalización de exportación).
Ejemplo: https://sourcestorage.blob.core.windows.net/transfer
keyVaultName Nombre del almacén de claves de origen
sasTokenSecretName Nombre del secreto del token de SAS en el almacén de claves de origen
Ejemplo: acrexportsas

Opciones de exportación

La propiedad options para las canalizaciones de exportación admite valores booleanos opcionales. Se recomiendan los siguientes valores:

Parámetro Value
opciones OverwriteBlobs: sobrescribe los blobs de destino existentes
ContinueOnErrors: continúa la exportación de artefactos restantes en el registro de origen si se produce un error en la exportación de un artefacto.

Crear el recurso

Ejecute az deployment group create para crear un recurso denominado exportPipeline, tal como se muestra en estos ejemplos. De forma predeterminada, con la primera opción, la plantilla de ejemplo habilita una identidad asignada por el sistema en el recurso ExportPipeline.

Con la segunda opción, puede proporcionar el recurso con una identidad asignada por el usuario. (No se muestra la creación de la identidad asignada por el usuario).

Con cualquiera de las dos opciones, la plantilla configura la identidad para tener acceso al token de SAS en el almacén de claves de exportación.

Opción 1: Crear un recurso y habilitar una identidad asignada por el sistema

az deployment group create \
  --resource-group $SOURCE_RG \
  --template-file azuredeploy.json \
  --name exportPipeline \
  --parameters azuredeploy.parameters.json

Opción 2: Crear un recurso y proporcionar una identidad asignada por el usuario

En este comando, proporcione el identificador de recurso de la identidad asignada por el usuario como parámetro adicional.

az deployment group create \
  --resource-group $SOURCE_RG \
  --template-file azuredeploy.json \
  --name exportPipeline \
  --parameters azuredeploy.parameters.json \
  --parameters userAssignedIdentity="/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myUserAssignedIdentity"

En la salida del comando, anote el identificador de recurso (id) de la canalización. Puede almacenar este valor en una variable de entorno para su uso posterior si ejecuta az deployment group show. Por ejemplo:

EXPORT_RES_ID=$(az deployment group show \
  --resource-group $SOURCE_RG \
  --name exportPipeline \
  --query 'properties.outputResources[1].id' \
  --output tsv)

Crear ImportPipeline con Resource Manager

Cree un recurso ImportPipeline en el registro de contenedor de destino mediante la implementación de plantillas de Azure Resource Manager. De forma predeterminada, la canalización está habilitada para importar automáticamente cuando la cuenta de almacenamiento en el entorno de destino tiene un blob de artefacto.

Copie los archivos de plantilla de Resource Manager del recurso ImportPipeline en una carpeta local.

Escriba los siguientes valores de parámetro en el archivo azuredeploy.parameters.json:

Parámetro Value
registryName Nombre del registro de contenedor de destino
importPipelineName Nombre que elija para la canalización de importación
SourceUri URI del contenedor de almacenamiento en el entorno de destino (el origen de la canalización de importación).
Ejemplo: https://targetstorage.blob.core.windows.net/transfer
keyVaultName Nombre del almacén de claves de destino
sasTokenSecretName Nombre del secreto del token de SAS en el almacén de claves de destino
Ejemplo: acr importsas

Opciones de importación

La propiedad options para las canalizaciones de importación admite valores booleanos opcionales. Se recomiendan los siguientes valores:

Parámetro Value
opciones OverwriteTags: sobrescribe las etiquetas de destino existentes
DeleteSourceBlobOnSuccess: elimina el blob de almacenamiento de origen después de la importación correcta en el registro de destino
ContinueOnErrors: continúa la importación de artefactos restantes en el registro de destino si se produce un error en la importación de un artefacto.

Crear el recurso

Ejecute az deployment group create para crear un recurso denominado importPipeline, tal como se muestra en estos ejemplos. De forma predeterminada, con la primera opción, la plantilla de ejemplo habilita una identidad asignada por el sistema en el recurso ImportPipeline.

Con la segunda opción, puede proporcionar el recurso con una identidad asignada por el usuario. (No se muestra la creación de la identidad asignada por el usuario).

Con cualquiera de las dos opciones, la plantilla configura la identidad para tener acceso al token de SAS en el almacén de claves de importación.

Opción 1: Crear un recurso y habilitar una identidad asignada por el sistema

az deployment group create \
  --resource-group $TARGET_RG \
  --template-file azuredeploy.json \
  --name importPipeline \
  --parameters azuredeploy.parameters.json

Opción 2: Crear un recurso y proporcionar una identidad asignada por el usuario

En este comando, proporcione el identificador de recurso de la identidad asignada por el usuario como parámetro adicional.

az deployment group create \
  --resource-group $TARGET_RG \
  --template-file azuredeploy.json \
  --name importPipeline \
  --parameters azuredeploy.parameters.json \
  --parameters userAssignedIdentity="/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myUserAssignedIdentity"

Si tiene previsto ejecutar la importación manualmente, anote el identificador de recurso (id) de la canalización. Puede almacenar este valor en una variable de entorno para su uso posterior si ejecuta el comando az deployment group show. Por ejemplo:

IMPORT_RES_ID=$(az deployment group show \
  --resource-group $TARGET_RG \
  --name importPipeline \
  --query 'properties.outputResources[1].id' \
  --output tsv)

Crear PipelineRun para la exportación con Resource Manager

Cree un recurso PipelineRun para el registro de contenedor de origen mediante la implementación de plantillas de Azure Resource Manager. Este recurso ejecuta el recurso ExportPipeline que creó anteriormente y exporta los artefactos especificados desde el registro de contenedor como un blob a la cuenta de almacenamiento de origen.

Copie los archivos de plantilla de Resource Manager del recurso PipelineRun en una carpeta local.

Escriba los siguientes valores de parámetro en el archivo azuredeploy.parameters.json:

Parámetro Value
registryName Nombre del registro de contenedor de origen
pipelineRunName Nombre que elija para la ejecución
pipelineResourceId Identificador de recurso de la canalización de exportación.
Ejemplo: /subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.ContainerRegistry/registries/<sourceRegistryName>/exportPipelines/myExportPipeline
targetName Nombre que elija para el blob de artefactos exportado a la cuenta de almacenamiento de origen, como myblob
artifacts Matriz de artefactos de origen que se van a transferir, como etiquetas o resúmenes de manifiestos
Ejemplo: [samples/hello-world:v1", "samples/nginx:v1" , "myrepository@sha256:0a2e01852872..."]

Si vuelve a implementar un recurso PipelineRun con propiedades idénticas, también debe usar la propiedad forceUpdateTag.

Ejecute az deployment group create para crear el recurso PipelineRun. En el ejemplo siguiente se nombra a la implementación como exportPipelineRun.

az deployment group create \
  --resource-group $SOURCE_RG \
  --template-file azuredeploy.json \
  --name exportPipelineRun \
  --parameters azuredeploy.parameters.json

Para su uso posterior, guarde el identificador de recurso de la ejecución de canalización en una variable de entorno:

EXPORT_RUN_RES_ID=$(az deployment group show \
  --resource-group $SOURCE_RG \
  --name exportPipelineRun \
  --query 'properties.outputResources[0].id' \
  --output tsv)

Los artefactos pueden tardar varios minutos en exportarse. Cuando la implementación se complete correctamente, compruebe la exportación de artefactos; para ello, registre el blob exportado en el contenedor transfer de la cuenta de almacenamiento de origen. Por ejemplo, ejecute el comando az storage blob list:

az storage blob list \
  --account-name $SOURCE_SA \
  --container transfer \
  --output table

Transferir blob (opcional)

Use la herramienta AzCopy u otros métodos para transferir datos de blob de la cuenta de almacenamiento de origen a la cuenta de almacenamiento de destino.

Por ejemplo, el siguiente comando azcopy copy copia myblob del contenedor transfer de la cuenta de origen en el contenedor transfer de la cuenta de destino. Si el blob existe en la cuenta de destino, se sobrescribe. La autenticación usa tokens de SAS con los permisos adecuados para los contenedores de origen y de destino. (No se muestran los pasos para crear tokens).

azcopy copy \
  'https://<source-storage-account-name>.blob.core.windows.net/transfer/myblob'$SOURCE_SAS \
  'https://<destination-storage-account-name>.blob.core.windows.net/transfer/myblob'$TARGET_SAS \
  --overwrite true

Desencadenar recurso ImportPipeline

Si ha habilitado el parámetro sourceTriggerStatus de ImportPipeline (el valor predeterminado), la canalización se desencadena después de que el blob se copia en la cuenta de almacenamiento de destino. Los artefactos pueden tardar varios minutos en importarse. Cuando la importación finalice correctamente, compruebe la importación de artefactos; para ello, registre los repositorios en el registro de contenedor de destino. Por ejemplo, ejecute az acr repository list:

az acr repository list --name <target-registry-name>

Nota

El desencadenador de origen solo importará blobs que tengan una hora de última modificación en los últimos 60 días. Si piensa usar el desencadenador de origen para importar blobs anteriores, actualice la hora de la última modificación de los blobs mediante la adición de metadatos de blobs a ellos o bien impórtelos con ejecuciones de canalización creadas manualmente.

Si no ha habilitado el parámetro sourceTriggerStatus de la canalización de importación, ejecute el recurso ImportPipeline manualmente, tal como se muestra en la sección siguiente.

Crear PipelineRun para la importación con Resource Manager (opcional)

También puede usar un recurso PipelineRun para desencadenar un ImportPipeline para la importación de artefactos en el registro de contenedor de destino.

Copie los archivos de plantilla de Resource Manager del recurso PipelineRun en una carpeta local.

Escriba los siguientes valores de parámetro en el archivo azuredeploy.parameters.json:

Parámetro Value
registryName Nombre del registro de contenedor de destino
pipelineRunName Nombre que elija para la ejecución
pipelineResourceId Identificador de recurso de la canalización de importación.
Ejemplo: /subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.ContainerRegistry/registries/<sourceRegistryName>/importPipelines/myImportPipeline
sourceName Nombre del blob existente para los artefactos exportados en la cuenta de almacenamiento, como myblob

Si vuelve a implementar un recurso PipelineRun con propiedades idénticas, también debe usar la propiedad forceUpdateTag.

Ejecute az deployment group create para ejecutar el recurso.

az deployment group create \
  --resource-group $TARGET_RG \
  --name importPipelineRun \
  --template-file azuredeploy.json \
  --parameters azuredeploy.parameters.json

Para su uso posterior, guarde el identificador de recurso de la ejecución de canalización en una variable de entorno:

IMPORT_RUN_RES_ID=$(az deployment group show \
  --resource-group $TARGET_RG \
  --name importPipelineRun \
  --query 'properties.outputResources[0].id' \
  --output tsv)

Cuando la implementación finalice correctamente, compruebe la importación de artefactos; para ello, registre los repositorios en el registro de contenedor de destino. Por ejemplo, ejecute az acr repository list:

az acr repository list --name <target-registry-name>

Nueva implementación del recurso PipelineRun

Si vuelve a implementar un recurso PipelineRun con propiedades idénticas, debe aprovechar la propiedad forceUpdateTag. Esta propiedad indica que el recurso PipelineRun debe volver a crearse incluso si la configuración no ha cambiado. Asegúrese de que forceUpdateTag sea diferente cada vez que vuelva a implementar el recurso PipelineRun. En el ejemplo siguiente se vuelve a crear un recurso PipelineRun para exportarlo. La fecha y hora actual se utiliza para establecer forceUpdateTag, lo que garantiza que esta propiedad sea siempre única.

CURRENT_DATETIME=`date +"%Y-%m-%d:%T"`
az deployment group create \
  --resource-group $SOURCE_RG \
  --template-file azuredeploy.json \
  --name exportPipelineRun \
  --parameters azuredeploy.parameters.json \
  --parameters forceUpdateTag=$CURRENT_DATETIME

Eliminar recursos de canalización

En el siguiente ejemplo, los comandos usan az resource delete para suprimir los recursos de canalización creados en este artículo. Los identificadores de recursos se almacenaron previamente en variables de entorno.

# Delete export resources
az resource delete \
--resource-group $SOURCE_RG \
--ids $EXPORT_RES_ID $EXPORT_RUN_RES_ID \
--api-version 2019-12-01-preview

# Delete import resources
az resource delete \
--resource-group $TARGET_RG \
--ids $IMPORT_RES_ID $IMPORT_RUN_RES_ID \
--api-version 2019-12-01-preview

Solución de problemas de transferencia de ACR

Consulte Solución de problemas de transferencia de ACR para obtener instrucciones de solución de problemas.

Pasos siguientes