ACRの成果物の転送を試す
はじめに
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