成果物を別のレジストリに転送する

この記事では、イメージまたはその他のレジストリ成果物のコレクションを 1 つの Azure コンテナー レジストリから別のレジストリに転送する方法について説明します。 ソース レジストリとターゲット レジストリは、同じサブスクリプションまたは異なるサブスクリプション、Active Directory テナント、Azure クラウド、または物理的に切断されたクラウドに存在する可能性があります。

成果物を転送するには、BLOB ストレージを使用して、2 つのレジストリ間で成果物をレプリケートする "転送パイプライン" を作成します。

  • ソース レジストリの成果物が、ソース ストレージ アカウントの BLOB にエクスポートされます。
  • BLOB が、ソース ストレージ アカウントからターゲット ストレージ アカウントにコピーされます。
  • ターゲット ストレージ アカウント内の BLOB が、ターゲット レジストリに成果物としてインポートされます。 ターゲット ストレージで成果物 BLOB が更新されるたびにトリガーされるように、インポート パイプラインを設定できます。

この記事では、転送パイプラインを作成して実行するための前提条件となるリソースを作成します。 Azure CLI は、ストレージ シークレットなど、関連付けられているリソースをプロビジョニングするために使用されます。 Azure CLI バージョン 2.2.0 以降が推奨されます。 CLI をインストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。

この機能は、Premium コンテナー レジストリ サービス レベルで使用できます。 レジストリ サービスのレベルと制限については、Azure Container Registry のレベルに関するページを参照してください。

重要

現在、この機能はプレビュー段階にあります。 プレビュー版は、追加使用条件に同意することを条件に使用できます。 この機能の一部の側面は、一般公開 (GA) 前に変更される可能性があります。

ユースケースを考える

転送は、物理的に切断されたクラウド内の 2 つの Azure コンテナー レジストリ間で、各クラウドのストレージ アカウントによって仲介されるコンテンツのコピーに最適です。 そうではなく、Docker Hub などのクラウド ベンダーを含め、接続されたクラウド内のコンテナー レジストリからイメージをコピーする場合は、イメージ インポートを使用することをお勧めします。

前提条件

  • コンテナー レジストリ - 転送する成果物を含む既存のソース レジストリと、ターゲット レジストリが必要です。 ACR 転送は、物理的に切断されたクラウド間での移動を目的としています。 テストの場合、ソース レジストリとターゲット レジストリは、同じまたは異なる Azure サブスクリプション、Active Directory テナント、またはクラウドに存在する可能性があります。

    レジストリを作成する必要がある場合は、「クイック スタート: Azure CLI を使用したプライベート コンテナー レジストリの作成」を参照してください。

  • ストレージ アカウント - サブスクリプション内および任意の場所にソース ストレージ アカウントとターゲット ストレージ アカウントを作成します。 テスト目的では、ソース レジストリおよびターゲット レジストリと同じ 1 つまたは複数のサブスクリプションを使用できます。 クロスクラウドのシナリオでは、通常、各クラウドに個別のストレージ アカウントを作成します。

    必要に応じて、Azure CLI またはその他のツールでストレージ アカウントを作成します。

    各アカウントで成果物転送用の BLOB コンテナーを作成します。 たとえば、transfer という名前のコンテナーを作成します。

  • キー コンテナー - ソース ストレージ アカウントとターゲット ストレージ アカウントへのアクセスに使用される SAS トークン シークレットを格納するには、キー コンテナーが必要です。 ソース レジストリおよびターゲット レジストリと同じ 1 つまたは複数の Azure サブスクリプションに、ソース キー コンテナーとターゲット キー コンテナーを作成します。 デモンストレーションの目的で、この記事で使用されているテンプレートとコマンドでも、ソースとターゲットの各キー コンテナーは、それぞれソースとターゲットの各レジストリと同じリソース グループにあることを前提としています。 この共通のリソース グループの使用は必須ではありませんが、この記事で使用するテンプレートとコマンドが簡単になります。

    必要に応じて、Azure CLI またはその他のツールを使用してキー コンテナーを作成します。

  • 環境変数 - この記事のコマンド例では、ソース環境とターゲット環境に対して次の環境変数を設定します。 すべての例は、Bash シェル用に書式設定されています。

    SOURCE_RG="<source-resource-group>"
    TARGET_RG="<target-resource-group>"
    SOURCE_KV="<source-key-vault>"
    TARGET_KV="<target-key-vault>"
    SOURCE_SA="<source-storage-account>"
    TARGET_SA="<target-storage-account>"
    

シナリオの概要

レジストリ間のイメージ転送用に、次の 3 つのパイプライン リソースを作成します。 すべて PUT 操作を使用して作成されます。 これらのリソースは、"ソース" と "ターゲット" のレジストリおよびストレージ アカウントで動作します。

ストレージ認証では、キー コンテナーのシークレットとして管理される SAS トークンが使用されます。 パイプラインでは、マネージド ID を使用してコンテナー内のシークレットが読み取られます。

  • ExportPipeline - "ソース" レジストリおよびストレージ アカウントに関する概要情報を含む長期間のリソース。 この情報には、ソース ストレージ BLOB コンテナーの URI と、ソース SAS トークンを管理するキー コンテナーが含まれます。
  • ImportPipeline - "ターゲット" レジストリおよびストレージ アカウントに関する概要情報を含む長期間のリソース。 この情報には、ターゲット ストレージ BLOB コンテナーの URI と、ターゲット SAS トークンを管理するキー コンテナーが含まれます。 インポート トリガーは既定で有効になっているため、成果物 BLOB がターゲット ストレージ コンテナーに格納されるときに、パイプラインが自動的に実行されます。
  • PipelineRun - ExportPipeline リソースまたは ImportPipeline リソースを呼び出すために使用されるリソース。
    • ExportPipeline を手動で実行するには、PipelineRun リソースを作成し、エクスポートする成果物を指定します。
    • インポート トリガーが有効になっている場合、ImportPipeline は自動的に実行されます。 また、PipelineRun を使用して手動で実行することもできます。
    • 現時点では、PipelineRun ごとに最大 50 個の成果物を転送できます。

注意事項

  • ExportPipeline と ImportPipeline は、通常、ソース クラウドとターゲット クラウドに関連付けられている異なる Active Directory テナントにあります。 このシナリオでは、リソースのエクスポートとインポート用に個別のマネージド ID とキー コンテナーが必要です。 テスト目的では、これらのリソースを同じクラウドに配置し、ID を共有することができます。
  • 既定では、ExportPipeline および ImportPipeline の各テンプレートによって、システム割り当てマネージド ID を使用してキー コンテナーのシークレットにアクセスできるようになります。 ExportPipeline および ImportPipeline テンプレートでは、ユーザー割り当て ID もサポートされています。

SAS キーを作成して格納する

転送では、共有アクセス署名 (SAS) トークンを使用して、ソース環境とターゲット環境のストレージ アカウントにアクセスします。 次のセクションで説明するように、トークンを生成して格納します。

重要

ACR 転送は、Key Vault のシークレットに格納された手動生成された SAS トークンを使用して動作しますが、運用環境のワークロードでは、代わりに Key Vault で管理されたストレージ SAS 定義シークレットを使用することを強くお勧めします。

エクスポート用に SAS トークンを生成する

az storage container generate-sas コマンドを実行して、ソース ストレージ アカウントで、成果物のエクスポートに使用されるコンテナーの SAS トークンを生成します。

推奨されるトークン アクセス許可:読み取り、書き込み、一覧表示、追加。

次の例では、コマンド出力は、"?" 文字で始まる EXPORT_SAS 環境変数に割り当てられています。 環境の --expiry 値を更新します。

EXPORT_SAS=?$(az storage container generate-sas \
  --name transfer \
  --account-name $SOURCE_SA \
  --expiry 2021-01-01 \
  --permissions alrw \
  --https-only \
  --output tsv)

エクスポート用に SAS トークンを格納する

az keyvault secret set を使用して、ソース Azure キー コンテナーに SAS トークンを格納します。

az keyvault secret set \
  --name acrexportsas \
  --value $EXPORT_SAS \
  --vault-name $SOURCE_KV

インポート用に SAS トークンを生成する

az storage container generate-sas コマンドを実行して、ターゲット ストレージ アカウントで、成果物のインポートに使用されるコンテナーの SAS トークンを生成します。

推奨されるトークン アクセス許可:読み取り、削除、一覧表示

次の例では、コマンド出力は、"?" 文字で始まる IMPORT_SAS 環境変数に割り当てられています。 環境の --expiry 値を更新します。

IMPORT_SAS=?$(az storage container generate-sas \
  --name transfer \
  --account-name $TARGET_SA \
  --expiry 2021-01-01 \
  --permissions dlr \
  --https-only \
  --output tsv)

インポート用に SAS トークンを格納する

az keyvault secret set を使用して、ターゲット Azure キー コンテナーに SAS トークンを格納します。

az keyvault secret set \
  --name acrimportsas \
  --value $IMPORT_SAS \
  --vault-name $TARGET_KV

次のステップ