xin9le.net

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

クラウドサービスを指定のリソースグループ内に作成する

Microsoft Azureプレビューポータル にはリソースグループという考え方が導入されています。簡単に言うと、1 つのアプリケーション内にある複数のリソースをまとめて管理するための論理的なグループのことです。現行の管理ポータルを利用している範囲ではお目にかかることはないのですが、プレビューポータルを開くと勝手な名前でこれらができていたりして潔癖な僕には大変我慢ならない...!自分が意図したリソースグループに作成した各サービスをキチンと入れないと気持ち悪い!そんなこんな、今回はみんな大好き仮想マシンについて。

仮想マシンはクラウドサービス配下に

仮想マシンを作ったことがある方はクラウドサービスも作成する (or 既存のそれを指定する) 必要があることをご存知と思います。

仮想マシンの構成

私は Azure に大変に疎いのでクラウドサービスが何モノかは全然わかっていませんが、とりあえず仮想マシンはクラウドサービスの配下で動いているのだろうという事だけはそこから読み取っています。つまりそこに親子関係があるということは、仮想マシンの親となるクラウドサービスを指定のリソースグループに入れられれば、その子である仮想マシンも狙った通りのリソースグループに属させられるだろうと考えました。はい、実際そうなります。

クラウドサービス作成時の問題

前述のように、クラウドサービスを所定のリソースグループの配下に作成できれば勝ちです。しかし、現状 (執筆時点 = 2015/04/26) ではクラウドサービス単体での作成に当たってはリソースグループを指定できないという問題があります。プレビューポータルに至っては、クラウドサービスを単体で作ることすらできません (将来的にはできるようになるハズ)。

また、現行のポータルから仮想マシンを作る際に同時に新しいクラウドサービスを作成できますが、以下の問題があります。

  • 勝手にクラウドサービスと同名のリソースグループが作成され、その配下に属する
  • クラウドサービスと同名のリソースグループがすでに存在する場合、その配下に入る
  • リソースグループと同名のクラウドサービス DNS 名が利用されている可能性がある

では、プレビューポータルならどうか。残念ながら、プレビューポータルから仮想マシンを作成する場合にも以下の問題があります。

  • リソースグループは選べるが、クラウドサービス自体に勝手な名前が付けられる
  • 勝手に仮想ネットワークが作成され、紐付けられる

つまり、管理ポータルという GUI を利用する以上は、クラウドサービスを狙った名称で狙ったリソースグループに置くのはほぼ不可能ということになります。そんなこんなで諦めかかったところにこんなツイートが飛んできました。

なるほど、Azure の REST API なり SDK なりを使って解決できるという事か。やってみようじゃないか...!

Azure SDK でクラウドサービスを生成

ということで、今回は C# ベースで解決するために Azure SDK を利用してみました。NuGet から 'Microsoft Azure Compute Management Library' を取得します。

Microsoft Azure Compute Management Library

次に Azure を操作するための管理証明書を作成/取得します。以下の URL にアクセスすることで自動で管理証明書の作成を行い、発行プロファイル (.publishsettings) をダウンロードできます。

https://manage.windowsazure.com/publishsettings

ただし、こちらにも説明がありますが、管理証明書の登録は URL にアクセスするだけで行われます。管理証明書の登録は上限が 100 個に設定されているようなので、頻繁なアクセスはしない方が良さそうです。登録された管理証明書の削除は管理ポータルから実行可能です。

発行プロファイルをダウンロードできたら、認証情報 (サブスクリプション ID / 管理証明書) を取り出して以下のような感じのコードを書きます。これで既存のリソースグループに対して新たにクラウドサービスを追加できます。

//--- 認証情報
const string subscriptionId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
const string managementCertificate = "MIIKBAIBAzxxxxxxxxxxxxxxxxxxx";

//--- APIアクセスで使用する認証情報を用意
var managementCertificateBytes = Convert.FromBase64String(managementCertificate);
var certificate = new X509Certificate2(managementCertificateBytes);
var credential = new CertificateCloudCredentials(subscriptionId, certificate);

//--- クラウドサービス作成
var client = new ComputeManagementClient(credential);
var response = await client.HostedServices.CreateAsync(new HostedServiceCreateParameters()
{
    AffinityGroup       = null,
    Description         = string.Empty,
    ExtendedProperties  = new Dictionary<string, string>
                        {
                            { "ResourceGroup", "Sample-ResourceGroup" },  //--- 既存のリソースグループ名
                            { "ResourceLocation", "Japan West" },
                        },
    Label               = "sample-cloudservice",
    Location            = "Japan West",
    ReverseDnsFqdn      = null,
    ServiceName         = "sample-cloudservice",  //--- クラウドサービス名
}, CancellationToken.None);

クラウドサービスの作成が完了したら、現行の管理ポータルから既存のクラウドサービスを親として選択しつつ、仮想マシンを作成すれば OK です。

まとめ

いちいち SDK を利用して結構めんどくさいですが、プレビューポータルでこのあたりが整備されれば GUI ベースで対応できるようになるでしょう。いつになるかは分かりませんが、それまでの辛抱ですね。