xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

AcrInsight - Azure Container Registry のビューワーを公開しました

タイトルの通りですが、Azure Container Registry (= ACR) のリポジトリにあるイメージを閲覧するツールを作成/公開しました。

なんと (?) 4 日前の 2018/12/05 に Microsoft Connect(); 2018 で公開されたばかりの WPF on .NET Core 3.0 でできています!WPF がオープンソースになった記念にやってみたかったんや...w 画面は以下のような感じで、超ピュアな WPF です。

f:id:xin9le:20181209184606p:plain

モチベーション (= ACR の不便なところ)

最近仕事で ASP.NET Core MVC 製の Web サービスを開発しています。ホスティング先は Web Apps for Containers で、コンテナイメージの格納先としては Azure Container Registry を利用しています。やりたいことが一通りできてそれなりに満足してます。なのですが、そんな利用中の ACR にも不便なところが...!

以下は Azure Portal で Azure Container Registry のリポジトリを見ている画面のキャプチャです。

f:id:xin9le:20181209182448p:plain

リポジトリに格納されているコンテナイメージに紐付いているタグの一覧が閲覧できる特に何てことなさそうな画面ですが、よく見ると個々のイメージとタグの関連付けが全く分かりません。イメージとタグの関係は例えば以下のように 1 対多になっていて、Docker コマンドを叩くときもそうですがイメージ ID (= ACR で言うところの Digest) はよく利用します。

イメージ ID (= Digest) タグ
sha256:abc123 build-1024
latest
sha256:xyz789 build-1023

ここで ACR の課金体系について考えてみます。ACR の課金体系は格納しているコンテナイメージの容量に依存していて、プランに応じた一定範囲を超えるとドンドン増えていきます。なので、一定容量の範囲に抑えようと思うのであれば定期的にイメージを削除しなければなりません。

ではどうやってイメージを削除するのかと言うと、現状は Azure CLI を叩くしかありません。Azure Portal 上からはタグの削除はできるのですが、それはイメージについているタグを消しているだけでイメージ自体の削除にはなっていません。つまり、イメージに関連付いているタグをすべて削除してしまうとタグのついていない宙ぶらりんなコンテナイメージが残ってしまうことになります。Portal 上から見えていないのにひっそりと課金対象だと...??

そんなこんな、イメージとタグの関係をしっかりと把握して適切に削除なり操作をしたいという気持ちが強くなりました。Azure CLI を使えばこれらの詳細な情報は見られるのですが、やっぱり視覚化するのが良いなと思ってツールとして作ることにしました。

WPF on .NET Core 3.0 の始め方

まだプロジェクトテンプレートがないのでほんの少しだけ手間ですが、実は全然難しくありません。

  1. Visual Studio 2019 Preview 1 (執筆時点) をインストール
  2. .NET Core 3.0 をインストール
  3. コマンドラインで dotnet new wpf と入力してプロジェクトを作成

この 3 を実行するとき、プロジェクト名のフォルダをカレントディレクトリとして実行してください。そうするとイイ感じにテンプレートからプロジェクトが生成されます。

ACR の .NET SDK

実は ACR のリポジトリ情報を閲覧/操作する .NET SDK は NuGet に公開されていません。おかげで .NET から API を叩くのが地味に厳しい...。なのですが、幸いにも (?) GitHub にまだ作業途中のような感じのプロジェクトがあったので、それを使って C# から REST API を叩いています。

この SDK がまだ閲覧関連しかサポートしていないので、残念ながらイメージの削除を実装できませんでした。これは追々なんとか対応したいなーと思ってはいます。

おまけ

WPF 開発と言えば MVVM (?) ということで ReactiveProperty を使っています。ちゃんと .NET Core 3.0 でも動きます。ぜひ今後ともご贔屓によろしくお願いします :)