Transferência de ACR com modelos do ARM

Completar os pré-requisitos

Conclua os pré-requisitos descritos aqui antes de tentar as ações neste artigo. Isso significa que:

  • Você tem um registro de SKU Premium existente em ambas as nuvens.
  • Você tem um contêiner de conta de Armazenamento existente em ambas as nuvens.
  • Você tem um Keyvault existente com um segredo que contém um token SAS válido com as permissões necessárias em ambas as nuvens.
  • Você tem uma versão recente da CLI do AZ instalada em ambas as nuvens.

Importante

A Transferência do registro de controle de acesso suporta artefatos com limites de tamanho de camada de 8 GB devido às limitações técnicas.

Considerar o uso da extensão AZ CLI

Para a maioria dos casos de uso não automatizados, recomendamos o uso da extensão Az CLI, se possível. Você pode exibir a documentação da extensão da CLI do AZ aqui.

Criar ExportPipeline com o Resource Manager

Crie um recurso ExportPipeline para o registro de contêiner de origem usando a implantação de modelo do Azure Resource Manager.

Copie os arquivos de modelo do ExportPipeline do Resource Manager para uma pasta local.

Insira os seguintes valores de parâmetro no arquivo azuredeploy.parameters.json:

Parâmetro Valor
registryName Nome do registro de contêiner de origem
exportPipelineName Nome escolhido para o pipeline de exportação
targetUri URI do contêiner de armazenamento no ambiente de origem (o destino do pipeline de exportação).
Exemplo: https://sourcestorage.blob.core.windows.net/transfer
keyVaultName Nome do cofre de chaves de origem
sasTokenSecretName Nome do segredo do token SAS no cofre de chaves de origem
Exemplo: acrexportsas

Opções de exportação

A propriedade options para os pipelines de exportação dá suporte a valores boolianos opcionais. Os seguintes valores são recomendados:

Parâmetro Valor
opções OverwriteBlobs – substitui os blobs de destino existentes
ContinueOnErrors – dá continuidade à exportação dos artefatos restantes no registro de origem se uma exportação de artefato falhar.

Criar o recurso

Execute o comando az deployment group create para criar um recurso chamado exportPipeline, conforme mostrado nos exemplos a seguir. Por padrão, com a primeira opção, o modelo de exemplo habilita uma identidade atribuída pelo sistema no recurso ExportPipeline.

Com a segunda opção, você pode fornecer uma identidade atribuída pelo usuário para o recurso. (A criação da identidade atribuída pelo usuário não é exibida.)

Para qualquer uma das opções, o modelo configura a identidade para acessar o token SAS no cofre de chaves de exportação.

Opção 1: criar o recurso e habilitar a identidade atribuída pelo sistema

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

Opção 2: criar o recurso e fornecer a identidade atribuída pelo usuário

Nesse comando, forneça a ID do recurso da identidade atribuída pelo usuário como um 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"

Na saída do comando, anote a ID do recurso (id) do pipeline. Você pode armazenar esse valor em uma variável de ambiente para uso posterior executando o comando az deployment group show. Por exemplo:

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

Criar ImportPipeline com o Resource Manager

Crie um recurso ImportPipeline para o registro de contêiner de destino usando a implantação de modelo do Azure Resource Manager. Por padrão, o pipeline é habilitado para importar automaticamente quando a conta de armazenamento no ambiente de destino tem um blob de artefato.

Copie os arquivos de modelo do ImportPipeline do Resource Manager para uma pasta local.

Insira os seguintes valores de parâmetro no arquivo azuredeploy.parameters.json:

Parâmetro Valor
registryName Nome do registro de contêiner de destino
importPipelineName Nome escolhido para o pipeline de importação
sourceUri URI do contêiner de armazenamento no ambiente de destino (a origem do pipeline de importação).
Exemplo: https://targetstorage.blob.core.windows.net/transfer
keyVaultName Nome do cofre de chaves de destino
sasTokenSecretName Nome do segredo do token SAS no cofre de chaves de destino
Exemplo: acr importsas

Opções de importação

A propriedade options para os pipelines de importação dá suporte a valores boolianos opcionais. Os seguintes valores são recomendados:

Parâmetro Valor
opções OverwriteTags – substitui as marcas de destino existentes
DeleteSourceBlobOnSuccess – exclui o blob de armazenamento de origem após a importação bem-sucedida para o registro de destino
ContinueOnErrors – dá continuidade à importação dos artefatos restantes no registro de destino se uma importação de artefato falhar.

Criar o recurso

Execute o comando az deployment group create para criar um recurso chamado importPipeline, conforme mostrado nos exemplos a seguir. Por padrão, com a primeira opção, o modelo de exemplo habilita uma identidade atribuída pelo sistema no recurso ImportPipeline.

Com a segunda opção, você pode fornecer uma identidade atribuída pelo usuário para o recurso. (A criação da identidade atribuída pelo usuário não é exibida.)

Para qualquer uma das opções, o modelo configura a identidade para acessar o token SAS no cofre de chaves de importação.

Opção 1: criar o recurso e habilitar a identidade atribuída pelo sistema

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

Opção 2: criar o recurso e fornecer a identidade atribuída pelo usuário

Nesse comando, forneça a ID do recurso da identidade atribuída pelo usuário como um 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"

Se você planeja executar a importação manualmente, anote a ID do recurso (id) do pipeline. Você pode armazenar esse valor em uma variável de ambiente para uso posterior executando o comando az deployment group show. Por exemplo:

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

Criar um PipelineRun para exportação com o Resource Manager

Crie um recurso PipelineRun para o registro de contêiner de origem usando a implantação de modelo do Azure Resource Manager. Esse recurso executa o recurso ExportPipeline criado anteriormente e exporta os artefatos especificados do registro de contêiner como um blob para a conta de armazenamento de origem.

Copie os arquivos de modelo do PipelineRun do Resource Manager para uma pasta local.

Insira os seguintes valores de parâmetro no arquivo azuredeploy.parameters.json:

Parâmetro Valor
registryName Nome do registro de contêiner de origem
pipelineRunName Nome escolhido para a execução
pipelineResourceId ID do recurso do pipeline de exportação.
Exemplo: /subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.ContainerRegistry/registries/<sourceRegistryName>/exportPipelines/myExportPipeline
targetName Nome escolhido para o blob de artefatos exportado para sua conta de armazenamento de origem, por exemplo myblob
artefatos Matriz de artefatos de origem a serem transferidos, como marcas ou hashs de manifesto
Exemplo: [samples/hello-world:v1", "samples/nginx:v1" , "myrepository@sha256:0a2e01852872..."]

Se você reimplantar um recurso PipelineRun com propriedades idênticas, também deverá usar a propriedade forceUpdateTag.

Execute o comando az deployment group creat para criar o recurso PipelineRun. O exemplo a seguir nomeia o exportPipelineRun de implantação.

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

Para uso posterior, armazene a ID do recurso da execução de pipeline em uma variável de ambiente:

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

Pode demorar alguns minutos para exportar os artefatos. Quando a implantação for concluída com sucesso, verifique a exportação de artefatos, listando o blob exportado no contêiner de transferência da conta de armazenamento de origem. Por exemplo, execute o comando az storage blob list:

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

Transferir blob (opcional)

Use a ferramenta AzCopy ou outros métodos para transferir dados de blob da conta de armazenamento de origem para a conta de armazenamento de destino.

Por exemplo, o comando azcopy copy copia o myblob do contêiner de transferência na conta de origem para o contêiner de transferência na conta de destino. Se o blob já existir na conta de destino, ele será substituído. A autenticação usa os tokens SAS com as permissões apropriadas para os contêineres de origem e de destino. (As etapas para criar os tokens não estão sendo mostradas.)

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

Disparar o recurso ImportPipeline

Se você habilitou o parâmetro sourceTriggerStatus do ImportPipeline (o valor padrão), o pipeline será disparado depois que o blob for copiado para a conta de armazenamento de destino. Pode demorar alguns minutos para importar os artefatos. Quando a importação for concluída com sucesso, verifique a importação de artefatos listando os repositórios no registro de contêiner de destino. Por exemplo, execute o comando az acr repository list:

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

Observação

O Gatilho de Origem importa apenas os blobs que têm uma hora da Última Modificação nos últimos 60 dias. Se você pretende usar o Gatilho de Origem para importar blobs mais antigos do que isso, atualize a hora da Última Modificação dos blobs adicionando metadados de blob a eles ou importe-os com as executações de pipeline criadas manualmente.

Se você não tiver habilitado o parâmetro sourceTriggerStatus do pipeline de importação, execute o recurso ImportPipeline manualmente, conforme mostrado na seção a seguir.

Criar um PipelineRun para importação com o Resource Manager (opcional)

Você também pode usar um recurso PipelineRun para disparar um ImportPipeline para a importação de artefato para o registro de contêiner de destino.

Copie os arquivos de modelo do PipelineRun do Resource Manager para uma pasta local.

Insira os seguintes valores de parâmetro no arquivo azuredeploy.parameters.json:

Parâmetro Valor
registryName Nome do registro de contêiner de destino
pipelineRunName Nome escolhido para a execução
pipelineResourceId ID do recurso do pipeline de importação.
Exemplo: /subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.ContainerRegistry/registries/<sourceRegistryName>/importPipelines/myImportPipeline
sourceName Nome do blob existente para artefatos exportados na conta de armazenamento, como myblob

Se você reimplantar um recurso PipelineRun com propriedades idênticas, também deverá usar a propriedade forceUpdateTag.

Execute o comando az deployment group create para executar o recurso.

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

Para uso posterior, armazene a ID do recurso da execução de pipeline em uma variável de ambiente:

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

Quando a implantação importação for concluída com sucesso, verifique a importação de artefatos listando os repositórios no registro de contêiner de destino. Por exemplo, execute o comando az acr repository list:

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

Reimplantar o recurso PipelineRun

Se você reimplantar um recurso PipelineRun com propriedades idênticas, também precisará aproveitar a propriedade forceUpdateTag. Essa propriedade indica que o recurso PipelineRun deve ser recriado mesmo que a configuração não tenha sido alterada. Certifique-se de que forceUpdateTag seja diferente sempre que você reimplantar o recurso PipelineRun. O exemplo a seguir recria um PipelineRun para exportação. O datetime atual é usado para definir a forceUpdateTag, garantindo assim que essa propriedade seja sempre exclusiva.

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

Excluir os recursos de pipeline

Os comandos de exemplo a seguir usam o comando az resource delete para excluir os recursos de pipeline criados neste artigo. As IDs de recurso foram armazenadas anteriormente nas variáveis de 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

Solução de problemas de transferência de ACR

Veja Solução de problemas de transferência de ACR para obter as diretrizes de solução de problemas.

Próximas etapas