Az CLI を使用した ACR 転送

この記事では、acrtransfer Az CLI 拡張機能で ACR 転送機能を使用する方法について説明します。

前提条件を満たす

この記事の操作を試す前に、こちらで説明されている前提条件を完了してください。 これは、次のことを意味します。

  • 両方のクラウドに既存の Premium SKU レジストリがある
  • 両方のクラウドに既存のストレージ アカウント コンテナーがある
  • 両方のクラウドに既存の Keyvault があり、必要なアクセス許可を持つ有効な SAS トークンを含むシークレットが格納されている
  • 両方のクラウドに最新バージョンの Az CLI がインストールされている。

Az CLI 拡張機能をインストールする

AzureCloud では、次のコマンドを使用して拡張機能をインストールできます。

az extension add --name acrtransfer

AzureCloud および他のクラウドでは、BLOB をパブリック ストレージ アカウント コンテナーから直接インストールできます。 BLOB は、acrtransferext ストレージ アカウント、dist コンテナー、acrtransfer-1.0.0-py2.py3-none-any.wh BLOB でホストされます。 使用しているクラウドによっては、ストレージ URL のサフィックスを変更することが必要な場合があります。 次のコードが AzureCloud にインストールされます。

az extension add --source https://acrtransferext.blob.core.windows.net/dist/acrtransfer-1.0.0-py2.py3-none-any.whl

acrtransfer Az CLI 拡張機能を使用して ExportPipeline を作成する

acrtransfer Az CLI 拡張機能を使用して、AzureCloud コンテナー レジストリの ExportPipeline リソースを作成します。

オプションを使用せず、システム割り当て ID を使用して、エクスポート パイプラインを作成します。

az acr export-pipeline create \
--resource-group $MyRG \
--registry $MyReg \
--name $MyPipeline \
--secret-uri https://$MyKV.vault.azure.net/secrets/$MySecret \
--storage-container-uri https://$MyStorage.blob.core.windows.net/$MyContainer

使用可能なすべてのオプションとユーザー割り当て ID を使用してエクスポート パイプラインを作成します。

az acr export-pipeline create \
--resource-group $MyRG \
--registry $MyReg \
--name $MyPipeline \
--secret-uri https://$MyKV.vault.azure.net/secrets/$MySecret \
--storage-container-uri https://$MyStorage.blob.core.windows.net/$MyContainer \
--options OverwriteBlobs ContinueOnErrors \
--assign-identity /subscriptions/$MySubID/resourceGroups/$MyRG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$MyIdentity

エクスポート オプション

エクスポート パイプラインの options プロパティでは、省略可能なブール値がサポートされています。 次の値が推奨されます。

パラメーター
options OverwriteBlobs - 既存のターゲット BLOB を上書きします。
ContinueOnErrors - 1 つの成果物のエクスポートが失敗した場合に、ソース レジストリ内の残りの成果物のエクスポートを続行します。

ExportPipeline ID に keyvault ポリシー アクセスを付与する

ユーザー割り当て ID を使用してパイプラインを作成した場合は、このユーザー割り当て ID に、keyvault に対する secret get アクセス ポリシーのアクセス許可を付与するだけです。

システム割り当て ID を使用してパイプラインを作成した場合は、まず、お使いのパイプライン リソースにシステムによって割り当てられた principalId を取得する必要があります。

パイプライン リソースを取得するには、次のコマンドを実行します。

az acr export-pipeline show --resource-group $MyRG --registry $MyReg --name $MyPipeline

この出力から、principalId フィールドの値をコピーします。

次に、次のコマンドを実行して、keyvault に対する適切な secret get アクセス ポリシーのアクセス許可をプリンシパルに付与します。

az keyvault set-policy --name $MyKeyvault --secret-permissions get --object-id $MyPrincipalID

acrtransfer Az CLI 拡張機能を使用して ImportPipeline を作成する

acrtransfer Az CLI 拡張機能を使用して、ターゲット コンテナー レジストリで ImportPipeline リソースを作成します。 既定では、アタッチされたストレージ アカウント コンテナーで新しい成果物 BLOB が受信されたときに Import PipelineRun が自動的に作成されるように、パイプラインが有効化されます。

オプションを使用せず、システム割り当て ID を使用して、インポート パイプラインを作成します。

az acr import-pipeline create \
--resource-group $MyRG \
--registry $MyReg \
--name $MyPipeline \
--secret-uri https://$MyKV.vault.azure.net/secrets/$MySecret \
--storage-container-uri https://$MyStorage.blob.core.windows.net/$MyContainer

使用可能なすべてのオプションを使用し、ソーストリガーを無効にし、ユーザー割り当て ID を使用してインポート パイプラインを作成します。

az acr import-pipeline create \
--resource-group $MyRG \
--registry $MyReg \
--name $MyPipeline \
--secret-uri https://$MyKV.vault.azure.net/secrets/$MySecret \
--storage-container-uri https://$MyStorage.blob.core.windows.net/$MyContainer \
--options DeleteSourceBlobOnSuccess OverwriteTags ContinueOnErrors \
--assign-identity /subscriptions/$MySubID/resourceGroups/$MyRG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$MyIdentity \
--source-trigger-enabled False

インポート オプション

インポート パイプラインの options プロパティでは、省略可能なブール値がサポートされています。 次の値が推奨されます。

パラメーター
options OverwriteTags - 既存のターゲット タグを上書きします。
DeleteSourceBlobOnSuccess - ターゲット レジストリへのインポートが正常に完了した後にソース ストレージ BLOB を削除します。
ContinueOnErrors - 1 つの成果物のインポートが失敗した場合に、ターゲット レジストリ内の残りの成果物のインポートを続行します。

ImportPipeline ID に keyvault ポリシー アクセスを付与する

ユーザー割り当て ID を使用してパイプラインを作成した場合は、このユーザー割り当て ID に、keyvault に対する secret get アクセス ポリシーのアクセス許可を付与するだけです。

システム割り当て ID を使用してパイプラインを作成した場合は、まず、お使いのパイプライン リソースにシステムによって割り当てられた principalId を取得する必要があります。

パイプライン リソースを取得するには、次のコマンドを実行します。

az acr import-pipeline show --resource-group $MyRG --registry $MyReg --name $MyPipeline

この出力から、principalId フィールドの値をコピーします。

次に、次のコマンドを実行して、keyvault に対する適切な secret get アクセス ポリシーをプリンシパルに付与します。

az keyvault set-policy --name $MyKeyvault --secret-permissions get --object-id $MyPrincipalID

acrtransfer Az CLI 拡張機能を使用してエクスポート用の PipelineRun を作成する

acrtransfer Az CLI 拡張機能を使用してコンテナー レジストリ用の PipelineRun リソースを作成します。 このリソースでは、前に作成した ExportPipeline リソースが実行され、指定された成果物が BLOB としてコンテナー レジストリからソース ストレージ アカウントにエクスポートされます。

エクスポート パイプライン実行を作成します。

az acr pipeline-run create \
--resource-group $MyRG \
--registry $MyReg \
--pipeline $MyPipeline \
--name $MyPipelineRun \
--pipeline-type export \
--storage-blob $MyBlob \
--artifacts hello-world:latest hello-world@sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042 \
--force-redeploy

同じプロパティを使用して PipelineRun リソースを再デプロイする場合は、-force-redeploy フラグを使用する必要があります。

成果物のエクスポートには数分かかることがあります。 デプロイが正常に完了したら、ソース ストレージ アカウントのコンテナーでエクスポート済み BLOB を一覧表示することによって、成果物のエクスポートを確認します。 たとえば、az storage blob list コマンドを実行します。

az storage blob list --account-name $MyStorageAccount --container $MyContainer --output table

ドメイン間で BLOB を転送する

ほとんどのユースケースでは、クロス ドメイン ソリューションまたはその他の方法を使用して、ソース ドメイン内のストレージ アカウント (エクスポート パイプラインに関連付けられたストレージ アカウント) からターゲット ドメイン内のストレージ アカウント (インポート パイプラインに関連付けられたストレージ アカウント) に BLOB を転送するようになりました。 現時点では、BLOB は、インポート パイプラインに関連付けられたターゲット ドメイン ストレージ アカウント内に到着したと想定します。

ImportPipeline リソースをトリガーする

インポート パイプラインの作成時に --source-trigger-enabled False パラメーターを使用しなかった場合、パイプラインは、BLOB がストレージ アカウント コンテナー内に到着後 15 分以内にトリガーされます。 成果物のインポートには数分かかることがあります。 インポートが正常に完了したら、ターゲット コンテナー レジストリにインポートしているリポジトリ上のタグを一覧表示して、成果物のインポートを確認します。 たとえば、az acr repository show-tagsを実行します。

az acr repository show-tags --name $MyRegistry --repository $MyRepository

Note

ソース トリガーによって、過去 60 日以内の最終変更時刻を含む BLOB のみがインポートされます。 ソース トリガーを使用してそれより古い BLOB をインポートする場合は、BLOB メタデータを追加して BLOB の最終変更時刻を更新するか、手動で作成したパイプライン実行を使用してインポートしてください。

ImportPipeline の作成時に --source-trigger-enabled False パラメーターを使用した場合は、次のセクションで示すように、PipelineRun を手動で作成する必要があります。

acrtransfer Az CLI 拡張機能を使用してインポート用の PipelineRun を作成する

acrtransfer Az CLI 拡張機能を使用してコンテナー レジストリ用の PipelineRun リソースを作成します。 このリソースでは、以前に作成した ImportPipeline リソースを実行し、指定された BLOB をストレージ アカウントからコンテナー レジストリにインポートします。

インポート パイプライン実行を作成します。

az acr pipeline-run create \
--resource-group $MyRG \
--registry $MyReg \
--pipeline $MyPipeline \
--name $MyPipelineRun \
--pipeline-type import \
--storage-blob $MyBlob \
--force-redeploy

同じプロパティを使用して PipelineRun リソースを再デプロイする場合は、-force-redeploy フラグを使用する必要があります。

成果物のインポートには数分かかることがあります。 インポートが正常に完了したら、ターゲット コンテナー レジストリにリポジトリを一覧表示して、成果物のインポートを確認します。 たとえば、az acr repository show-tagsを実行します。

az acr repository show-tags --name $MyRegistry --repository $MyRepository

ACR 転送リソースを削除する

ExportPipeline を削除します。

az acr export-pipeline delete --resource-group $MyRG --registry $MyReg --name $MyPipeline

ImportPipeline を削除します。

az acr import-pipeline delete --resource-group $MyRG --registry $MyReg --name $MyPipeline

PipelineRun リソースを削除します。 これは、PipelineRun によって実行されたアクションを元に戻さないことに注意してください。 これは、PipelineRun のログの削除によく似ています。

az acr pipeline-run delete --resource-group $MyRG --registry $MyReg --name $MyPipelineRun

ACR 転送のトラブルシューティング

トラブルシューティングのガイダンスについては、「ACR 転送のトラブルシューティング」を参照してください。

次のステップ