Red Hat on Azure の基本~Red Hat on AzureでAzureのリソースを管理する方法 その2


1. 前回のおさらいと運用省力化について

皆さん、こんにちは。日本マイクロソフト パートナービジネス推進本部でクラウドソリューションアーキテクトをやっている、森山です。前回、Red Hat Enterprise Linux上でAzure CLI 2.0をインストールについて説明いたしました。

前回の記事のなかでクラウド利用における作業の省力化について少しふれました。 ブラウザを使い、Azureポータルでクリックをしながらサーバーやサービスのデプロイを行ってもいいのですが 多くのサーバをデプロイする場合や、同様の環境構築を並行に進めたい場合、すべての作業において繰り返しが発生します。 エンドユーザがそこまで多くない場合で、クラウドで使うリソースの規模が小さく、変更が少ない場合においては、良いのですが その逆の場合、従来クラウドの判断にゆだねても問題のないところに関しても、人の手で作業が発生してしまうため、 人の作業工数がかさんでしまうことになるでしょう。

また、ビジネスの流れや投資額に応じて、クラウドのリソースをうまく加減していかないと 不要なリソースを使ってしまったり、それにより無駄に課金されてしまったり、リソースが逼迫しサービスに影響が及ぶなど 企業運営をする上で大変なことになります。

これは、一般的な話で、クラウドリソースをどのようにうまく加減するか、つまり”限られたIT投資額の中でクラウドをうまく活用していくか” について、ITに拘る多くの人の中で日々議論されています。 そのため、Azureでは、優れたアーキテクチャや標準に準拠するような機能拡張やツール群の開発が行われています。

Azureでは、仮想マシンのスケーラビリティを確保するためのオプションとして、スケールアウト・スケールイン・スケールアップ・スケールダウンを 用意していますし、冒頭より説明しております、Azure CLIもしくは、皆様がお使いの開発ツールに合わせたSDKも用意しています。

それらの機能やツールを使い分けることで、運用負荷の軽減や効率的なIT投資/活用を目指すことができます。 今回の記事では、このような背景や課題に対して、Azure CLI2.0がどのような実装をされており、 それをRHEL上でどう組み合わせて活用していくのが最適かということについて説明します。

2. クラウドのリソースの扱い/Azure REST APIとAzure CLIについて

ここ最近(4-5年)のトレンドとして、クラウドやモバイルのソリューションに付随する形で、REST APIと呼ばれる、HTTPベースのAPIを 提供するサービスが増えて来ています。HTTPベースですので、普段お使いのブラウザからもクラウドのリソースを参照することができますし、 ブラウザからも気軽にREST APIを利用する方法もあります。※1

たとえば、ブラウザからこのURL(https://management.azure.com/)にアクセスすると、ブラウザに下記のようなHTTP応答を受け取ることができます。

{
  "error":{
  "code":"MissingApiVersionParameter",
  "message":"The api-version query parameter (?api-version=) is required for all requests."
  }
}

これは、api-versionを指定してくださいという返答なのですが、Azureのリソースを使うためのAPIに対して GETリクエストを投げた返答がJSONで返ってきています。

また、Linuxを使い慣れているかたは、cURLやwgetを使ってインターネット上のファイル・バイナリ等を取得することがあると思います。 そちらでもHTTPの応答を受け取ることが可能になっておりますので必要に応じてご利用ください。※3

実は、今回紹介する、Azure CLI2.0の中身もAzure Resource Manager(ARM)で待機しているREST APIをラップしたもの、 つまり、Azure Python SDKのラッパーとして構成されており、ARMの操作を可能にしています。

さらに、REST APIにHTTPリクエストを直接出す場合には、必要なメソッド、オプション、ユーザに与えられたロールベースの権限(RBAC)から得た、 アクセストークン単位での権限が必要になります。 Azure CLI2.0では、そういった難しさを回避し、ユーザが使いやすいようにトークンの取得から利用までを自動的にハンドリングできるようにしています。

以上がAzureのREST APIとAzure CLIについてです。

一般的に、ラッパーであるAzure CLIなど抽象度が高いユーザインターフェースであればあるほど、実装されるまでに時間がかかります。 そのため、Azure CLIに実装されていない機能は、Azure CLIではなくREST APIもしくは、ARMのWebポータルを使うことになります。

以下、Azure APIを使うためのインターフェースの抽象度が低い順に並べていますので、ご参照ください。

  1. https://management.azure.com/ 経由で、AzureのREST APIを使う
    Azureでは、REST APIのEndpointとしてhttps://management.azure.com/が用意されているのでcURLや
    プログラミング言語のHTTPライブラリ(Pythonでいうところのhttplib/urllibなど)を組み合わせてリソース管理ができます。
  2. Azure SDKを使う
    2017-05-08現在、AzureのSDKとして以下のプログラミング言語およびOS・デバイスに対応しております。
    .NET/Java/Node.js/PHP/Python/Ruby/Mobile/Media/Android/iOS/JavaScript/Swift/Windows
  3. Azure CLI2.0を使う ※2
    セクション3で具体例を紹介します。
  4. Azure Resource Manager(Webポータル)を使う
    本連載の記事にてご紹介しているものです、抽象度が高く、直感的でわかりやすいインターフェースです。

3. Azure CLI2.0の実用例とBashスクリプティング

Unix系およびLinux系のOSを使ってきた方にとっては、シェルスクリプティングは身近な存在ではないでしょうか? RHELを使うということは、標準でついてくるBashを使ってシェルスクリプティングができるということです。 そのため、本セクションでは、Azure CLI2.0とbashスクリプティング(ワンライナースクリプトの繰り返し)を使ったVM起動の例を紹介します。 なおスニペットになっておりますので、そのまま貼り付けてご利用いただけます。 azure cli2.0をRHELにインストールする方法、初期ログインについては、前回の記事をご参照ください。

3.1 使えるRHELのイメージを検索する

すべてのイメージをから利用可能なRHELのイメージを検索する コマンド

$ az vm image list -f RHEL --all

結果

...(前略)...
  {
"offer": "RHEL",
"publisher": "RedHat",
"sku": "7.2",
"urn": "RedHat:RHEL:7.2:7.2.2017042521",
"version": "7.2.2017042521"
  },
...(中略)...
{
"offer": "RHEL",
"publisher": "RedHat",
"sku": "7.3",
"urn": "RedHat:RHEL:7.3:7.3.2017042521",
"version": "7.3.2017042521"
  },
...(後略)...

最新のイメージだけを検索する

$ az vm image list -f Rhel

結果

[
{
"offer": "RHEL",
"publisher": "RedHat",
"sku": "7.3",
"urn": "RedHat:RHEL:7.3:latest",
"urnAlias": "RHEL",
"version": "latest"
  }
]

             3.2 仮想マシンを起動する

仮想マシンを起動する前にリソースグループを作成してください。 (不意に他の環境を消さない意図があります)

リソースグループを作成するために下記のコマンドを実行してください。

$ az group create -l japaneast -n rhel-prod-env

成功すると以下の結果がかえって来ます。

{
  "id": "/subscriptions/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rhel-prod-env",
  "location": "japaneast",
  "managedBy": null,
  "name": "rhel-prod-env",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null
}

次に、仮想マシンを起動させましょう。仮想マシンの作成過程を観察するために--debugオプションをつけています。 --generate-ssh-keysのオプションを使うと、自動的にローカルのUSER/authorized_keysにアップロードされます。

$ az vm create -n rhel0 -g rhel-prod-env --image RHEL --data-disk-sizes-gb 10 20 --size Standard_DS2_v2 --generate-ssh-keys --debug

ずらずらと文字が流れてきます。もし、エラーが出た場合は、赤文字でエラー内容が表示されます。 下記が実行結果です。

{
  "fqdns": "",
  "id": "/subscriptions/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rhel-prod-env/providers/Microsoft.Compute/virtualMachines/rhel0",
  "location": "japaneast",
  "macAddress": "00-0D-3A-AA-AA-AA",
  "powerState": "VM running",
  "privateIpAddress": "10.0.0.4",
  "publicIpAddress": "x.x.x.x",
  "resourceGroup": "rhel-prod-env"
}

3.3 一気に10台の仮想マシンを起動する

次に、仮想マシンを10台上げて見ましょう。基本的には、通常のシェルスクリプティングと変わらず、bashのfor文を使って10台の違った名前の仮想マシンを起動させています。 また、仮想マシンを一台ずつ起動させず、10台並行して起動するために--no-waitオプションをつけました。

$ for i in 1 2 3 4 5 6 7 8 9 10 ; do az vm create -n testserver00$i -g rhel --image RHEL --data-disk-sizes-gb 10 20 --size Standard_DS2_v2 --generate-ssh-keys --no-wait; done

これら仮想マシンの起動状況に関しては、下記のコマンドで確認できます。 作成が終了したら、Stateの項目がすべてSucceededになります。

$ az group deployment list -g rhel-prod-env -o table
Name                                        Timestamp                         State
------------------------------------------  --------------------------------  ---------
vm_deploy_pVh0V26y7mCWui3d8NOOxcdbBjAmydiv  2017-05-09T08:38:56.640915+00:00  Succeeded
vm_deploy_mh21D9uGTNOds8XsB5m2wJOr2tSpwvGO  2017-05-09T08:49:28.437518+00:00  Succeeded
vm_deploy_mKD4kCmhHYW9LOirIsinHGdOoYX3gzBp  2017-05-09T08:49:46.142583+00:00  Succeeded
vm_deploy_q7ikAOg8Teb4ZR2m1G5JcpOCCBmtzpjR  2017-05-09T08:49:50.432461+00:00  Succeeded
vm_deploy_I6guD6fz3Kz1m5CNrzk7steL3IERkE6b  2017-05-09T08:49:55.524580+00:00  Succeeded
vm_deploy_J0rAZrzb14A5yjNYQQL89TsMcTBvkBtF  2017-05-09T08:50:00.572859+00:00  Succeeded
vm_deploy_3GSvsLH5rrz9zvXilw8AOpoUzJEsm47x  2017-05-09T08:50:04.870283+00:00  Succeeded
vm_deploy_zZIcUDnALUyzjS1qnRmHfb8vJCgkNPl8  2017-05-09T08:50:05.252484+00:00  Succeeded
vm_deploy_p2Ci6i8pl7J7yfrqZqcW1G2CUn7zdeza  2017-05-09T08:50:13.868036+00:00  Succeeded
vm_deploy_MgkGapRQg3OiE8kfV4bpenNiBayOA0IQ  2017-05-09T08:50:44.766192+00:00  Succeeded
vm_deploy_hQNqoaAXeyQysd3iOxNR92kbcWohsbQP  2017-05-09T08:51:03.286952+00:00  Succeeded

3.4 不要な仮想マシンを削除する

現在、動いている(配備済み)仮想マシンは以下のコマンドで確認可能です。 通常だとJSONで帰ってくるのですが、今回は視認性向上のための”-o”オプションを使って テーブル形式での表示をしています。

$ az vm list -o table

さて、先ほど作った10台のサーバですが、不要になったので削除しましょう。 下記の2種類の方法で、すべてのサーバもしくは、リソースグループを削除できます。

  1. リソースグループごと消す方法 最初の仮想マシンを起動する前にリソースグループを作成しました。 リソースグループごと削除することで関連するすべてのクラウドリソースの削除を行えます。

    $ az group list -o table Name Location Status ------------- ------------- --------- rhel-prod-env southeastasia Succeeded

  2. 仮想マシン単位で消す方法
    前項で関連するすべてのクラウドリソースを削除できると説明しました。
    もしかすると、ストレージだけは残しておいて、後で他の仮想マシンで使いたいケースが出てくるかもしれません。
    こちらは、その場合に有効な方法です。

$ az vm list -o table | egrep -v "Name|-------" | awk '{print $1}'|xargs -n1 az vm delete --yes --no-wait -g rhel-prod-env -n

最初に仮想マシンの一覧をテーブル表示し、egrepをつかってNameと-(ダッシュ)の部分を取り除いています。更にawkで整形し、xargsで出力を再びazコマンドの引数として利用しています。
こうすることで、仮想マシン一覧から仮想マシンの削除が可能になります。また、必要に応じて、grepを使って仮想マシン名から抽出することもできますし
仮想マシンを作成する際に、仮想マシンにタグをつけることで、その仮想マシンだけを抽出することもできます。

 4. まとめ

今回は、クラウドにおけるリソース管理とAzure CLI2.0を使った例として
RHELの仮想マシンの起動や、複数台の仮想マシンの起動・削除について説明をしました。

実は、Azureに限った話ではないのですが、クラウドAPIだけではできない自動化の仕組みがあります。
例えば、RHELのパッケージのインストール、アンインストール、Pythonなどのソフトウェアライブラリの追加・削除、設定ファイルの変更・管理、サービス(プロセス)の開始・停止・再起動です。※4
このような場合、ChefやAnsible、Puppetなどの構成管理ツールもしくは、Azureカスタムスクリプト拡張機能による補助が必要になります。

そのため次回は、上記を実現するために、拡張機能のインストールから、自動的にパッケージのインストールを構成する方法などを説明しようと思います。
次回もお楽しみに。

補足

※1:ブラウザやVisualStudioなどの開発環境では、REST APIを利用するために、HTTPメソッド(GET,PUT,POSTなど)を呼び出すための拡張機能(RESTクライアント)を用意しています。
※2:今回は、Azure CLIの話ですのでPowerShellに関しては、触れませんでしたが、PowerShellでもAzureのリソースの操作はREST APIを通じて行われています。
※3:下記にcURLの例をあげました。

$ curl https://management.azure.com/ {"error":{"code":"MissingApiVersionParameter","message":"The api-version query parameter (?api-version=) is required for all requests."}}%
```

※4:なお、OSの電源管理に関しては、Azureの仮想マシンモニタからAgentを経由し、プロセスを停止し、OS自体を安全に停止することができます。

免責事項

本サイト(同一サイト中に置かれたドキュメントや、リンクが張られたページを含みます。以下同じ)は、情報提供のみを目的としており、本サイト作成時点での情報を示したものです。状況等の変化により、内容は変更される場合があります。本サイトに表記されている内容(提示されている条件等を含みます)は、貴社との有効な契約を通じて決定されます。それまでは、正式に確定するものではありません。従って、本サイトの記載内容とは異なる場合があります。また、本サイトに記載されている価格はいずれも、別段の表記がない限り、参考価格となります。貴社の最終的な購入価格は、貴社のリセラー様により決定されます。マイクロソフトは、本サイトの情報に対して明示的、黙示的または法的な、いかなる保証も行いません。 © 2017 Microsoft Corporation. All rights reserved.

Red Hat Attribution

Copyright © 2017 Red Hat, Inc. Red Hat, Red Hat Enterprise Linux, the Shadowman logo, and JBoss are trademarks or registered trademarks of Red Hat, Inc. or its subsidiaries in the United States and other countries. Linux® is the registered trademark of Linus Torvalds in the U.S. and other countries. Java is the registered trademark of Oracle America, Inc. in the United States and other countries. All other trademarks are the property of their respective owners.

Skip to main content