Condividi tramite


Trasferimento di ACR con modelli di ARM

Prerequisiti completi

Completare i prerequisiti descritti qui prima di tentare le azioni in questo articolo. Ciò significa che:

  • In entrambi i cloud è presente un Registro SKU Premium esistente.
  • Si dispone di un contenitore di account di archiviazione esistente in entrambi i cloud.
  • Si dispone di un insieme di credenziali delle chiavi esistente con un segreto contenente un token di firma di accesso condiviso valido con le autorizzazioni necessarie in entrambi i cloud.
  • È installata una versione recente dell'interfaccia della riga di comando di Az in entrambi i cloud.

Importante

Il trasferimento del Registro Azure Container supporta artefatti con limiti di dimensioni del livello a 8 GB a causa delle limitazioni tecniche.

Prendere in considerazione l'uso dell'estensione dell'interfaccia della riga di comando di Az

Per la maggior parte dei casi d'uso non automatizzati, è consigliabile usare l'estensione dell'interfaccia della riga di comando di Az, se possibile. È possibile visualizzare la documentazione per l'estensione dell'interfaccia della riga di comando di Az qui.

Creare ExportPipeline con Resource Manager

Creare una risorsa ExportPipeline per il registro contenitori di origine usando la distribuzione di modelli di Azure Resource Manager.

Copiare i file modello ExportPipeline Resource Manager in una cartella locale.

Immettere i valori dei parametri seguenti nel file azuredeploy.parameters.json:

Parametro Valore
registryName Nome del registro contenitori di origine
exportPipelineName Nome scelto per la pipeline di esportazione
targetUri URI del contenitore di archiviazione nell'ambiente di origine (destinazione della pipeline di esportazione).
Esempio: https://sourcestorage.blob.core.windows.net/transfer
keyVaultName Nome dell'insieme di credenziali delle chiavi di origine
sasTokenSecretName Nome del segreto del token di firma di accesso condiviso nell'insieme di credenziali delle chiavi di origine
Esempio: acrexportsas

Opzioni di esportazione

La proprietà options per le pipeline di esportazione supporta valori booleani facoltativi. Sono consigliati i valori seguenti:

Parametro Valore
opzioni OverwriteBlobs - Sovrascrivere i BLOB di destinazione esistenti
ContinueOnErrors: continuare l'esportazione degli artefatti rimanenti nel Registro di sistema di origine in caso di errore di un'esportazione di un artefatto.

Creare la risorsa

Eseguire az deployment group create per creare una risorsa denominata exportPipeline, come illustrato negli esempi seguenti. Per impostazione predefinita, con la prima opzione, il modello di esempio abilita un'identità assegnata dal sistema nella risorsa ExportPipeline.

Con la seconda opzione, è possibile fornire alla risorsa un'identità assegnata dall'utente. (Creazione dell'identità assegnata dall'utente non visualizzata).

Con entrambe le opzioni, il modello configura l'identità per accedere al token di firma di accesso condiviso nell'insieme di credenziali delle chiavi di esportazione.

Opzione 1: Creare una risorsa e abilitare l'identità assegnata dal sistema

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

Opzione 2: Creare una risorsa e fornire un'identità assegnata dall'utente

In questo comando specificare l'ID risorsa dell'identità assegnata dall'utente come parametro aggiuntivo.

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"

Nell'output del comando prendere nota dell'ID risorsa (id) della pipeline. È possibile archiviare questo valore in una variabile di ambiente per usarlo in un secondo momento eseguendo il comando az deployment group show. Ad esempio:

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

Creare ImportPipeline con Resource Manager

Creare una risorsa ImportPipeline nel registro contenitori di destinazione usando la distribuzione del modello di Azure Resource Manager. Per impostazione predefinita, la pipeline è abilitata per l'importazione automatica quando l'account di archiviazione nell'ambiente di destinazione ha un BLOB di artefatti.

Copiare i file modello di Resource Manager ImportPipeline in una cartella locale.

Immettere i valori dei parametri seguenti nel file azuredeploy.parameters.json:

Parametro Valore
registryName Nome del registro contenitori di destinazione
importPipelineName Nome scelto per la pipeline di importazione
sourceUri URI del contenitore di archiviazione nell'ambiente di destinazione (origine per la pipeline di importazione).
Esempio: https://targetstorage.blob.core.windows.net/transfer
keyVaultName Nome dell'insieme di credenziali delle chiavi di destinazione
sasTokenSecretName Nome del segreto del token di firma di accesso condiviso nell'insieme di credenziali delle chiavi di destinazione
Esempio: acr importsas

Opzioni di importazione

La proprietà options per la pipeline di importazione supporta valori booleani facoltativi. Sono consigliati i valori seguenti:

Parametro Valore
opzioni OverwriteTags - Sovrascrivere i tag di destinazione esistenti
DeleteSourceBlobOnSuccess - Eliminare il BLOB di archiviazione di origine dopo aver completato l'importazione nel Registro di sistema di destinazione
ContinueOnErrors: continuare l'importazione degli artefatti rimanenti nel Registro di sistema di destinazione se un'importazione di un artefatto ha esito negativo.

Creare la risorsa

Eseguire az deployment group create per creare una risorsa denominata importPipeline, come illustrato negli esempi seguenti. Per impostazione predefinita, con la prima opzione, il modello di esempio abilita un'identità assegnata dal sistema nella risorsa ImportPipeline.

Con la seconda opzione, è possibile fornire alla risorsa un'identità assegnata dall'utente. (Creazione dell'identità assegnata dall'utente non visualizzata).

Con entrambe le opzioni, il modello configura l'identità per accedere al token di firma di accesso condiviso nell'insieme di credenziali delle chiavi di importazione.

Opzione 1: Creare una risorsa e abilitare l'identità assegnata dal sistema

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

Opzione 2: Creare una risorsa e fornire un'identità assegnata dall'utente

In questo comando specificare l'ID risorsa dell'identità assegnata dall'utente come parametro aggiuntivo.

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"

Se si prevede di eseguire manualmente l'importazione, prendere nota dell'ID risorsa (id) della pipeline. È possibile archiviare questo valore in una variabile di ambiente per usarlo in un secondo momento eseguendo il comando az deployment group show . Ad esempio:

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

Creare PipelineRun per l'esportazione con Resource Manager

Creare una risorsa PipelineRun per il registro contenitori di origine usando la distribuzione di modelli di Azure Resource Manager. Questa risorsa esegue la risorsa ExportPipeline creata in precedenza ed esporta gli artefatti specificati dal registro contenitori come BLOB nell'account di archiviazione di origine.

Copiare i file modello di Resource Manager PipelineRun in una cartella locale.

Immettere i valori dei parametri seguenti nel file azuredeploy.parameters.json:

Parametro Valore
registryName Nome del registro contenitori di origine
pipelineRunName Nome scelto per l'esecuzione
pipelineResourceId ID risorsa della pipeline di esportazione.
Esempio: /subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.ContainerRegistry/registries/<sourceRegistryName>/exportPipelines/myExportPipeline
targetName Nome scelto per il BLOB degli artefatti esportati nell'account di archiviazione di origine, ad esempio myblob
artifacts Matrice di artefatti di origine da trasferire, come tag o digest del manifesto
Esempio: [samples/hello-world:v1", "samples/nginx:v1" , "myrepository@sha256:0a2e01852872..."]

Se si ridistribuisce una risorsa PipelineRun con proprietà identiche, è necessario usare anche la proprietà forceUpdateTag.

Eseguire az deployment group create per creare la risorsa PipelineRun. Nell'esempio seguente viene nominata la distribuzione exportPipelineRun.

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

Per un uso successivo, archiviare l'ID risorsa della pipeline eseguita in una variabile di ambiente:

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

L'esportazione degli artefatti può richiedere alcuni minuti. Al termine della distribuzione, verificare l'esportazione degli artefatti elencando il BLOB esportato nel contenitore di trasferimento dell'account di archiviazione di origine. Ad esempio, eseguire il comando az storage blob list:

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

Blob di trasferimento (facoltativo)

Usare lo strumento AzCopy o altri metodi per trasferire i dati BLOB dall'account di archiviazione di origine all'account di archiviazione di destinazione.

Ad esempio, il comando azcopy copy seguente copia myblob dal contenitore di trasferimento nell'account di origine al contenitore di trasferimento nell'account di destinazione. Se nell'account di destinazione il BLOB esiste, viene sovrascritto. L'autenticazione usa token di firma di accesso condiviso con autorizzazioni appropriate per i contenitori di origine e di destinazione. I passaggi per la creazione di token non vengono visualizzati.

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

Attivare la risorsa ImportPipeline

Se è stato abilitato il parametro sourceTriggerStatus di ImportPipeline (valore predefinito), la pipeline viene attivata dopo la copia del BLOB nell'account di archiviazione di destinazione. L'importazione degli artefatti può richiedere alcuni minuti. Al termine dell'importazione, verificare l'importazione dell'artefatto elencando i repository nel registro contenitori di destinazione. Ad esempio, eseguire az acr repository list:

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

Nota

Il trigger di origine importerà solo i BLOB con una data di ultima modifica compresa negli ultimi 60 giorni. Se si intende usare il trigger di origine per importare BLOB precedenti, aggiornare l'ora dell'ultima modifica dei BLOB aggiungendo i metadati del BLOB o importandoli con esecuzioni di pipeline create manualmente.

Se non è stato abilitato il parametro sourceTriggerStatus della pipeline di importazione, eseguire manualmente la risorsa ImportPipeline, come illustrato nella sezione seguente.

Creare PipelineRun per l'importazione con Resource Manager (facoltativo)

È anche possibile usare una risorsa PipelineRun per attivare un'importazione ImportPipeline per l'importazione degli artefatti nel registro contenitori di destinazione.

Copiare i file modello di Resource Manager PipelineRun in una cartella locale.

Immettere i valori dei parametri seguenti nel file azuredeploy.parameters.json:

Parametro Valore
registryName Nome del registro contenitori di destinazione
pipelineRunName Nome scelto per l'esecuzione
pipelineResourceId ID risorsa della pipeline di importazione.
Esempio: /subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.ContainerRegistry/registries/<sourceRegistryName>/importPipelines/myImportPipeline
sourceName Nome del BLOB esistente per gli artefatti esportati nell'account di archiviazione, ad esempio myblob

Se si ridistribuisce una risorsa PipelineRun con proprietà identiche, è necessario usare anche la proprietà forceUpdateTag.

Eseguire az deployment group create per eseguire la risorsa.

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

Per un uso successivo, archiviare l'ID risorsa della pipeline eseguita in una variabile di ambiente:

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

Al termine della distribuzione, verificare l'importazione dell'artefatto elencando i repository nel registro contenitori di destinazione. Ad esempio, eseguire az acr repository list:

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

Ridistribuire la risorsa PipelineRun

Se si ridistribuisce una risorsa PipelineRun con proprietà identiche, è necessario sfruttare la proprietà forceUpdateTag. Questa proprietà indica che la risorsa PipelineRun deve essere ricreata anche se la configurazione non è stata modificata. Assicurarsi che forceUpdateTag sia diverso ogni volta che si ridistribuisce la risorsa PipelineRun. L'esempio seguente ricrea un oggetto PipelineRun per l'esportazione. L'oggetto datetime corrente viene usato per impostare forceUpdateTag, assicurando in tal modo che questa proprietà sia sempre univoca.

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

Eliminare le risorse della pipeline

I comandi di esempio seguenti usano az resource delete per eliminare le risorse della pipeline create in questo articolo. Gli ID risorsa sono stati archiviati in precedenza nelle variabili di ambiente.

# 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

Risoluzione dei problemi relativi al trasferimento di Registro Azure Container

Per indicazioni sulla risoluzione dei problemi, vedere Risoluzione dei problemi di trasferimento del Registro Azure Container.

Passaggi successivi