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
- Obtenga información sobre cómo bloquear la creación de canalizaciones de exportación desde un registro de contenedor restringido por red.