APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Azure Container RegistryのArtifact Cacheでレート制限に備えよう

はじめに

こんにちは、ACS事業部の吉川です。

Azure でコンテナを利用されている皆さまのところには、以下のようなメールが届いているかと思います。

このメールが何を意味するのか、何をしなければいけないのか、紐解いていきましょう。

Docker Hub のレート制限

2020年11月より、Docker Hub はコンテナイメージの Pull 回数に上限を設けるレート制限を設定しています。

www.docker.com

このレート制限の影響を受けないようにするためには、リンク先にも記述があるように「Docker の有料プランを契約しレート上限を引き上げる」という対策がありますが、 それ以外の対策として 「組織内にキャッシュレジストリを配置し、Docker Hub へのアクセス回数を減らす」 という方法でも回避できます。
Azure Container Registry(ACR) で後者の対策を実施するための機能が Artifact Cache です。

learn.microsoft.com

Artifact Cache のしくみ

Artifact Cache はパススルーキャッシュとして機能します。
図式化すると以下のようなイメージです。

クライアント側のイメージの Pull に対し、Docker Hub へのアクセスは ACR が代行して行います。一度 ACR 内にイメージがキャッシュされたら、以降の同一イメージへのリクエストは Docker Hub にアクセスすることなく ACR 内のキャッシュを利用します。
このように組織内のキャッシュレジストリとして機能することで、Docker Hub そのものへのアクセス回数を減らすことができます。

Artifact Cache の設定

ACR をキャッシュレジストリとして機能させるためには キャッシュルール の設定が必要です。
ポータルの ACR のメニュー内の サービス -> キャッシュ から設定します。

ルールの作成画面では参照先のレジストリとACR内の名前空間とのマッピングを設定します。

Artifact Cache は Docker Hub 以外にも以下のレジストリを参照先として設定できます。

  • Microsoft Artifact Registry
  • Quay Container Registry
  • GitHub Container Registry
  • ECR Public Gallery
  • NVIDIA (CLIでのみ設定可能)
  • registry.k8s.io (CLIでのみ設定可能)
  • Google Container Registry (CLIでのみ設定可能)

匿名アクセスのできないプライベートなリポジトリに対しては、認証用の資格情報の作成を行う必要があります。認証情報の格納先として Key Vault が必要です。

また、リポジトリのパスを指定することで、参照先のレジストリ内の一部のイメージのみをキャッシュする、ということもできます。

具体的な設定例をいくつか見ていきましょう。

設定例1. Docker Hub のすべてのイメージを対象としてキャッシュする

以下のようなルールを作成します。

参照先リポジトリのパスを docker.io/* 、マッピングするACR内の名前空間を * としました。
クライアント側から以下のようにイメージを Pull してみましょう。

docker pull <ACR名>.azurecr.io/tensorflow/tensorflow:latest

クライアントにイメージが Pull され、以下の通りACR内にキャッシュされていることが確認できます。

設定例2. Docker Hub の一部のイメージのみを対象としてキャッシュする

Docker Hub 内のすべてのイメージではなく、一部のイメージのみをキャッシュ対象としたい場合もあるでしょう。
例えば、Docker Official のイメージのみを対象とする場合は以下のように設定します。

Docker の Official イメージは library という名前空間で公開されているので、参照先リポジトリのパスの設定として docker.io/library/* を指定しました。

クライアント側で以下のコマンドを実行すると、Official の nginx イメージが Pull およびキャッシュされます。

docker pull <ACR名>.azurecr.io/nginx:latest

Official 以外のイメージを Pull しようとすると、以下のとおりエラーとなります。

docker pull <ACR名>.azurecr.io/tensorflow/tensorflow:latest
Error response from daemon: pull access denied for acrforcache.azurecr.io/tensorflow/tensorflow, repository does not exist or may require 'docker login': denied: requested access to pull from source 'docker.io/library/tensorflow/tensorflow' for cache rule 'docker-hub-official' has been denied. Please ensure that the source repository exists and that the correct credentials are provided. CorrelationId: ########-####-####-####-############. For more information, please visit https://aka.ms/acr/cache.

設定例3. 複数の参照先レジストリを設定する

1つの ACR に対し、複数の参照先レジストリを指定できます。その場合は ACR 内の名前空間で分割を行います。
例として Docker Hub と Microsoft Artifact Registry の2つを指定してみましょう。

Docker Hub 向けの設定が以下です。

続いて Microsoft Artifact Registry 向けの設定が以下です。

新しい ACR リポジトリの名前空間 という設定項目の値を、それぞれ docker-hub/*ms-artifact/* と設定しました。

クライアントからは以下のように使用します。

Docker Hub内のイメージを参照したい場合には、以下のように docker-hub という名前空間を指定して Pull します。

docker pull <ACR名>.azurecr.io/docker-hub/tensorflow/tensorflow:latest

Microsoft Artifact Registry のイメージを参照したい場合は、同様に ms-artifact の名前空間を指定します。下記例は ASP.NET Core Runtime を Pull するコマンドです。

docker pull <ACR名>.azurecr.io/ms-artifact/dotnet/aspnet:8.0-noble-chiseled

レート制限対策以外の効果

Artifact Cache は外部レジストリへのアクセスを代行できることから、ネットワーク構成をシンプルにするという目的にも使用できます。
例えば以下のようにアウトバウンド通信を制限した構成の場合、Firewall のポリシーにアクセス先のレジストリを追加しなければなりません。

Artifact Cache を利用すると、イメージを Pull する通信を ACR に寄せることができ、Firewall のポリシーをシンプルに保つことができます。

余談: なぜ2024年6月30日なのか

前述のとおり Docker Hub のレート制限は 2020年11月 より始まっている中、なぜ Microsoft からのメールには 2024年6月30日 という日付が書かれているのでしょうか?
調べてみても正確な情報には辿りつけなかったのですが、Docker のフォーラムおよび海外のブログの情報から、現状 Azure を含めた Microsoft の環境はレート制限の対象外となっている という可能性が高そうです。

forums.docker.com

dev.to

これが2024年6月30日以降にレート制限の対象となる可能性があります。7月以降注意しておくのがよいでしょう。

おわりに

7月まで間もないですが、あらかじめ備えておきたいお話しでした。コンテナイメージの Pull が 429(Too Many Requests) で失敗することがあれば、レート制限によるものの可能性が高いです。7月以降注意していきましょう。

【PR】
私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。

www.ap-com.co.jp

一緒に働いていただける仲間も募集中です!
まだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。
我々の事業部のCultureDeckはコチラ。

www.ap-com.co.jp

本記事の投稿者: 吉川 俊甫
Azureの中でもコンテナ系サービスが好きです。Microsoft MVP (Microsoft Azure)
Shunsuke Yoshikawa - Credly