銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Azure CLI 2.0 で自分のイメージにRHELやCentOSと名付けたら、意図せずMarketplaceからVMが起動される件

最近はまってしまって、意図しない課金が発生したのでMicrosoft supportとやりとり中なのですが、公開できる部分に関してこちらで調査した結果わかったAzure CLIの挙動についてメモしておきます。

最近発表された、管理ディスクとイメージの機能によって、OSをカスタマイズしたVHDからVMを起動していた場合、イメージとして汎用化して保存しておくことができるようになりました。これにより、今迄起動するVMを同じリソースグループかつロケーションにVHDを配置しないといけなかったのが、異なるリソースグループにあるイメージからVMを起動できるようになりました。 docs.microsoft.com

そこで、今迄つかっていたカスタムイメージのVHDファイルを使って、rhelという名前のイメージを作成しました。Azure CLI 2.0 で確認するとこうなります。

$ az image list
Location    Name        ProvisioningState    ResourceGroup
----------  ----------  -------------------  ---------------
japanwest   rhel        Succeeded            RHEL-BASE

で、これを使ってVMを起動します。ポータルから起動する場合は下の図のようにイメージのメニューにあります。 f:id:tanaka733:20170330174101p:plain

なのですが、NICを複数つけたい場合などポータルではサポートされていない機能を使いたい場合はAzure CLI 2.0を使うことになります*1。イメージを指定する場合のAzure CLI 2.0のコマンドについては下記ドキュメントに記載があります

docs.microsoft.com

で、おそらく必要最低限のオプションを指定するとこうなります。

$ az vm create -n testvm3  -g rhel-base -l japanwest --image rhel --storage-sku Standard_LRS --size Standard_A1 --authentication-type password --admin-password clouduser

これでVMが無事起動…と思いきや、よくVMの中を見てみるとこのVMはMarketplaceに登録してあるRed Hat Enterprise LinuxのVMになっています。注意すべきこととしては、MarketplaceのVMは追加でRed Hatのサブスクリプションが上乗せされています*2。これはなぜかというと、Azure CLI 2.0(もしくはサーバー側)でいくつかのMarketplaceのイメージに対してエイリアスが登録されていて、そのエイリアスと自分の作成したイメージ名が重なった場合、エイリアスの方が優先される挙動となっているためのようです*3

エイリアスとしては下記のものが登録されているようですが、このあたりは将来的に追加、変更などがあるでしょう。

  • ‘Win2016Datacenter’
  • ‘Win2012R2Datacenter’
  • ‘Win2008R2SP1’
  • ‘Win2012Datacenter’
  • ‘UbuntuLTS’
  • ‘CentOS’
  • ‘openSUSE-Leap’
  • ‘RHEL’
  • ‘SLES’
  • ‘Debian’
  • ‘CoreOS’

ドキュメントには「イメージとは別のリソース グループに VM を作成するには、イメージに対する完全なリソース ID を指定します。」と書いていますが、同じリソースグループにVMを作成する場合でもエイリアスの方が優先されるので注意が必要です。

というわけで、現状の挙動をふまえて、意図しないMarketplaceからのVMの起動を防ぐには下記の対策が有効ではないでしょうか。

  • 自分の作成するVMにはrhelやCentOS、Win2016Datacenterといったエイリアスと重なりそうな名前はつけない
  • Azure CLI 2.0でイメージを指定する場合、イメージ名ではなくリソースID /subscriptions/GUID/resourceGroups/ResourceGroupName/providers/Microsoft.Compute/images/ImageName) を指定する

個人的にはスコープが限定されているものが優先されて選択されるのが直感的なのですが、このあたりは好みによるのでしょうか… また続報があれば更新します。

*1:従来のAzure CLIだと使えなかったり、説明が足りていなかったりすることがあるので

*2:カスタムのRHELのVHDを使うということは、すでに持っているサブスクリプションをAzureに持ち込んでつかいたいはずで、Marketplaceのサブスクリプションを使うことは想定していないと思われます

*3:サポートに確認中