Azure コンテナー レジストリを別のリージョンに移動する
この記事では、Azure Container Registry リソースを Active Directory テナントの同じサブスクリプション内の別のリージョンに再配置する方法について説明します。
Note
複数の Azure リージョンに同じコンテナー イメージを配布する必要がある場合、Azure Container Registry では geo レプリケーションもサポートされます。 レジストリの geo レプリケーション (Premium サービス レベルが必要) を行うと、1 つのレジストリに含まれる同一のイメージとタグ名を、複数のリージョンで使用できます。
前提条件
レジストリを再配置できるのは、同じ Active Directory テナント内のみです。 この制限は、カスタマー マネージド キーを使用して暗号化されているレジストリと暗号化されていないレジストリに適用されます。
ソース レジストリで可用性ゾーンが有効な場合、ターゲット リージョンも可用性ゾーンをサポートしている必要があります。 Azure Container Registry の可用性ゾーンのサポートの詳細については、Azure Container Registry でゾーン冗長を有効にする方法に関する記事を参照してください。
サービス エンドポイントに関する考慮事項
Azure Container Registry の仮想ネットワーク サービス エンドポイントは、指定した仮想ネットワークへのアクセスを制限します。 エンドポイントは、IPv4 (インターネット プロトコル バージョン 4) アドレス範囲のリストへのアクセスを制限することもできます。 ユーザーがこのようなソース以外からレジストリに接続しようとすると、アクセスを拒否されます。 レジストリ リソースのソース リージョンでサービス エンドポイントが構成されている場合は、ターゲット リージョンでも同じ手順を実行する必要があります。 このシナリオの手順を次に示します。
ターゲット リージョンでレジストリを正常に再作成するには、VNet とサブネットを事前に作成する必要があります。 Azure Resource Mover ツールを使用してこれら 2 つのリソースを移動している場合、サービス エンドポイントは自動的に構成されないため、手動で構成する必要があります。
次に、Azure Container Registry の IaC に変更を加える必要があります。
networkAcl
セクションのvirtualNetworkRules
で、ターゲット サブネットの規則を追加します。 ターゲット リージョンでサービス エンドポイントが構成されていない場合に、IaC が Azure Container Registry のデプロイに失敗するように、ignoreMissingVnetServiceEndpoint
フラグが False に設定されていることを確認します。 これにより、ターゲット リージョンの前提条件を確実に満たすことができます
プライベート エンドポイントに関する考慮事項
Azure Private Link を使用すると、仮想ネットワークから Azure のサービスとしてのプラットフォーム (PaaS)、お客様が所有するサービス、または Microsoft パートナーのサービスへのプライベート接続が可能になります。 Private Link がネットワーク アーキテクチャを簡素化し、パブリック インターネットへのデータの公開をなくすことで Azure のエンドポイント間の接続をセキュリティで保護します。
ターゲット リージョンでリソースを正常に再作成するには、実際に再作成が発生する前に VNet とサブネットを作成する必要があります。
Azure プライベート エンドポイントの DNS 統合に関する考慮事項
プライベート エンドポイントの IP アドレスを接続文字列の完全修飾ドメイン名 (FQDN) に解決するように、DNS 設定を正しく構成する必要があります。
既存の Microsoft Azure サービスには、パブリック エンドポイント用の DNS 構成が既に存在している場合があります。 プライベート エンドポイントを使用して接続するには、この構成をオーバーライドする必要があります。
プライベート エンドポイントに関連付けられているネットワーク インターフェイスには、DNS を構成するための情報が含まれています。 ネットワーク インターフェイスの情報には、プライベート リンク リソースの FQDN とプライベート IP アドレスが含まれています。
次のオプションを使用して、プライベート エンドポイントの DNS 設定を構成できます。
- ホスト ファイルを使用する (テストにのみ推奨)。 仮想マシン上のホスト ファイルを使用して、DNS をオーバーライドすることができます。
- プライベート DNS ゾーンを使用する。 プライベート DNS ゾーンを使用して、プライベート エンドポイントの DNS 解決をオーバーライドすることができます。 プライベート DNS ゾーンを自分の仮想ネットワークにリンクして、特定のドメインを解決することができます。
- DNS フォワーダーを使用する (オプション)。 DNS フォワーダーを使用して、プライベート リンク リソースの DNS 解決をオーバーライドすることができます。 仮想ネットワークでホストされている DNS サーバーでプライベート DNS ゾーンを使用する DNS 転送規則を作成します。
Azure Container Registry は、Premium レベルを使用し、ターゲット リージョンで構成する必要があります。
レジストリへの公衆ネットワーク アクセスが無効になっている場合、Azure Security Center を含む特定の信頼されたサービスによるレジストリ アクセスのためには、ネットワーク設定でのネットワーク ルールのバイパスを有効にする必要があります。
レジストリに承認されたプライベート エンドポイントが含まれ、かつ公衆ネットワーク アクセスが無効になっている場合、Azure portal、Azure CLI、またはその他のツールを使用してリポジトリやタグを仮想ネットワークの外部で一覧表示することはできません。
新しいレプリカの場合は、ターゲット リージョンのデータ エンドポイントに新しい DNS レコードを手動で追加する必要があります。
ダウンタイム
発生の可能性のあるダウンタイムを理解するには、「Azure 向けのクラウド導入フレームワーク: 再配置方法を選択する」を参照してください。
準備
Note
クライアント固有のデータを保持せず、単独で移動するコンテナー レジストリのみを再配置する場合は、Bicep または JSON を使用してレジストリを再デプロイするだけで済みます。
他の可用性構成テンプレートを確認するには、「Bicep、ARM テンプレート、Terraform AzAPI プロバイダーを使用してリソースを定義する」を参照してください
データ移行を伴う再配置を準備するには:
レジストリで使用されるすべての Azure サービスを含む依存関係マップを作成します。 再配置の対象となるサービスについては、適切な再配置戦略を選択する必要があります。
ファイアウォールやネットワークの分離など、Azure Container Registry (ACR) のソース ネットワーク レイアウトを特定します。
ターゲット レジストリへのインポートに必要なイメージをソース レジストリから取得します。 イメージを取得するには、次のコマンドを実行します。
Get-AzContainerRegistryRepository -RegistryName registry
ACR タスクを使用して、ターゲット レジストリにインポートするソース レジストリの自動化構成を取得します。
テンプレートをエクスポートする
まず、Resource Manager テンプレートをエクスポートします。 このテンプレートには、コンテナー レジストリを表す設定が含まれています。 エクスポートされたテンプレートを使用する方法の詳細については、「Azure portal からエクスポートしたテンプレートを使用する」および「テンプレート リファレンス」を参照してください。
Azure portal で、お使いのソース レジストリに移動します。
メニューの [オートメーション] で、 [テンプレートのエクスポート]>[ダウンロード] を選択します。
ポータルからダウンロードした .zip ファイルを見つけて、選択したフォルダーにそのファイルを解凍します。
この zip ファイルには、テンプレートとテンプレートをデプロイするためのスクリプトから構成される .json ファイルが含まれています。
テンプレートを変更する
ダウンロードしたテンプレート JSON ファイル内のレジストリ プロパティを調べ、必要な変更を行います。 少なくとも以下を実行します。
- レジストリ名の
defaultValue
をターゲット レジストリの目的の名前に変更する location
をターゲット レジストリの目的の Azure リージョンに更新する
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"registries_myregistry_name": {
"defaultValue": "myregistry",
"type": "String"
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.ContainerRegistry/registries",
"apiVersion": "2020-11-01-preview",
"name": "[parameters('myregistry_name')]",
"location": "centralus",
...
}
]
}
Registry scopeMaps、レプリケーション構成、診断設定 (ログ分析など) など、ダウンロードしたテンプレート内のすべての関連リソースの詳細を確認します。
ソース レジストリが暗号化されている場合は、カスタマー マネージド キーを使用してターゲット レジストリを暗号化し、必要なマネージド ID、キー コンテナー、キーの設定でテンプレートを更新します。 カスタマー マネージド キーは、レジストリをデプロイするときにのみ有効にできます。
リソース グループの作成
az group create コマンドを使用して、ターゲット レジストリのリソース グループを作成します。 次の例では、myResourceGroup という名前のリソース グループを eastus に作成します。
az group create --name myResourceGroup --location eastus
Redeploy
テンプレートを使用してターゲット レジストリをデプロイするには、az deployment group create コマンドを使用します。
az deployment group create --resource-group myResourceGroup \
--template-file template.json --name mydeployment
Note
デプロイ中にエラーが発生した場合は、テンプレート ファイル内での特定の構成の更新と、コマンドの再試行が必要になる可能性があります。
ターゲット レジストリにレジストリ コンテンツをインポートする
ターゲット リージョンにレジストリを作成した後、次の手順を実行します。
az acr import コマンドまたは同等の PowerShell コマンド
Import-AzContainerImage
を使用して、保持するイメージやその他の成果物をソース レジストリからターゲット レジストリにインポートします。 コマンドの例については、「コンテナー レジストリにコンテナー イメージをインポートする」を参照してください。Azure CLI コマンド az acr repository list および az acr repository tags、または Azure PowerShell の同等のコマンドを使用すると、ご自身のソース レジストリのコンテンツを列挙できます。
個々の成果物に対してインポート コマンドを実行するか、成果物の一覧に対してコマンドが実行されるようにスクリプトを作成します。
次のサンプル Azure CLI スクリプトでは、ソース リポジトリとタグが列挙されて、成果物が同じ Azure サブスクリプションのターゲット レジストリにインポートされます。 必要に応じて、特定のリポジトリまたはタグをインポートします。 異なるサブスクリプションまたはテナント内のレジストリからインポートするには、「コンテナー レジストリにコンテナー イメージをインポートする」の例を参照してください。
#!/bin/bash
# Modify registry names for your environment
SOURCE_REG=myregistry
TARGET_REG=targetregistry
# Get list of source repositories
REPO_LIST=$(az acr repository list \
--name $SOURCE_REG --output tsv)
# Enumerate tags and import to target registry
for repo in $REPO_LIST; do
TAGS_LIST=$(az acr repository show-tags --name $SOURCE_REG --repository $repo --output tsv);
for tag in $TAGS_LIST; do
echo "Importing $repo:$tag";
az acr import --name $TARGET_REG --source $SOURCE_REG.azurecr.io/$repo":"$tag;
done
done
診断設定のログ分析ワークスペースなどの依存リソースをターゲットの Azure Container Registry に関連付けます。
次のコマンドを実行して、プロビジョニング済みまたはプロビジョニングされていない両方の種類の AKS クラスターと Azure Container Registry との統合を構成します。
Set-AzAksCluster -Name myAKSCluster -ResourceGroupName myResourceGroup -AcrNameToAttach <acr-name>
Kubernetes マニフェスト ファイルに必要な変更を加えて、再配置された Azure Container Registry (ACR) と統合します。
ソース レジストリではなくターゲット レジストリを使用するように、開発システムとデプロイ システムを更新します。
ターゲット レジストリへのアクセスを許可するように、すべてのクライアント ファイアウォール規則を更新します。
確認
お使いのターゲット レジストリ内で、次の情報を確認します。
- レジストリ名、サービス レベル、パブリック アクセス、レプリケーションなどのレジストリ設定
- 保持するコンテンツのリポジトリとタグ。
元のレジストリを削除する
ターゲット レジストリ、移行されたコンテンツ、検証済みレジストリ設定を適切にデプロイしたら、ソース レジストリを削除することができます。
関連するコンテンツ
- レジストリ リソースを同じサブスクリプションまたは [新しいサブスクリプション] 内の新しいリソース グループに移動するには、「Azure リソースを新しいリソース グループまたはサブスクリプションに移動する」を参照してください。
パブリック レジストリや別のプライベート レジストリから Azure コンテナー レジストリへのコンテナー イメージのインポートについて学習する。
Azure Container Registry の Resource Manager テンプレートのリファレンスを確認する。