Transferência ACR com modelos ARM

Pré-requisitos completos

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

  • Você tem um Registro 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 contendo um token SAS válido com as permissões necessárias em ambas as nuvens.
  • Você tem uma versão recente do Az CLI instalada em ambas as nuvens.

Importante

O ACR Transfer suporta artefatos com o tamanho da camada limitado a 8 GB devido às limitações técnicas.

Considere 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 ver a documentação para a extensão Az CLI aqui.

Criar ExportPipeline com o Resource Manager

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

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

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

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

Opções de exportação

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

Parâmetro Value
options OverwriteBlobs - Substituir blobs de destino existentes
ContinueOnErrors - Continue a exportação de artefatos restantes no registro de origem se uma exportação de artefato falhar.

Criar o recurso

Execute 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 ao sistema no recurso ExportPipeline.

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

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

Opção 1: Criar recurso e habilitar identidade atribuída ao sistema

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

Opção 2: Criar recurso e fornecer identidade atribuída ao usuário

Neste 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 o ID do recurso (id) do pipeline. Você pode armazenar esse valor em uma variável de ambiente para uso posterior executando o show do grupo de implantação az. 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 em seu 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 Resource Manager para uma pasta local.

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

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

Opções de importação

A options propriedade para o pipeline de importação suporta valores booleanos opcionais. Os seguintes valores são recomendados:

Parâmetro Value
options OverwriteTags - Substituir tags de destino existentes
DeleteSourceBlobOnSuccess - Exclua o blob de armazenamento de origem após a importação bem-sucedida para o registro de destino
ContinueOnErrors - Continue a importação de artefatos restantes no registro de destino se uma importação de artefato falhar.

Criar o recurso

Execute 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 ao sistema no recurso ImportPipeline.

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

Com 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 recurso e habilitar identidade atribuída ao sistema

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

Opção 2: Criar recurso e fornecer identidade atribuída ao usuário

Neste 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 PipelineRun para exportação com o Resource Manager

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

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

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

Parâmetro Value
nome_do_registo Nome do registro do 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, como myblob
artefatos Matriz de artefatos de origem a serem transferidos, como tags ou resumos de manifesto
Exemplo: [samples/hello-world:v1", "samples/nginx:v1" , "myrepository@sha256:0a2e01852872..."]

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

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

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

Para uso posterior, armazene o ID do recurso executado no pipeline executado 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 levar vários minutos para que os artefatos sejam exportados. Quando a implantação for concluída com êxito, verifique a exportação do artefato 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

Blob de transferência (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 a seguir azcopy copy copia 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 existir na conta de destino, ele será substituído. A autenticação usa tokens SAS com permissões apropriadas para os contêineres de origem e destino. (As etapas para criar tokens não são 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

Acionar o recurso ImportPipeline

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

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

Nota

O Gatilho de Origem só importará blobs que tenham um tempo de Última Modificação nos últimos 60 dias. Se você pretende usar o Source Trigger 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 execuções de pipeline criadas manualmente.

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

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

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

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

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

Parâmetro Value
nome_do_registo Nome do registro do 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
Nome da fonte Nome do blob existente para artefatos exportados em sua conta de armazenamento, como myblob

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

Execute 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 o ID do recurso executado no pipeline executado 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 for concluída com êxito, verifique a importação de artefatos listando os repositórios no registro do contêiner de destino. Por exemplo, execute az acr repository list:

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

Reimplantar recurso PipelineRun

Se reimplantar um recurso PipelineRun com propriedades idênticas, você deve aproveitar a propriedade forceUpdateTag . Essa propriedade indica que o recurso PipelineRun deve ser recriado mesmo que a configuração não tenha sido alterada. Verifique se forceUpdateTag é diferente cada vez que você reimplantar o recurso PipelineRun. O exemplo abaixo recria um PipelineRun para exportação. O datetime atual é usado para definir 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 recursos de pipeline

Os comandos de exemplo a seguir usam az resource delete para excluir os recursos de pipeline criados neste artigo. Os IDs dos recursos foram previamente armazenados em 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 ACR

Consulte a Solução de problemas de transferência ACR para obter orientação sobre solução de problemas.

Próximos passos

  • Saiba como bloquear a criação de pipelines de exportação a partir de um registro de contêiner restrito à rede.