🐡

ACRの成果物の転送を試す

2023/05/21に公開

はじめに

ACRに「成果物の転送」という機能が追加されました。
公式ドキュメント

現時点では、プレビューでPremiumレベルのACRでのみ使用できる機能です。

準備

早速試してみます。
現時点では、Azureポータルに該当の機能はないため、Azure CLIでの操作になります。

コンテナイメージのコピー元、コピー先となるACR以外に、コンテナイメージを格納するストレージアカウントと、
SASトークンを格納するKeyVaultを作成しておく必要があります。

リソースの作成 (コピー元)
# 変数設定
SOURCE_RG="<source-resource-group>"
SOURCE_ACR="<source-container-registry>"
SOURCE_SA="<source-storage-account>"
SOURCE_BLOB="<source-blob-container>"
SOURCE_KV="<source-key-vault>"

#リソースグループの作成
az group create --name $SOURCE_RG --location japaneast

#ACRの作成
az acr create \
  --resource-group $SOURCE_RG \
  --name $SOURCE_ACR
  --sku Premium

#ストレージアカウントの作成
az storage account create \
  --resource-group $SOURCE_RG \
  --name $SOURCE_SA \
  --location japaneast \
  --sku Standard_LRS

#Blobコンテナ―の作成
az storage container create \
  --resource-group $SOURCE_RG \
  --account-name $SOURCE_SA \
  --name $SOURCE_BLOB

#KeyVaultの作成
az keyvault create \
  --resource-group $SOURCE_RG \
  --name $SOURCE_KV 

リソースの作成 (コピー先)
# 変数設定
TARGET_RG="<target-resource-group>"
TARGET_ACR="<target-container-registry>"
TARGET_KV="<target-key-vault>"
TARGET_SA="<target-storage-account>"
TARGET_BLOB="<target-blob-container>"

#リソースグループの作成
az group create --name $TARGET_RG --location japaneast

#ACRの作成
az acr create \
  --resource-group $TARGET_RG \
  --name $TARGET_ACR
  --sku Premium

#ストレージアカウントの作成
az storage account create \
  --resource-group $TARGET_RG \
  --name $TARGET_SA \
  --location japaneast \
  --sku Standard_LRS

#Blobコンテナ―の作成
az storage container create \
  --resource-group $TARGET_RG \
  --account-name $TARGET_SA \
  --name $TARGET_BLOB

#KeyVaultの作成
az keyvault create \
  --resource-group $TARGET_RG \
  --name $TARGET_KV 

まず、AzureCLIの拡張機能が必要となるため、追加しておきます。
また、Blobへアクセスする際のSASトークンをシークレットに格納しておく必要があるため、
SASトークの生成とシークレットへの格納を実施しておきます。

準備(コピー元)
# 拡張機能の追加
az extension add --name acrtransfer

# エクスポート用SASトークン生成
EXPORT_SAS=?$(az storage container generate-sas \
  --name $SOURCE_BLOB \
  --account-name $SOURCE_SA \
  --expiry 2024-01-01 \
  --permissions alrw \
  --https-only \
  --output tsv)

# エクスポート用SASトークンの格納
az keyvault secret set \
  --name acrexportsas \
  --value $EXPORT_SAS \
  --vault-name $SOURCE_KV
準備(コピー先)
# 拡張機能の追加
az extension add --name acrtransfer

# インポート用SASトークン生成
IMPORT_SAS=?$(az storage container generate-sas \
  --name $TARGET_BLOB \
  --account-name $TARGET_SA \
  --expiry 2024-01-01 \
  --permissions dlr \
  --https-only \
  --output tsv)

# インポート用SASトークンの格納
az keyvault secret set \
  --name acrimportsas \
  --value $IMPORT_SAS \
  --vault-name $TARGET_KV

エクスポート

まずは、転送元側のACRにあるコンテナイメージをBlobへエクスポートします。
エクスポートパイプライン にてACRとBlobの紐づけを行ったうえで、
パイプラインを実行するコマンドで、実際にイメージをBlobとしてエクスポートします。

エクスポート(コピー元)
# エクスポートパイプラインの作成
az acr export-pipeline create \
--resource-group $SOURCE_RG \
--registry $SOURCE_ACR \
--name "EXPORTPIPELINE" \
--secret-uri https://$SOURCE_KV.vault.azure.net/secrets/acrexportsas \
--options OverwriteBlobs ContinueOnErrors \
--storage-container-uri https://$SOURCE_SA.blob.core.windows.net/$SOURCE_BLOB

# エクスポートパイプラインへの権限付与
EXPORT_PIPELINEID=$(az acr export-pipeline show --resource-group $SOURCE_RG --registry $SOURCE_ACR --name "EXPORTPIPELINE" --query "identity.principalId" -o tsv)
az keyvault set-policy --name $SOURCE_KV --secret-permissions get --object-id $EXPORT_PIPELINEID

# エクスポートパイプライン実行の作成
az acr pipeline-run create \
--resource-group $SOURCE_RG \
--registry $SOURCE_ACR \
--pipeline "EXPORTPIPELINE" \
--name "EXPORTPIPELINERUN" \
--pipeline-type export \
--storage-blob $SOURCE_BLOB \
--artifacts busybox:latest \
--force-redeploy

Blobの転送

オブジェクトレプリケーションを設定するなり、手動でコピーするなりして
インポート側のストレージアカウントへBlobをコピーします。

用途次第ですが、エクスポートしたBlobをそのままインポートしても良い気がします。

エクスポートされたBlobを少し確認します。
今回はテストとしてbusyboxイメージを使いました。
busybox.tarはsaveコマンドで保存したもの、blob.tarはACRからエクスポートされたBlob。

サイズもだいぶ小さくなってますし、単にsaveしてるということではなさそうです。

# du -h busybox.tar blob.tar
4.9M    busybox.tar
2.6M    blob.tar

# tar -tf busybox.tar
baacf561cfff825708763ce7ee4a18293716c533e6ece3bd39009a5fb3c804d2.tar
7cfbbec8963d8f13e6c70416d6592e1cc10f47a348131290a55d43c3acab3fb9.json
d2b2549a9a140334a243f3aac7310368d225ac4cf35837a429fb17f7ba296640/layer.tar
d2b2549a9a140334a243f3aac7310368d225ac4cf35837a429fb17f7ba296640/VERSION
d2b2549a9a140334a243f3aac7310368d225ac4cf35837a429fb17f7ba296640/json
manifest.json
repositories

# tar -tf blob.tar
catalog.json
manifests/sha256/3bdc3456d26408d6ba8a530dd4a99ba4e56a783dc7f19840a86388e8d55db453
blobs/sha256/d1323f8e1bd379c57bb57f0f7e1cc0445ef2b691beffa1b5108c241390c25f4e
manifests/sha256/fd57f171adf51bbe76c8375aab743732e4274ae088048d2ebb2bde4ab5ffabe1
blobs/sha256/7cfbbec8963d8f13e6c70416d6592e1cc10f47a348131290a55d43c3acab3fb9
blobs/sha256/e8123368a63a55cbbec3443e85ab92dbf736bb7732508a1089bd85ddef384549

インポート

エクスポートと同じように、インポートパイプラインを設定し、
パイプラインを実行する形でコンテナイメージをインポートします。

インポート(コピー先)
# インポートパイプラインの作成
az acr import-pipeline create \
--resource-group $TARGET_RG \
--registry $TARGET_ACR \
--name "IMPORTPIPELINE"  \
--secret-uri https://$TARGET_KV.vault.azure.net/secrets/acrimportsas \
--options DeleteSourceBlobOnSuccess OverwriteTags ContinueOnErrors \
--storage-container-uri https://$TARGET_SA.blob.core.windows.net/$TARGET_BLOB

# インポートパイプラインへの権限付与
IMPORT_PIPELINEID=$(az acr import-pipeline show --resource-group $TARGET_RG --registry $TARGET_ACR --name "IMPORTPIPELINE" --query "identity.principalId" -o tsv)
az keyvault set-policy --name $TARGET_KV --secret-permissions get --object-id $IMPORT_PIPELINEID

# インポートパイプライン実行の作成
az acr pipeline-run create \
--resource-group $TARGET_RG \
--registry $TARGET_ACR \
--pipeline "IMPORTPIPELINE" \
--name "IMPORTPIPELINERUN" \
--pipeline-type import \
--storage-blob $TARGET_BLOB \
--force-redeploy

まとめ

新しく追加された成果物の転送機能を試してみました。
コンテナイメージをBlobにエクスポート、およびBlobからコンテナイメージをインポートするという機能です。

コンテナイメージをsave、移送、loadっていう手順と基本的には同じですが
saveやloadを実行する環境が不要になるというのが利点でしょうか。

コマンドを実行する環境があって、コピー元、コピー先双方にアクセスできるのであれば
もっとシンプルにskopeoでコピーすれば良いと思います。

これまで開発環境でsaveしたものを本番環境へ持ち込んでloadという手順で
リポジトリ間でコピーしていた人にとっては、選択肢が増えることになると思います。

Discussion