2016年8月18日

ブロードバンドタワー緒方です。今回は、Microsoft Azure を API 経由にて操作するための事前準備の方法について紹介させていただきます。

どうして API 経由で操作するの ?

Microsoft Azure 上のリソースを作成したり管理したりするために、下記のような様々なツールが用意されています。

  • Azure ポータル
    • Web ブラウザを利用した GUI ツール
  • Azure CLI
    • コマンドライン シェルを利用
  • Azure PowerShell
    • Windows PowerShell を利用
  • Visual Studio
    • Visual Studio の拡張機能を利用

上記ツール群を利用すれば、インタラクティブ ( 対話型 ) に仮想マシンや Web アプリの作成などが実行できます。

ただ、定期的/自動的に実行される作業などは、インタラクティブ ( 対話型 ) では難しい場合があります。
例えば、5 分毎に自動的に Azure 上のリソースの情報を取得して、監視システム ( Zabbix など ) を利用して監視・運用を実施したい場合などが想定されます。

このようなインタラクティブ ( 対話型 ) では不向きなオペレーションを API 経由にて実行することができます。

API 経由にて操作する流れ

API 経由にて操作を実行するためには、事前に Active Directory アプリケーションを登録しておく必要があります。登録の方法は本ブログにて解説します。

Active Directory アプリケーションの登録ができた段階で、次の流れにて API を呼び出します。

  1. Active Directory 認証を行い、API トークンを取得する
  2. 取得した API トークンをもとに API を呼び出す

Azure CLI インストール

API 経由にて操作を実行できる環境を整えるため、今回は Azure CLI 経由にてセットアップを実行してみます。

本作業を実施した際の私の手元の Mac の環境は下記のようになっています。

$  sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G31

$ azure --version
0.10.2 (node: 4.4.5)

手元の環境に Azure CLI がインストールされていない場合には、下記の Microsoft サイトにありますドキュメントを参考に環境の準備をしてください。

ちなみに、Azure CLI は事前準備の際に利用します。本ブログの最初にあります、監視システム ( Zabbix ) などで API 操作による運用を行う場合、監視システムが動作している OS 環境に Azure CLI をインストールすることは必須ではありません。

API トークンを取得するための必要な項目

Active Directory アプリケーションの登録を実行して、 API トークンを取得するための情報を下記にまとめてみました。

CLIENT_ID

Active Directory アプリケーション作成時に生成される AppId の値

CLIENT_SECRET

任意で作成するパスワード

TENANT_ID

サブスクリプション ID に紐付く ID

SUBSCRIPTION_ID

サブスクリプション ID

Azure API トークンを取得するための事前準備

1. パスワード ( CLIENT_SECRET ) の決定

私の場合なのですが、パスワードは Web 上に公開されているパスワードジェネレータを利用してパスワードを決定しています。

2. Azure CLI でログイン

Azure CLI を利用して Azure にログインします

$ azure login
info:    Executing command login
|info:    To sign in, use a web browser to open the page https://aka.ms/devicelogin. Enter the code <authenticate_code> to authenticate.

azure login コマンド実行後、出力結果にあります https://aka.ms/devicelogin の URL をブラウザにて指定します。

ブラウザ上に表示された デバイスのアプリケーションから受け取ったコードを入力してください の下に、先ほど azure login コマンドを実行した際に表示された code の文字列 を入力し、続行ボタン をクリックします

続行ボタン クリック後は先ほど開いたブラウザは必要ありませんので、閉じていただいて問題ありません。

その後、azure login コマンドを実行した端末にて、下記のような表示がされます。

-info:    Added subscription < サプスクリプション名 >
info:    Setting subscription "< サプスクリプション名 >" as default
+
info:    login command OK

3. モードの切替

Azure Resource Management ( ARM ) モードに切り替えます

$ azure config mode arm
info:    Executing command config mode
info:    New mode is arm
info:    config mode command OK

4. Active Directory アプリケーション作成

Active Directory アプリケーションを作成するために、引数に下記のパラメータを入力する必要があります。

  • name
  • home-page
  • identifier-uris
  • password

※ –password の引数は CLIENT_SECRET となります

$ azure ad app create --name "healthcheck" --home-page "http://healthcheck" --identifier-uris "https://healthcheck" --password < CLIENT_SECRET >
info:    Executing command ad app create
+ Creating application healthcheck                                             
data:    AppId:                   AppId-AppId-AppId-AppId
data:    ObjectId:                ObjectId-ObjectId-ObjectId-ObjectId-ObjectId
data:    DisplayName:             healthcheck
data:    IdentifierUris:          0=https://healthcheck
data:    ReplyUrls:              
data:    AvailableToOtherTenants:  False
info:    ad app create command OK

azure ad app create コマンドが正常に完了すると、結果が出力されます。AppId の項目が CLIENT_ID となりますので、書き留めておきます。

5. Service Principal を作成

上記 4. Active Directory アプリケーション作成 後に出力された AppId ( CLIENT_ID ) を引数に azure ad sp create コマンドを実行

$ azure ad sp create AppId-AppId-AppId-AppId
info:    Executing command ad sp create
+ Creating service principal for application AppId-AppId-AppId-AppId
data:    Object Id:               Object Id-Object Id-Object Id-Object Id-Object Id
data:    Display Name:            healthcheck
data:    Service Principal Names:
data:                             AppId-AppId-AppId-AppId
data:                             https://healthcheck
info:    ad sp create command OK

※ 手順 7.Service Pricipal の権限を付与 で Object Id の値が必要になりますので、書き留めておきます。

6. SUBSCRIPTIONID と TENANTID の値を確認

下記 6.1 および 6.2 を実行して SUBSCRIPTION_IDTENANT_ID の値を確認する

6.1 SUBSCRIPTION_ID の取得

azure account list の出力結果にあります、< サブスクリプション名 > の右にある文字列が SUBSCRIPTION_ID になりますので、書き留めておきます。

$ azure account list
info:    Executing command account list
data:    Name            Id                                    Current  State  
data:    --------------  ------------------------------------  -------  -------
data:    < サブスクリプション名 >    subscription_id-subscription_id-subscription_id-subscription_id-subscription_id  true     Enabled
info:    account list command OK

6.2 TENANT_ID の取得

6.1 SUBSCRIPTION_ID の取得 で得られた、SUBSCRIPTION_ID の値を引数に指定して azure account show コマンドを実行します。

Tenant ID が TENANT_ID に該当しますので、書き留めておきます。

$ azure account show subscription_id-subscription_id-subscription_id-subscription_id-subscription_id
info:    Executing command account show
data:    Name                        : < サブスクリプション名 >
data:    ID                          : subscription_id-subscription_id-subscription_id-subscription_id-subscription_id
data:    State                       : Enabled
data:    Tenant ID                   : tenant_id-tenant_id-tenant_id-tenant_id-tenant_id <-- これが TENANT_ID
data:    Is Default                  : true
data:    Environment                 : AzureCloud
data:    Has Certificate             : No
data:    Has Access Token            : Yes
data:    User name                   : healthcheck@***.onmicrosoft.com
data:    
info:    account show command OK

7. Service Principal の権限を付与

Service Principal の権限を付与するために、引数に下記のパラメータを入力する必要があります。

  • –objectId
    • 5. Service Principal を作成 実行結果の Object Id の値
  • -o
    • ロール
  • -c
    • SUBSCRIPTION_ID の値

今回 -o の引数は Reader 権限を利用していますが、割り当てるロールはセキュリティポリシーに準じて適切なロールを割り当ててください。

$ azure role assignment create --objectId Object Id-Object Id-Object Id-Object Id-Object Id -o Reader -c /subscriptions/<SUBSCRIPTION_ID>/
info:    Executing command role assignment create
+ Finding role with specified name                                             
data:    RoleAssignmentId     : /subscriptions/subscription_id-subscription_id-subscription_id-subscription_id-subscription_id/providers/Microsoft.Authorization/roleAssignments/**********
data:    RoleDefinitionName   : Reader
data:    RoleDefinitionId     : roledefinitionid-roledefinitionid-roledefinitionid-roledefinitionid-roledefinitionid
data:    Scope                : /subscriptions/<SUBSCRIPTION_ID>
data:    Display Name         : healthcheck
data:    SignInName           :
data:    ObjectId             : Object Id-Object Id-Object Id-Object Id-Object Id
data:    ObjectType           : ServicePrincipal
data:    
+
info:    role assignment create command OK

トークンの取得

Azure API トークンを取得するための事前準備が正常に完了できたのかを確認するために、実際にトークンを取得してみましょう。

今回はサンプルで Shell Script を作成してみました。任意の名前で保存し、実行してみてください。

必要な変数の値は、事前準備の際に書き留めておいた下記の値を適宜置き換えてください。

  • CLIENT_ID
  • CLIENT_SECRET
  • TENANT_ID
  • サンプルスクリプト
#!/bin/sh

# ユーザ固有の変数
CLIENT_ID="<CLIENT_ID>"
CLIENT_SECRET="<CLIENT_SECRET>"
TENANT_ID="<TENANT_ID>"

# token の取得
POST="grant_type=client_credentials&client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET&resource=https%3A%2F%2Fmanagement.azure.com%2F"
TOKEN=`echo $POST | curl -s -H "Content-Type: application/x-www-form-urlencoded" -X POST -d @- "https://login.microsoftonline.com/$TENANT_ID/oauth2/token?api-version=1.0"`

echo $TOKEN

サンプルスクリプトを実行し、正常に設定が完了していれば下記のような JSON フォーマットでの応答があります。kye が access_token の value に求めている Azure API トークンが格納されています。

{"token_type":"Bearer","expires_in":"3600","ext_expires_in":"0","expires_on":"1470214107","not_before":"1470210207","resource":"https://management.azure.com/","access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1uQ19WWmNBVGZNNXBPWWlKSE1iYTlnb0VLWSIsImtpZCI6Ik1uQ19WWmNBVGZNNXBPWWlKSE1iYTlnb0VLWSJ9.eyJhdWQiOiJodHRwczovL21hbmFnZW1lbnQuYXp1cmUuY29tLyIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2Y3YjRiNzY3LTk5NzYtNGM1ZS1iYTNlLWY0NWU1Y2EwMTE4NC8iLCJpYXQiOjE0NzAyMTAyMDcsIm5iZiI6MTQ3MDIxMDIwNywiZXhwIjoxNDcwMjE0MTA3LCJhcHBpZCI6IjM5Y2YwZDIwLTQyZWEtNDUyYi1hYjY4LTllNDhkODE5ZDJmNiIsImFwcGlkYWNyIjoiMSIsImlkcCI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2Y3YjRiNzY3LTk5NzYtNGM1ZS1iYTNlLWY0NWU1Y2EwMTE4NC8iLCJvaWQiOiI4N2M2ZTQ3NC1hMGVkLTQzNzUtYTc1ZC00M2Y1NWQ5YjljYTUiLCJzdWIiOiI4N2M2ZTQ3NC1hMGVkLTQzNzUtYTc1ZC00M2Y1NWQ5YjljYTUiLCJ0aWQiOiJmN2I0Yjc2Ny05OTc2LTRjNWUtYmEzZS1mNDVlNWNhMDExODQiLCJ2ZXIiOiIxLjAifQ.kn_C68FLtWiDSMoQ9BFrxEuJDS-kBXIdi8GvtCOT2h3uvMxCnaVoUuuylKGFkvlnjbMbfeszaqivD_0yWyktywmio37hTefjDCBkUXEIwPYsg8RUzvLUTm0bfKOzn7fkuzvsuXlFT83YOywid-7vsB_yR8ul0apPDhOaLx2sQZb4TG-EDKvaoGmQmBPhtDoDhVZfVoQwuWwpvuNbgNF8ucwh5c0OsgbSvD39BhiQfcJhwYnb3yNIiwKaaTG0uu003qfbIUgyr8chIUO5lIRO_HsWILanqz8fLaz_3vuB-2wuRksZwV3pFEKApct00L_JWfhyOAvyq3qq7J8X0y_8uw"}

さいごに

少し長くなってしまいましたが、ここまでが Azure API トークンを取得するための事前準備になります。今後、この API トークンを利用して運用を楽にできるような方法を本ブログにて公開させていただきます。

 

 

本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。

アバター

投稿者: 緒方 亮

主に Azure や AWS などの Public Cloud を担当しています。機械学習/深層学習で R を利用しているため、投稿する記事に R がよく登場します。