LinuxユーザーがイジるはじめてのAzure

LinuxユーザーがAzureを使いこなせるように応援するブログです

ARM template (CentOS with カスタムスクリプト編)

前回に引き続きARM templateを使った自動構築のひな型、といいますか自作版を紹介します。

 

今回紹介するテンプレートはMicrosoft Azure上にCentOSをボタン一発(正確にはssh-keyのコピペがありますが)で作成するというものです。

 

では早速紹介に入ります。JSONの実物は以下です。

 

github.com

 

 

上記のテンプレートを任意なResource Groupにテンプレートデプロイすると以下が作成されます。

仮想マシン: CentOS 7.2が1台

ログインユーザー: azure01

SSHkey形式:RSA形式

パブリックIPアドレス: Static設定で1つ

仮想ネットワーク: 172.10.0.0/16を1つ

サブネット; 172.10.1.0/24を1つ

ストレージアカウント: 1つ

ストレージアカウント冗長方式: Standard_LRS

カスタムスクリプト:任意なshellを指定

 

CentOSを毎回試験用に1台立てるのがめんどい方、CentOSが起動した後に自分で作成したshellスクリプトをOS起動時に埋め込みたい方へのひな型としてご自由にご利用ください。デフォルト設定のままでよければ、RSA形式のssh-keyを張り付けるだけでデプロイできるようにしています。

 

以下JSONファイル内で行っている詳細です。ご参考に。

 ※変更可と選択可があります。

 

〇OS

 CentOS 

 (固定)

〇OSのバージョン

 7.2

  (デフォルト:parametersで選択可)

仮想マシンの名前

 centostest01

 (デフォルト:parametersで変更可)

仮想マシンのログインユーザ

 azure01

 (デフォルト:parametersで変更可)

SSH-key

 ★RSA形式のものをベタっと張り付けてください。

  例:「rsa-ssh AABB!=******XYZ

 (ここは入力必須)※詳細は以下で。

仮想マシンのサイズ

 Standard_A1

 (デフォルト:parametersで選択可)

〇可用性セットの名前

 centostest01-avail

 (デフォルト:parametersで変更可)

〇ストレージアカウントの冗長方式

 Standard_LRS

 (デフォルト:parametersで選択可)

〇ネットワークセキュリティグループの名前

 centostest01-nsg

 (デフォルト:parametersで変更可)

〇仮想ネットワークの名前

 cent-vnet

 (デフォルト:parametersで変更可)

〇仮想ネットワークのアドレス帯

 172.10.0.0/16

 (デフォルト:parametersで変更可)※変更する場合はサブネットも要修正

〇仮想ネットワークのアドレス帯

 172.10.1.0/24

 (デフォルト:parametersで変更可)※変更する場合はvNetのアドレス帯に注意

〇カスタムスクリプトの配置先URL

https://raw.githubusercontent.com/akkoike/ARMtemplate/master/parts/VirtualMachine/script.sh

 (デフォルト:ご自分で用意したスクリプトを指定ください。

  上記のscript.shはTimezoneを日本時間に変更するだけのお試しshellです)

〇カスタムスクリプトスクリプト

 script.sh

 (デフォルト:上記配置先URLで指定したスクリプト名のみを記載ください。

  このファイルはCentOSが立ち上がった後、/var/lib配下に配置されます)

 

その他補足。

・可用性セットでは障害ドメイン、更新ドメインそれぞれデフォルトの3と5を指定しています。

・プライベートアドレス(NiC)は自動取得(Dynamic)の設定にしています。

NSGのinbound許可ポートは22port(SSH)のみにしています。outboundは無し。

・パブリックIPアドレスは静的(Static)にしています。

・shellスクリプトはインターネットアクセスできる場所に配置されていることが前提

 ※カスタムスクリプトが実行されるタイミングはOSが起動した後になるため、

  先にOSへログインするとTimeZoneの変更がまだされていない状態になっています。ご注意を。

CentOS内でカスタムスクリプトの実行状況を確認するログファイルは以下です。

 /var/log/azure/Microsoft.OSTCExtensions.CustomScriptForLinux/1.5.2.1/extension.log

 中身を見るとわかりますが、上記GitHubのURLから持ってきたスクリプトは以下に

 格納されていることがわかります。

 /var/lib/waagent/Microsoft.OSTCExtensions.CustomScriptForLinux-1.5.2.1/download/0/script.sh

 

以上となりますが、これをひな型にscript.shの内容を変更することでInfrastructure as CodeとConfiguration as Codeを一括で体験することができます。

 

是非お試しください。

 

 

はじめてのARM template(storageaccount編)

多忙にかまかけて更新が途切れておりました。。。反省。

 

今回はAzure Resource Manager template(略してARMテンプレート)と呼ばれるものを紹介したいと思います。

 

ちなみにTechSummit 2016で発表した資料は以下になります。

なにそれ?なにができるの?という基本的な部分は下記を参考にしてください。

 

https://docs.com/mstechsummit16/fe2736ac-b53b-47f4-a4cd-f57096aad25a/dep001-infrastructure-as-code-linux-azure

 

ここでは実践的な利用説明をしていきます。

まず以下のGithubをご覧ください。

 

 

 

今後deploy確認が取れたものを順次上げていく&ここで日本語の説明をしていくつもりです。commitは随時やってるのでupdate日時を参考に適当にご利用ください。

 

README.txtにも記載していますが、ディレクトリ構成は以下としています。

 

- HowToUseOnCentOS

  CentOS7.2にAzure-CLiをインストールしてTemplateデプロイやエクスポートなど

 操作する際のあんちょこメモを記載しています。

 Azure Portalからの操作に不慣れな方やVisual Studio Codeよりvimだよね、という

 方はこちらをご参考に。

 

- README.txt

 このGithubディレクトリ構成を記載しています。

 肝心の部分だけを言うとparts配下がAzureサービス単体でデプロイするひな型を

 用意しています。customize配下がAzureサービスを複合的に利用してデプロイ

 するものを用意します。

 

では実践編にうつります。

 

■storageaccount.json

 〇場所:

  parts/storageaccount.json

 〇概要:

  単一storageaccountを1つ作成するテンプレートです。

 〇parameters(変更可能個所):

  ストレージアカウントの名前、冗長方式の選択。

 〇注意点:

  ストレージアカウントの名前は「storaccount01」をデフォルトにしています。

  冗長方式のデフォルトはLRSにしています。

  API-Versionは「2015-06-15」を利用しています。

 

■loop-create-storageaccount.json

  〇場所

  parts/loop-create-storageaccount.json

 〇概要:

  任意の数だけstorageaccountを作成するテンプレートです。

 〇parameters(変更可能個所):

  ストレージアカウントの名前、冗長方式の選択、作成する個数。

 〇注意点:

  ストレージアカウントの名前は「strloop0」をデフォルトにしており、この後

  ろに指定した個数の数値(int)を繋げています。

  例)個数を10とした場合、strloop01~strloop010まで作成されます。

  冗長方式で選択したものは作成されるストレージアカウント全てに同一の冗長

  方式がセットされます。1個はLRSで2個目はGRSで3個目以降はRA-GRSで、

  といった利用はできません。希望があれば作りますが。

 

今回紹介するテンプレートは上記2つだけですが、記載時・修正時にハマること

を避けるため、2つほどポイントを記載します。

 

1:api versionと利用できるtype。

  あれ?記事に記載されているものをコピペしたけどデプロイできない、とか

  ハマるケースが多いです。それもそのはずで、account typeなどは指定できる

  値がapi versionによって動作しないものもあるからです。

  簡単に言えば利用するバージョンのAPIで対応されていない指定方法はエラー

  になる、です。なので以下のAPIバージョンと記載方法のひな型を参考に組み

  立てましょう。

 

2、関数について。

JSONファイルの容量制限は1MB以内とあります。

※.parametersファイルは64KB以内。

 

全てべた書きで記載するのもありですが、効率よく記載することで容量の壁に

当たらない&修正範囲を少なくするといった「かしこい」書き方は少しずつ覚えて

いきましょう。参考とするサイトは以下です。

 

 

はい、すみません、英語なのと全て覚えるのかおい!という状況になってしまう

ので、その中でもよく利用される関数について以下補足します。

 

  concat

  ⇒ 文字列を連結します。()内にある「,」カンマ区切りのものを

    連結させます。

    例:concat("テンプレート","は","便利ですね") みたいな感じで

      つかります。

  parameters('')

  ⇒ parameters('変数名') として、指定された値を呼び出してます。

    上のconcatと繋げてconcat(parameters('変数名'),"便利ですね")みたいに

    毎回固定の文字列を記載せずに記載するやり方が一般的、というか

    コードを修正する際に修正範囲を少なくするやり方です。

    同じようにvaliables('変数名')といった利用もできます。

  resourceGroup().ほげほげ

  ⇒ ここではresourceGroup().locationを使っています。

    resourceGroupの関数を呼び出して、locationの値を取ってきています。

    東日本リージョンの場合はjapaneastという文字列と同義です。

  copyindexとcopy

  ⇒ この2つはセットで覚えます。よく使う記載パターンはresourcesの中で

    nameの中にcopyindex()をconcatで文字列連結させ、copy関数の中で

    countの数を指定し、作成する個数を指定するやり方です。

    for文のように{}内で記載した部分だけをループさせる、といった記載

    方法ではないため、とっつきづらいですが、1つのパターンを覚えて

    あとは流用・展開すれば勝手はわかると思います。

 

長くなったので、storageaccountのテンプレート作成はこの辺で終わります。

次回はまた別のAzureサービスをtemplateでどう記載するか、といった点

でいくつか紹介します。

Azure Media Serviceでライブストリーミングしてみる

これまでLinuxユーザーの観点でMicrosoft AzureのIaaS側を主に見てきましたが

少しブレイクしてMicrosoftのPaaSサービスについて少し見てみようかと思います。

 

この記事をご覧になられている方々はLinuxユーザーが多いと思いますが、「MicrosoftのPaaSサービス」と聞いてどのようなイメージを持っているでしょうか?

 

Platform as a Servicesなので、プラットフォームなんだよね、認証基盤?解析基盤?それともOSS的な何か?っとおぼろげなイメージを持たれている方々も少なくないと思いますし、昔からMicrosoft Azure(昔はWindows Azure)を見てきた方々は最新の動向もキャッチアップされていると思うので、cognitive servicesとかapplication Insights、webjobs、batchなど、いろいろあるけど、、という答えを持っていると思います。

 

今回はあえて、Linuxユーザーが、あまり知らない or あえて手を出さないであろう領域について例をあげて紹介をします。RHELCentOSJava/php/pythonなどのLinuxな方々に精通したキーワードはほとんど登場しませんが、知っておくことで今まで手を付けなかった技術の幅が広がるため、知って損はないと思います。

 

今回紹介するのはAzure Media Service、略してAMSと呼ばれるPaaSサービスです。

サービスの概要は一言で言うと、動画が再生/提供できるPaaSサービスです。

 

概要レベルの説明はオフィシャルサイトにも他の記事でも多くのってますので、他の記事を読みあさってもよいですが、Dynamic PackagingやIngest、DRM、Smooth Streamingなどなど、この世界の専門用語を知らないとさっぱりイメージできないものも多いので、まずは触ってできることからイメージするとよいかもしれません。

 

では早速触ります。

全体の流れは以下の流れです。

 

・Azure ポータルにログインしてAMSアカウントとchannelを作る。

・Wirecastをインストール

・channelを起動してパソコンに搭載されているカメラ動画をWirecastからストリーミングする

・Azure Media Playerからストリーミング動画を閲覧する

 

上記をやります。個々で細かい説明と補足を入れます。

 

ではまずAzureポータルからAzure Media Serviceアカウントを作り、channelと

呼ばれるものを作成しましょう。

 

f:id:akazure:20160816150135j:plain

 

 

ストレージアカウントが必要になりますが、ストリーミングのデータは複数個用意されますので、ここでは新規にストレージアカウントを作成して分けて管理します。冗長はLRSで用意しました。

 

メディアサービスアカウントとストレージアカウントの準備ができれば、リソースグループから今回用意したmediatest-rgをクリックします。右にメニュが流れきますが「ライブストリーミング」と記載されている項目をクリックし、新規でチャネルを作成します。

f:id:akazure:20160816151103j:plain

 

ライブストリーミングやチャネルという言葉が出てきたので補足します。

AMSは2つの利用形態があり、ライブストリーミングとVideo on Demand(VoD)があります。ライブストリーミングはその名の通り映像を取ると共にそのままストリームで動画を公開する時に使います。VoDはmpeg4やwmvなどの動画ファイルが事前に用意し、動画ファイルをAMSにアップロードして動画を公開する用途で利用します。次にチャネル(channel)ですが、今回試すライブストリーミングでは必要なものになります。チャネルはテレビでいうチャンネルに該当します。4チャンネルや8チャンネルなど、チャネルを用意することで1つのチャンネルができる、と考えるとしっくりします。(今回触れませんが、チャネルの中でprogramという名前の機能を用意する場合があります。programは番組表です。テレビでいう4チャンネルには朝09:00-10:00まで○○な番組を流す、という概念がありますが、ここでも同じです。チャネル内にprogramを用意することで、チャンネルと番組表を管理する、っと覚えるとよいでしょう)

 

上の画像ではチャネルが既に「実行中」になっています。チャネルは割り当て解除の停止になっていないと常に課金され続けますので注意が必要です。また、「取り込みURL」と記載されている個所に今回用意したチャネルの取り込みURLが新規で払い出されています。

 

rtmp://aklivechannel001-akmediatest001.channel.mediaservices.windows.net:1935/live/1d4371b723914732824eaaabebeead58

 

このURLが、AMS側で今回用意したチャネルの「ストリーミングを取り込むURL」になります。このURLへクライアントからRTMP通信して動画を流すことで、用意したチャネルへ動画が入っていきます。

チャネル名の行をクリックすると、より詳細な設定情報が見れますが、取り込みURLにはプライマリとセカンダリの2つのURLが払い出されます。これは大型のビデオカメラを想像してほしいのですが、1台のハードウェアが故障しても2台目のハードウェアで冗長する必要も出てくるためプライマリとセカンダリと別れています。今回のお試しライブでは特に気にする必要はありません。

 

次にストリーミングユニットの設定をしておきます。

 

f:id:akazure:20160817104316j:plain

上記画像の下にあるバーがデフォルトでは0になっていますので、1に設定します。

ストリーミングユニットとは、専用の送信容量を 200 Mbps 単位で購入できるほか、ダイナミックパッケージングと呼ばれる追加機能が利用できるようになります。ダイナミックパッケージングは、ライブで流している動画を設定した時間分VoDとして自動的にAMS側に動画コンテンツとして保管してくれ、様々なエンコード方式でマルチデバイスで再生できる状態にしてくれる、というとてもうれしい機能です。

 

Azureポータルでは最後にライブイベントの作成を行います。

f:id:akazure:20160817110434j:plain

チャネル名が表示されている行をクリックし、「ライブイベント」をクリックします。名前は適当につけてあげてください。

アーカイブウィンドウの個所はデフォルト8時間となっていますが、今回のお試しでは5分と設定しました。つまりライブで流している動画を5分間だけVoDとしてアーカイブしておく、という意味になります。このVoDファイルの暗号化はDRMにしてみましょう。Microsoftが提供する暗号化技術ですね。最後にOKボタンを押してライブイベントの作成が始まります。

 

 では次にクライアントの準備に入ります。今回利用するクライアントはTelestream社が提供するwirecastです。

 

http://www.telestream.net/wirecast/overview.htm

 

上記サイトにあるDownload Free Trialから無料版をダウンロードしてインストールします。(Windows OSへインストールします)

 

Wirecastを起動し、クライアント側の設定をします。

f:id:akazure:20160816163514j:plain

 

左下に小さな窓が縦にいくつかありますが、左下の1番上のモニターの右にある「+」をクリックし、ビデオカメラっぽいアイコンから「integrated camera ショットの追加」をします。そうするとモニターの右側にPCの小型カメラから映っている映像が出てきますのでその画面をクリックし、真ん中にある大きなモニターの左側に表示させます。表示されたら2画面ある大型モニターの真下にある「→」ボタンをクリックし、右側のモニターに左側と同じ映像を表示させます。

 

f:id:akazure:20160817094005j:plain

 

上記のような状態になっていればOKです。

上記画面の左上に「ストリーム」というボタンを押します。出力先をプルダウンで指定するポップアップが出てきますので、プルダウンメニューから「Azure Media Service」を選択します。

 

f:id:akazure:20160817100213j:plain

 

上記画面では「アドレス」の個所に適当なURLが入っていますが、こちらを先ほど取得した「取り込みURL」に上書きしてOKボタンを押します。つまりWireCastで撮影した動画はAzure Media Serviceの取り込みURLへ送る、という設定です。エンコードの個所は任意で変更できます。希望ビットレートを設定したりエンコード方式や解像度を変更することもできるようです。今回はデフォルトのH.264 720p(プログレッシブ)で送信します。

 

OKボタンを押すとモニター画面に戻りますが、上記は設定完了のOKですので、もう一度左上にある「ストリーム」ボタンを押します。ストリームボタンのボタン枠が赤くなっていれば動画をAMSへストリーム配信している、という状態を表します。

 

ではAzure ポータルに戻ります。プレビューで映像が流れてきているかを確認しましょう。

f:id:akazure:20160817101153j:plain

ちゃんと流れてきていますね。1点注意ですが、プレビューはあくまでも映像が流れてきているかどうかを確認するだけにすぎません。映像がスムーズに流れているかどうかはプレビューではなく、上記画面の「再生URL」を閲覧して確認します。

※メディアの世界ではビットレートやフレームレートと呼ばれる画像をどの単位/粒度で細切れに送信するか、つまり映像がストレスなくスムーズに流れるかにこだわる領域があります。映像はつまるところ画像を順番に流し続けることで動く映像として見せているため、このビットレートやフレームレートを調整することで映像をストレスなく見せることができます。

 

では最後に上記画面の「再生URL」をコピーし、Azure Media Playerで確認してみましょう。

 

http://ampdemo.azureedge.net/azuremediaplayer.html

上記URLを開きます。

 

f:id:akazure:20160817102544j:plain

 

上記のような画面が表示されたら、右下にあるURLの個所を先ほどコピーした再生URLに上書きし、下段にある「Update Player」ボタンを押します。いかがでしょうか、ちゃんとPCカメラで撮っている映像が流れてきているでしょうか。

f:id:akazure:20160817112702j:plain

 

実際に撮影している映像とAzure Media Playerで流れて来る動画にはタイムラグがあります。(視聴者にはわかりませんが)

また、HTML5ですが、Codeのタグをクリックすることで自分の任意なサイトへHTML5の記載で張り付けることもできそうです。

 

せっかくなのでWireCastのストリームボタンを押してストリーミングを止めてみましょう。

f:id:akazure:20160817113145j:plain

 

先ほど5分で設定したライブイベントの行をクリックし、ストリーミング中と書かれたURLをコピーします。先ほど見たAzure Media PlayerのURLにコピーしたURLを張り付けてupdateしてみましょう。5分間だけですが、ライブでとった映像がちゃんとVoDとして再生されることが確認できます。

 

以上でAMSを使ったライブストリーミングの操作は終わりますが、VoDの流れも基本的にIngest部分(最初に映像を取り込んで送る)が異なるだけで取り込んだ後は同じです。ブラウザからは200MBを上限とした動画サイズしかアップロードできませんが、最大200GBまでの動画をAPIやAzure Media Service Explorerからアップロードすることができます。また、CDN(Akamai/EdgeCast)と連携して動画コンテンツをマルチリージョンでストレスなく流す、といったこともできます。

 

Azure Media Servies Expolorer

https://github.com/Azure/Azure-Media-Services-Explorer

 

※AMSが提供するAPIのほぼすべてが上記ツールから利用できます。

 (このツールはMS純正製品ではないのでサポート対象外)

 

LinuxサーバーでRTMPサーバーを構築して、、CDNのエッジサーバーへpurgeするコマンド作って、、とかめんどくさいことをしなくとも、Microsoft Azureが提供するPaaSを上記のように利用するだけで、簡単に今まで避けてきた・できなかった・時間がかかったことができるようになります。便利ですので、是非お試しください。

Microsoft Azure CentOS7.2の実態

これまでMicrosoft Azureの利用方法や仮想マシンの作成、ディスク増設、ロードバランサの作成などを中心に記事化してきました。

 

本記事ではもう少しOSの中身に触れていこうと思います。

 

Microsoft Azureが提供するCentOSにはどういったバージョンが用意されており、中身がどうなっているかの実態についてメスを入れたいと思います。作成してログインして初めて知った、というクラウドサービスも多いと思いますので、利用する前に少しでも参考になればと思います。

 

では最初にMicrosoft Azureが提供しているCentOSについて。

 

f:id:akazure:20160620145909j:plain

 

CentOSだけで見てもラインナップが多いな、という感触ですが、いわゆる仮想アプライアンスっぽいものを除くとCentOS-based *.*なるものが一般標準的なCentOSに見えます。CentOSRHELディストリビューション互換のOSですので、RHELをご利用されているLinuxユーザーであれば親しみやすいバージョン表記と言えます。

Linuxユーザーが利用しているCentOSの多くは、centos.orgにあるISOイメージから展開したものだと思いますので、それに適合するものを選択しましょう。

 

CentOS-based 6.5

CentOS-based 6.6

CentOS-based 6.7

CentOS-based 7.0

CentOS-based 7.1

CentOS-based 7.2

 

CentOS5.xはないですが、6.xから最新の7.2までカバーされていることがわかります。

実はもう1つ気になる要素があります。公開元がOpenLogicとなっています。centos.orgではない点が長く利用されている人から見ると気持ち悪く見えるかもしれません。

 

OpenLogic(米)は各種オープンソース技術の商用サービスを提供しています。centos.orgのISOとの違いは中身を見るとわかりますが、waagentと呼ばれる Azureが管理するために必要なエージェントとwaagentがリポジトリに登録されている点だけですので、今まで慣れ親しんだCentOSと基本的なディストリビューションに変わりはありません。

 

では、早速最新版であるCentOS7.2の中身を覗いてみましょう。

今回作成したのはA2サイズのCentOS7.2です。

 

まずはCPUから。

 

 [root@startuptest ~]# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 63
model name      : Intel(R) Xeon(R) CPU E5-2673 v3 @ 2.40GHz
stepping        : 2
microcode       : 0xffffffff
cpu MHz         : 2397.183
cache size      : 30720 KB

・以下省略

 

 

XeonのE5-2673 v3 2.4GHzが使われているようですね。いいの使ってますね。

 

次にメモリ。

 

[root@startuptest ~]# cat /proc/meminfo
MemTotal:        3523796 kB
MemFree:         2916784 kB
MemAvailable:    3102256 kB

・以下省略

 

 

3.36GBほど搭載されています。

 

次はディスク。

 

[root@startuptest ~]# df -k
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1       31440900 1327716  30113184   5% /
devtmpfs         1751956       0   1751956   0% /dev
tmpfs            1761896       0   1761896   0% /dev/shm
tmpfs            1761896    8480   1753416   1% /run
tmpfs            1761896       0   1761896   0% /sys/fs/cgroup
/dev/sdb1      139203080   61468 132047444   1% /mnt/resource
tmpfs             352380       0    352380   0% /run/user/1000
tmpfs             352380       0    352380   0% /run/user/0
[root@startuptest ~]#

 

 

これは以前の記事でも触れましたね。ローカルディスクとして利用できる容量は約30GBほどです。/mnt/resourceはテンポラリ用途で使う、でしたね。

 

もっといろいろ見ていきましょう。

 

hostsの初期設定。

[root@startuptest ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@startuptest ~]#

 

localhost localhost.localdomainはループバックアドレスに対するお約束です。

localhost4、localhost6、これはIPv6IPv4が混在する環境で明示的にIPv4ループバックアドレスを指し示さなければならない場合にreservedされているホスト名ですね。

まぁ、特に意識する必要はなくIPaddress hostnameと今後追記していけばよさそうです。

 

次はネットワーク設定

 

 

[root@startuptest ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.4  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::20d:3aff:fe50:65cc  prefixlen 64  scopeid 0x20<link>
        ether 00:0d:3a:50:65:cc  txqueuelen 1000  (Ethernet)
        RX packets 41562  bytes 57325350 (54.6 MiB)
        RX errors 0  dropped 51  overruns 0  frame 0
        TX packets 8697  bytes 2911582 (2.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 193  bytes 33850 (33.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 193  bytes 33850 (33.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

 ここで???っと思われた方もいると思います。eth0のNICに割り振られているアドレスは192.18.0.0/24で切ったsubnet内のアドレス(192.168.0.4)です。イメージしていたのはeth0がAzureポータルで設定した静的なグローバルアドレス、eth1が192.168.0.4かと思わたのではないでしょうか。そうなんです、Azureではグローバルアドレスは別に管理されている、ということがわかります。これ結構、しっかりしているなぁと思う個所で、OSのネットワーク操作に慣れている方だと簡単にOS内でIPaddressを変更することだってできてしまいます。

パブリッククラウドで管理されているアドレスの多くはDHCPサーバーから取得する方式(Azureもそう)をとるため、既に誰かに払い出されているグローバルアドレスを任意にOS側で書き換える行為ができないように設計されている、ということがわかります。

 

次はeth0の設定をもう少し。

[root@startuptest network-scripts]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DHCP_HOSTNAME=startuptest
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
TYPE=Ethernet
USERCTL=no
PEERDNS=yes
IPV6INIT=no
NM_CONTROLLED=no
[root@startuptest network-scripts]# 

 

BOOTPROTOにdhcpとありますね。ps -efで見ると/sbin/dhclientのプロセスが起動していることもわかります。

 

DNS

[root@startuptest etc]# cat resolv.conf
; generated by /usr/sbin/dhclient-script
search dkmaz4wqi3oebdscr1r11xwogc.lx.internal.cloudapp.net
nameserver 168.63.129.16
[root@startuptest etc]# 

 

どこだこれ、というnameserverが記載されていますが、whois情報で調べるとMicrosoft Corpと出ますので、マイクロソフトが管理しているネームサーバーが初期設定で登録されていることがわかります。nslookupで外部ドメインを検索するとIPアドレスが表示され正しく正引きできていることがわかります。

 

念のためnsswitch.confも。

[root@startuptest etc]# grep "^hosts" /etc/nsswitch.conf
hosts:      files dns
[root@startuptest etc]#

filesの次にdnsとなってますね。ですので/etc/hostsを最初に名前解決として探しにいき、なければ/etc/resolv.confに記載したネームサーバーを上から順に聞きに行く、という経路になってます。

 

次は時刻。

[root@startuptest etc]# date
Thu Jun 23 06:57:16 UTC 2016
[root@startuptest etc]# 

 

ただいま6月23日15:57 JST。。。。泣きそうです。

東日本リージョンで作成したのにー、とか野暮なことは言わず、サクッと以下のコマンドでタイムゾーンを変更して現在時刻にしましょう。

timedatectl set-timezone Asia/Tokyo

 

次はuptimeとsar。

 

[root@startuptest etc]# uptime
 16:01:37 up  1:14,  1 user,  load average: 0.02, 0.02, 0.05
[root@startuptest etc]#
[root@startuptest etc]# sar
Linux 3.10.0-327.18.2.el7.x86_64 (localhost.localdomain)        06/23/2016      _x86_64_        (2 CPU)

02:48:04 PM       LINUX RESTART

02:50:01 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
03:00:01 PM     all      2.58      0.00      0.40      2.64      0.00     94.37
03:10:01 PM     all      0.34      0.00      0.08      1.54      0.00     98.04
03:20:01 PM     all      0.31      0.00      0.06      1.59      0.00     98.04
03:30:01 PM     all      0.31      0.40      1.12      3.34      0.00     94.83
03:40:01 PM     all      0.32      0.00      0.07      1.02      0.00     98.59
03:50:01 PM     all      0.35      0.00      0.10      0.03      0.00     99.52
04:00:01 PM     all      0.31      0.00      0.08      0.03      0.00     99.58
Average:        all      0.64      0.06      0.27      1.45      0.00     97.58
[root@startuptest etc]#

 

uptimeはともかくsarが標準で効く(sysstatが入っている)のは少し驚きです。

ちなみにtopコマンドも利用できますね。

top - 16:04:35 up  1:17,  1 user,  load average: 0.12, 0.04, 0.05
Tasks: 235 total,   2 running, 233 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.6 sy,  0.0 ni, 99.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3523796 total,  2806272 free,   214012 used,   503512 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  3057176 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
29421 root      20   0  157804   2316   1536 R   1.3  0.1   0:00.06 top
    1 root      20   0  126472   7284   2632 S   0.0  0.2   0:05.09 systemd
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd
    3 root      20   0       0      0      0 S   0.0  0.0   0:00.13 ksoftirqd/0
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
    7 root      rt   0       0      0      0 S   0.0  0.0   0:00.10 migration/0
    8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh

 

次はiptables

[root@startuptest ~]# systemctl status iptables
iptables.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)
[root@startuptest ~]#

 

はう!っと雄たけびを上げそうになりましたが、CentOS7からiptablesではなくfirewalldを使うようになります。といってもfirewalldはiptablesをラップしたもののようですので、実態はiptablesですが、今ままで慣れ親しんだ小難しいルール設定をぶち込むことができなくなります。iptablesとfirewalldは併用できないので、どうしてもiptablesを使いたい場合はyum install iptables.serviceから個別でインストールし、firewalldをsystemctlでdisableする必要がありそうです。

 

さて、だいぶ記事が長くなってきたので本記事はこの辺で一旦終わり、続きは次の記事でアプリケーションよりの情報を見てみましょう。

はじめてのMicrosoft Azure(ロードバランサ#3)

 

前回までの記事はこちら

はじめてのMicrosoft Azure(ロードバランサ#2) - LinuxユーザーがイジるはじめてのAzure

 

それでは前回からの続きです。

既にCentOS7.2の仮想マシンが2台、publicip、vNET、subnet、NSGなどがTemplate Deployから作成済だと思います。

まずは2台の仮想マシンsshログインしHTTPポートを受け付ける設定を入れましょう。

 

ログインしたらsudo su - でルートアカウントになります。

 

[root@templatecent2 ~]# yum list httpd
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Available Packages
httpd.x86_64                    2.4.6-40.el7.centos.1                    updates
[root@templatecent2 ~]#

 

 

httpdは既にリポジトリに入っているようですので、こちらを利用してみましょう。

apacheの最新verがいいんだ!という方はwgetでもってきてrpmインストールしましょう。wgetはインストールする必要はありません。

 

 

[root@templatecent2 ~]# yum install httpd.x86_64
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-40.el7.centos.1 will be installed
--> Processing Dependency: httpd-tools = 2.4.6-40.el7.centos.1 for package: httpd-2.4.6-40.el7.centos.1.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-40.el7.centos.1.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-40.el7.centos.1.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-40.el7.centos.1.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.4.8-3.el7 will be installed
---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed
---> Package httpd-tools.x86_64 0:2.4.6-40.el7.centos.1 will be installed
---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package           Arch         Version                     Repository     Size
================================================================================
Installing:
 httpd             x86_64       2.4.6-40.el7.centos.1       updates       2.7 M
Installing for dependencies:
 apr               x86_64       1.4.8-3.el7                 base          103 k
 apr-util          x86_64       1.5.2-6.el7                 base           92 k
 httpd-tools       x86_64       2.4.6-40.el7.centos.1       updates        82 k
 mailcap           noarch       2.1.41-2.el7                base           31 k

Transaction Summary
================================================================================
Install  1 Package (+4 Dependent packages)

Total download size: 3.0 M
Installed size: 10 M
Is this ok [y/d/N]: y
Downloading packages:
(1/5): apr-util-1.5.2-6.el7.x86_64.rpm                     |  92 kB   00:00
(2/5): mailcap-2.1.41-2.el7.noarch.rpm                     |  31 kB   00:00
(3/5): httpd-2.4.6-40.el7.centos.1.x86_64.rpm              | 2.7 MB   00:00
(4/5): httpd-tools-2.4.6-40.el7.centos.1.x86_64.rpm        |  82 kB   00:00
(5/5): apr-1.4.8-3.el7.x86_64.rpm                          | 103 kB   00:00
--------------------------------------------------------------------------------
Total                                              5.1 MB/s | 3.0 MB  00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : apr-1.4.8-3.el7.x86_64                                       1/5
  Installing : apr-util-1.5.2-6.el7.x86_64                                  2/5
  Installing : httpd-tools-2.4.6-40.el7.centos.1.x86_64                     3/5
  Installing : mailcap-2.1.41-2.el7.noarch                                  4/5
  Installing : httpd-2.4.6-40.el7.centos.1.x86_64                           5/5
  Verifying  : mailcap-2.1.41-2.el7.noarch                                  1/5
  Verifying  : httpd-2.4.6-40.el7.centos.1.x86_64                           2/5
  Verifying  : apr-util-1.5.2-6.el7.x86_64                                  3/5
  Verifying  : apr-1.4.8-3.el7.x86_64                                       4/5
  Verifying  : httpd-tools-2.4.6-40.el7.centos.1.x86_64                     5/5

Installed:
  httpd.x86_64 0:2.4.6-40.el7.centos.1

Dependency Installed:
  apr.x86_64 0:1.4.8-3.el7                      apr-util.x86_64 0:1.5.2-6.el7
  httpd-tools.x86_64 0:2.4.6-40.el7.centos.1    mailcap.noarch 0:2.1.41-2.el7

Complete!
[root@templatecent2 ~]#

 

 

インストールはうまくできましたので、起動させましょう。

 

 

[root@templatecent2 ~]# service httpd start
Redirecting to /bin/systemctl start  httpd.service
[root@templatecent2 ~]# ps -ef | grep http
root      1331     1  6 03:17 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    1332  1331  0 03:17 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    1333  1331  0 03:17 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    1334  1331  0 03:17 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    1335  1331  0 03:17 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    1336  1331  0 03:17 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
root      1338  1238  0 03:17 pts/0    00:00:00 grep --color=auto http
[root@templatecent2 ~]#

 

 

うまく起動できました。確認は「service httpd status」や「netstat -an | grep ":80"」などで確認できます。

このままではデフォルトページが表示されるだけです。この後のLBのアクセスが分散されているか確認しづらいため、「/var/www/html」配下にindex.htmlを配置しておきましょう。

 

[root@templatecent html]# cd /var/www/html
[root@templatecent html]# ls -l
total 4
-rwxr-xr-x. 1 root root 80 May 31 03:15 index.html
[root@templatecent html]# cat index.html
<html>
<head></head>
<body>
<font size=20>Hello Azure !!</font>
</body>
</html>
[root@templatecent html]#

 

これで1台目の設定は終了です。

2台目の設定も同じでやっておきましょう。2台目はindex.htmlの中身の文字列をHello AzureではなくHello Azure 2 とか、違いがわかるようにしておくとよいです。

 

さて、お膳立ては整いましたので、ロードバランサーを作成します。

Azureポータルへログインします。

 

 

f:id:akazure:20160601111850j:plain

 

左ペインのメニュー「参照>」から「ロード バランサー」を選択します。

「追加」から、以下の設定を入れて作成ボタンを押します。

f:id:akazure:20160601112216j:plain

 

「名前」は適当にわかりやすい名前をいれましょう。

「スキーム」の個所はExternalかInternalかの選択です。今回はインターネットから80portでアクセスを受け付け、配下に振り分けた2台の仮想マシンへ分散するためExternal LoadBalancerとして使います。パブリックを選択しましょう。

「パブリックIPアドレス」の部分は今作成しようとしているLBのVIPになります。新規に静的アドレスとして1つ用意しましょう。

リソースグループは2台の仮想マシンがいるリソースグループを選択します。一通り設定が終われば作成ボタンを押して待ちます。

 

作成されたら左ペインのリソースグループからtemplatetest-rgを覗いてみましょう。

先ほど作成したロードバランサーが新たに加わっていることがわかります。

クリックして設定を入れていきます。

f:id:akazure:20160601113342j:plain

 

作成時に新規で用意したVIPがちゃんとついていますね。

では「設定」ボタンから右側に表示されている以下の設定を入れていきます。

 

1、プローブ

 名前が???だと思いますが、ここでは「どのプロトコルとポートに対して」「何秒間アクセスできなければ異常とし」「何回リトライ回数とするか」の設定を入れます。

平たく言えば「分散対象に対して異常判定する閾値を設定する」です。

今回はHTTPですので、80と設定し、閾値はデフォルトのままでいきます。

 

2、バックエンドプール

 これまた何のこと?という名前ですが、分散対象の仮想マシンを選ぶ設定です。

 2台用意した仮想マシン(templatecent、templatecent2)を選択し分散対象としま

 しょう。

3、負荷分散規則

 LBが受け付けるポート(80)と分散対象の仮想マシンへ通信するポート(80)を

 入れます。また、先ほど設定準備したプローブの設定名とバックエンドプールの

 設定名を入れます。セッション永続化やアイドルタイムアウトはお好みで設定し

 ましょう。

 

ここまで準備できれば完了です。

LBのVIPに対してブラウザか表示させてみましょう。何度かブラウザの更新をするとhello azureとhello azure2が表示されると思います。うまく分散されている証拠です。

 

試しに仮想マシン1台のhttpdを落としてみてください。

service httpd stop で落ちます。

同じようにLBのVIPをブラウザから何度か更新すると、片方のhello azure 2しか表示されなくなります。うまく切り離されていることがわかります。

 

以上でロードバランサーの記事は終わりとします。

 

以下参考ですが、今回用意したVIPDNS名に対してHTTPのサービス監視を入れることもできます。現在はまだプレビュー版となっていますが、「参照>」からapplication Insightsというものがあります。

WEBサイトの解析等が細かく設定できるものですが、以下のようにURLに対して監視設定を入れ、エラーとなったら任意のメールアドレスへメール送信する、といったこともできます。興味がある方は是非やってみてください。

f:id:akazure:20160601115555j:plain

 

ご参考まで。

はじめてのMicrosoft Azure(ロードバランサ#2)

前回までの記事は以下です。

 

はじめてのMicrosoft Azure(ロードバランサ#1) - LinuxユーザーがイジるはじめてのAzure

 

Azureのロードバランサーの種類が理解できましたので、次は2つ目のステップにはいります。

 

2、WEBアクセスできる仮想マシンを2台用意し上位にロードバランサ

  を設置する

 

では早速WEB用途のサーバーを2台立ち上げましょう。

 

・・・。

 

はい、Azureポータルでポチポチと2台の仮想マシンを作成するのは既にできると思いますが、同じことを行うのは面倒ですので、簡略化しましょう。

 

Azureにはテンプレートからシステムリソースを一気にデプロイする手立てがあります。Template DeployやExport templateなどが該当します。

 

ここでいうテンプレートとは、JSON形式で記載された構造定義となります。つまり1度作成したリソースグループ内の環境をすべて定義化したテンプレートを出すこともできますし、あらかじめ用意されているJSON定義や自作したJSON定義を使って、一気に環境構築を行うことができます。最近ではInfrastructure as a codeなんて呼ばれ方をしていますが、コードからIaaS環境を操作してしまう、というやり方です。

 

ここでは2台のCentOS7.2を一気に作成するテンプレートを紹介しますが、テンプレートの書き方やお作法など、非常に丁寧に記載されている記事がありますので、まずはこちらの記事を読んで、試して、理解してみてください。

 

 

www.cloudninja.asia

 

いかがでしたか?内容はUbuntuですが、RHELCentOSもほぼ一緒です。

とはいえ、白紙の状態からゴリゴリ記載するにはかなり手馴れていないとできませんので、まずはひな型とするテンプレートを用意し、2台の仮想マシンを作成する、といったオリジナルなカスタマイズをしたいですね。

 

AzureのQuick Start Templateでは、Gitに上がった有志の方々から参考になりそうなテンプレートがたくさんあります。まずはそれを覗いてみましょう。

 

 Azureポータルの左メニューにある「リソースグループ」から、「設定」を選ぶと下の方に「Export template」というメニューがあります。こちらをクリックしてみてください。

 

 

作成したばかりのリソースグループであれば、上記のようにJSON定義には何も記載されていない状態になります。上にあるデプロイのアイコンをクリックしましょう。

 

 

「テンプレートの編集」 をクリックすると上記の画面が出てくると思います。クイックスタートテンプレートというアイコンが出ていますので、そちらをクリックします。

 

 

テンプレートはたくさんありますので、「cent」 と入れてcentOSに関するテンプレートを一覧で出してみてください。他のサービスやOSと比べるとかなり少ないですが、いくつかテンプレートが用意されていることがわかります。

※ちなみに(免責事項)にも記載されている通り、このテンプレートはGitに登録した有志の方々が作成されたものを呼び込んでいるにすぎません。オフィシャルなサポートとして受けれるものではない、ということだけ理解しておきましょう。

 

ざっと見たところ2台のCentOS7.2を作成するテンプレートはなさそうです。参考になりそうなものはありますが、デプロイが失敗するテンプレートも中にはありますので注意しましょう。

 

では、クイックスタートテンプレートには目的のものがなさそうですので、これまでに自分が作成したリソースグループの定義をエクスポートし、それをひな型にし修正していきましょう。

 

今まで触っていたCentOS7.2を入れたリソースグループのExport templateから、ひな型をコピーし、Visual Studio Codeに張り付けてください。

 

 

上記のようにカラフルな状態になってなければ、一旦json拡張子として保存してください。

 

ざっと見てみるとわかりますが、この辺をいじればいいのかな、というものものあれば、これはどういじればよいのかな、というものもあると思います。

 

以下、私がちょこっと修正したテンプレートがありますので、※印の内容を読んでご利用ください。

 

※デプロイ前の準備:templatetest-rgというリソースグループを作成しておくこと。

JSON内でやってること

 1、パラメータで新規入力しなければいけないものはadominのパスワードだけ。

 2、SSHキーの公開キーは変更できるようパラメータとして設定。defaultで

   入れている通り、rsa-から始まる公開キー形式にする必要がありますが

   既に作成された仮想マシンのExport templateに記載されているため、それを

   コピペしてください。(ここでは「ssh-rsa AAAAZZZZ」と適当に記載してます。

 3、前回までに作成したCentOS7.2との違いは以下。

   ・ディスクはOSディスクのみ。追加したディスクは外しています。

   ・Network Security Group(FWみたいなもの)では22portだけでなく80portも

    許可しています。

   ・vNETは192.168.0.0/16とし、subnet1に192.168.10.0を用意しています。

   ・プライベートのアドレスは192.168.10.1と、もう1台は192.168.10.2と

    してあります。

 

----ここから-----

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "virtualMachines_templatecent_adminPassword": {
            "defaultValue": null,
            "type": "SecureString"
        },
        "sshKeyData": {
            "type": "string",
            "defaultValue": "ssh-rsa AAAAZZZZ",
            "metadata": {
            "description": "SSH rsa public key file as a string."
            }
        },
        "availabilitySets_templateavail_name": {
            "defaultValue": "templateavail",
            "type": "String"
        },
        "virtualMachines_templatecent_name": {
            "defaultValue": "templatecent",
            "type": "String"
        },
        "virtualMachines_templatecent_name2": {
            "defaultValue": "templatecent2",
            "type": "String"
        },
        "networkInterfaces_templatecent_name": {
            "defaultValue": "templatenic",
            "type": "String"
        },
        "networkInterfaces_templatecent_name2": {
            "defaultValue": "templatenic2",
            "type": "String"
        },
        "networkSecurityGroups_templatecent_name": {
            "defaultValue": "templatecent",
            "type": "String"
        },
        "publicIPAddresses_templatecent_name": {
            "defaultValue": "templatepubip",
            "type": "String"
        },
        "publicIPAddresses_templatecent_name2": {
            "defaultValue": "templatepubip2",
            "type": "String"
        },
        "virtualNetworks_templatetest_rg_name": {
            "defaultValue": "templatetest-rg",
            "type": "String"
        },
        "storageAccounts_templatetestrg_name": {
            "defaultValue": "templatetestrg",
            "type": "String"
        }
    },
    "variables": {},
    "resources": [
        {
            "comments": "リソース '/subscriptions/00b9a304-ca87-4f5e-b622-f782c041e0ad/resourceGroups/templatetest-rg/providers/Microsoft.Compute/availabilitySets/templateavail01' から一般化されました。",
            "type": "Microsoft.Compute/availabilitySets",
            "name": "[parameters('availabilitySets_templateavail_name')]",
            "apiVersion": "2015-06-15",
            "location": "japaneast",
            "properties": {
                "platformUpdateDomainCount": 5,
                "platformFaultDomainCount": 3
            },
            "dependsOn":
        },
        {
            "comments": "リソース '/subscriptions/00b9a304-ca87-4f5e-b622-f782c041e0ad/resourceGroups/templatetest-rg/providers/Microsoft.Compute/virtualMachines/templatecent01' から一般化されました。",
            "type": "Microsoft.Compute/virtualMachines",
            "name": "[parameters('virtualMachines_templatecent_name')]",
            "apiVersion": "2015-06-15",
            "location": "japaneast",
            "properties": {
                "availabilitySet": {
                    "id": "[resourceId('Microsoft.Compute/availabilitySets', parameters('availabilitySets_templateavail_name'))]"
                },
                "hardwareProfile": {
                    "vmSize": "Standard_A2"
                },
                "storageProfile": {
                    "imageReference": {
                        "publisher": "OpenLogic",
                        "offer": "CentOS",
                        "sku": "7.2",
                        "version": "latest"
                    },
                    "osDisk": {
                        "name": "[parameters('virtualMachines_templatecent_name')]",
                        "createOption": "FromImage",
                        "vhd": {
                            "uri": "[concat('https', '://', parameters('storageAccounts_templatetestrg_name'), '.blob.core.windows.net', concat('/vhds/', parameters('virtualMachines_templatecent_name'),'2016411173644.vhd'))]"
                        },
                        "caching": "ReadWrite"
                    },
                    "dataDisks":

                },
                "osProfile": {
                    "computerName": "[parameters('virtualMachines_templatecent_name')]",
                    "adminUsername": "koike",
                    "linuxConfiguration": {
                        "disablePasswordAuthentication": true,
                        "ssh": {
                            "publicKeys": [
                                {
                                    "path": "/home/koike/.ssh/authorized_keys",
                                    "keyData": "[parameters('sshKeyData')]"
                                }
                            ]
                        }
                    },
                    "secrets": ,
                    "adminPassword": "[parameters('virtualMachines_templatecent_adminPassword')]"
                },
                "networkProfile": {
                    "networkInterfaces": [
                        {
                            "id": "[resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaces_templatecent_name'))]"
                        }
                    ]
                }
            },
            "dependsOn": [
                "[resourceId('Microsoft.Compute/availabilitySets', parameters('availabilitySets_templateavail_name'))]",
                "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_templatetestrg_name'))]",
                "[resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaces_templatecent_name'))]"
            ]
        },
        {
            "comments": "リソース '/subscriptions/00b9a304-ca87-4f5e-b622-f782c041e0ad/resourceGroups/templatetest-rg/providers/Microsoft.Compute/virtualMachines/templatecent01' から一般化されました。",
            "type": "Microsoft.Compute/virtualMachines",
            "name": "[parameters('virtualMachines_templatecent_name2')]",
            "apiVersion": "2015-06-15",
            "location": "japaneast",
            "properties": {
                "availabilitySet": {
                    "id": "[resourceId('Microsoft.Compute/availabilitySets', parameters('availabilitySets_templateavail_name'))]"
                },
                "hardwareProfile": {
                    "vmSize": "Standard_A2"
                },
                "storageProfile": {
                    "imageReference": {
                        "publisher": "OpenLogic",
                        "offer": "CentOS",
                        "sku": "7.2",
                        "version": "latest"
                    },
                    "osDisk": {
                        "name": "[parameters('virtualMachines_templatecent_name2')]",
                        "createOption": "FromImage",
                        "vhd": {
                            "uri": "[concat('https', '://', parameters('storageAccounts_templatetestrg_name'), '.blob.core.windows.net', concat('/vhds/', parameters('virtualMachines_templatecent_name2'),'2016411173645.vhd'))]"
                        },
                        "caching": "ReadWrite"
                    },
                    "dataDisks":

                },
                "osProfile": {
                    "computerName": "[parameters('virtualMachines_templatecent_name2')]",
                    "adminUsername": "koike",
                    "linuxConfiguration": {
                        "disablePasswordAuthentication": true,
                        "ssh": {
                            "publicKeys": [
                                {
                                    "path": "/home/koike/.ssh/authorized_keys",
                                    "keyData": "[parameters('sshKeyData')]"
                                }
                            ]
                        }
                    },
                    "secrets": ,
                    "adminPassword": "[parameters('virtualMachines_templatecent_adminPassword')]"
                },
                "networkProfile": {
                    "networkInterfaces": [
                        {
                            "id": "[resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaces_templatecent_name2'))]"
                        }
                    ]
                }
            },
            "dependsOn": [
                "[resourceId('Microsoft.Compute/availabilitySets', parameters('availabilitySets_templateavail_name'))]",
                "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_templatetestrg_name'))]",
                "[resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaces_templatecent_name2'))]"
            ]
        },
        {
            "comments": "リソース '/subscriptions/00b9a304-ca87-4f5e-b622-f782c041e0ad/resourceGroups/templatetest-rg/providers/Microsoft.Network/networkInterfaces/templatecent0180' から一般化されました。",
            "type": "Microsoft.Network/networkInterfaces",
            "name": "[parameters('networkInterfaces_templatecent_name')]",
            "apiVersion": "2015-06-15",
            "location": "japaneast",
            "properties": {
                "ipConfigurations": [
                    {
                        "name": "ipconfig1",
                        "properties": {
                            "privateIPAddress": "192.168.10.1",
                            "privateIPAllocationMethod": "Dynamic",
                            "publicIPAddress": {
                                "id": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPAddresses_templatecent_name'))]"
                            },
                            "subnet": {
                                "id": "[concat(resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworks_templatetest_rg_name')), '/subnets/subnet1')]"
                            }
                        }
                    }
                ],
                "dnsSettings": {
                    "dnsServers":

                },
                "enableIPForwarding": false,
                "networkSecurityGroup": {
                    "id": "[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_templatecent_name'))]"
                }
            },
            "dependsOn": [
                "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPAddresses_templatecent_name'))]",
                "[resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworks_templatetest_rg_name'))]",
                "[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_templatecent_name'))]"
            ]
        },
        {
            "comments": "リソース '/subscriptions/00b9a304-ca87-4f5e-b622-f782c041e0ad/resourceGroups/templatetest-rg/providers/Microsoft.Network/networkInterfaces/templatecent0180' から一般化されました。",
            "type": "Microsoft.Network/networkInterfaces",
            "name": "[parameters('networkInterfaces_templatecent_name2')]",
            "apiVersion": "2015-06-15",
            "location": "japaneast",
            "properties": {
                "ipConfigurations": [
                    {
                        "name": "ipconfig2",
                        "properties": {
                            "privateIPAddress": "192.168.10.2",
                            "privateIPAllocationMethod": "Dynamic",
                            "publicIPAddress": {
                                "id": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPAddresses_templatecent_name2'))]"
                            },
                            "subnet": {
                                "id": "[concat(resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworks_templatetest_rg_name')), '/subnets/subnet1')]"
                            }
                        }
                    }
                ],
                "dnsSettings": {
                    "dnsServers":
                },
                "enableIPForwarding": false,
                "networkSecurityGroup": {
                    "id": "[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_templatecent_name'))]"
                }
            },
            "dependsOn": [
                "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPAddresses_templatecent_name2'))]",
                "[resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworks_templatetest_rg_name'))]",
                "[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_templatecent_name'))]"
            ]
        },
        {
            "comments": "リソース '/subscriptions/00b9a304-ca87-4f5e-b622-f782c041e0ad/resourceGroups/templatetest-rg/providers/Microsoft.Network/networkSecurityGroups/templatecent01' から一般化されました。",
            "type": "Microsoft.Network/networkSecurityGroups",
            "name": "[parameters('networkSecurityGroups_templatecent_name')]",
            "apiVersion": "2015-06-15",
            "location": "japaneast",
            "properties": {
                "securityRules": [
                    {
                        "name": "default-allow-ssh",
                        "properties": {
                            "protocol": "Tcp",
                            "sourcePortRange": "*",
                            "destinationPortRange": "22",
                            "sourceAddressPrefix": "*",
                            "destinationAddressPrefix": "*",
                            "access": "Allow",
                            "priority": 1000,
                            "direction": "Inbound"
                        }
                    },
                    {
                        "name": "default-allow-http",
                        "properties": {
                            "protocol": "Tcp",
                            "sourcePortRange": "*",
                            "destinationPortRange": "80",
                            "sourceAddressPrefix": "*",
                            "destinationAddressPrefix": "*",
                            "access": "Allow",
                            "priority": 1010,
                            "direction": "Inbound"
                        }
                    }                   
                ]
            },
            "dependsOn":

        },
        {
            "comments": "リソース '/subscriptions/00b9a304-ca87-4f5e-b622-f782c041e0ad/resourceGroups/templatetest-rg/providers/Microsoft.Network/publicIPAddresses/templatecent01' から一般化されました。",
            "type": "Microsoft.Network/publicIPAddresses",
            "name": "[parameters('publicIPAddresses_templatecent_name')]",
            "apiVersion": "2015-06-15",
            "location": "japaneast",
            "properties": {
                "publicIPAllocationMethod": "Static",
                "idleTimeoutInMinutes": 4
            },
            "dependsOn":
        },
        {
            "comments": "リソース '/subscriptions/00b9a304-ca87-4f5e-b622-f782c041e0ad/resourceGroups/templatetest-rg/providers/Microsoft.Network/publicIPAddresses/templatecent01' から一般化されました。",
            "type": "Microsoft.Network/publicIPAddresses",
            "name": "[parameters('publicIPAddresses_templatecent_name2')]",
            "apiVersion": "2015-06-15",
            "location": "japaneast",
            "properties": {
                "publicIPAllocationMethod": "Static",
                "idleTimeoutInMinutes": 4
            },
            "dependsOn":

        },
        {
            "comments": "リソース '/subscriptions/00b9a304-ca87-4f5e-b622-f782c041e0ad/resourceGroups/templatetest-rg/providers/Microsoft.Network/virtualNetworks/templatetest-rg' から一般化されました。",
            "type": "Microsoft.Network/virtualNetworks",
            "name": "[parameters('virtualNetworks_templatetest_rg_name')]",
            "apiVersion": "2015-06-15",
            "location": "japaneast",
            "properties": {
                "addressSpace": {
                    "addressPrefixes": [
                        "192.168.0.0/16"
                    ]
                },               
                "subnets": [
                    {
                        "name": "subnet1",
                        "properties": {
                            "addressPrefix": "192.168.10.0/24"
                        }
                    }
                ]
            },
            "dependsOn":
        },
        {
            "comments": "リソース '/subscriptions/00b9a304-ca87-4f5e-b622-f782c041e0ad/resourceGroups/templatetest-rg/providers/Microsoft.Storage/storageAccounts/templatetestrg2912' から一般化されました。",
            "type": "Microsoft.Storage/storageAccounts",
            "name": "[parameters('storageAccounts_templatetestrg_name')]",
            "apiVersion": "2015-06-15",
            "location": "japaneast",
            "tags": {},
            "properties": {
                "accountType": "Standard_LRS"
            },
            "dependsOn":

        }
    ]
}

----ここまで-----

 

あとはAzureポータルから以下の画面でOKしていきます。

 

 

「テンプレートの編集」では上記のJSON形式を上書きすれば終わりです。

「パラメータの編集」ではadminのパスワードを新規で入力し、SSHキーの部分をご自分のrsaから始まる公開キーに上書き変更してOKします。

「リソースグループ」は先ほど事前に準備したtemplatetest-rgを選択してください。必然的にリソースグループの場所は東日本固定になります。

「法律条項」はちょっとドキッとしますが、なんてことはなく内容をざっとよんで購入ボタン(購入って言葉にひっかかりますが、同意と解釈しましょう)をおします。

最後に作成、とするとデプロイがはじまります。

 

デプロイが正常に終わったかはポータル右上の鈴マークで確認できますので、進捗状況も含めてみてみてください。

 

長くなったのでここまでとしますが、次回の記事ではいよいよ仮想マシンにhttpdをあげてロードバランサを上位に組み込みましょう。

はじめてのMicrosoft Azure(ロードバランサ#1)

前回までで、CentOS7.2の仮想マシンを作成し1TBのディスク領域を追加しました。

※前回の記事は以下。

 

はじめてのMicrosoft Azure(ディスクアタッチ) - LinuxユーザーがイジるはじめてのAzure

 

仮想マシンを作成しディスクを追加して、とくれば次はロードバランサの作成、と必然的な流れがありますので、とりあえず乗っかりましょう。とはいえゴールがないと目移りしてしまいますのでゴール設定をします。

 

ゴール:2台のWEBサーバーに対してロードバランサから分散させてWEBを表示する

 以下がこれからやっていく順序になります。

 

1、【事前準備】ロードバランサの種類を理解する 

2、WEBアクセスできる仮想マシンを2台用意し上位にロードバランサ

  を設置する

3、稼働中の1台を強制停止させ正常にロードバランスできていることを確認する

 

 ○1、【事前準備】ロードバランサの種類を理解する

 

まず、一言でロードバランサといってもレイヤと呼ばれる階層毎に異なる種類が存在します。これはMicrosoft Azureに限った話ではなく、どのクラウド事業者が提供するロードバランサも同じです。ではどのような種類があるのか、Microsoft Azureを例に説明します。

 

グローバルロードバランサを担う「Traffic Manager」

その名の通り、世界中に点在するリソースに対して広域負荷分散するロードバランサです。AzureではTraffic Managerと呼ばれる機能がこれに該当します。こちらを利用するケースは、異なるリージョンに対して負荷分散を行う場合に利用するためDNSレベルで制御し、用途としては事業継続性(BCP)やDisasterRecovery(DR)対策といったクリティカルなサービスで必要になります。ポイントは「異なるリージョン間での負荷分散」ですが、Traffic Managerから直接仮想マシンのグローバルアドレスに対して分散させるケースはほとんどなく。大抵は下で説明するL4ロードバランサのエンドポイントへ分散させます。

 

L4ロードバランサを担う「Azure Load Barancer」

L4とはレイヤ4を指しており、OSI参照モデルでいうトランスポート層の分散を担うロードバランサになります。トランスポート層といっても難しく感じますので、平たく言えばIPアドレスを使った分散が可能と考えてください。また、Azure Load Barancerはパブリックなアクセスに対する負荷分散以外に内部ネットワーク間の負荷分散機能としても利用できるため、プライベートロードバランサとしての用途として利用することもできます。※その場合はILB(Internal Load Barancer)と略されます。ILBはWEBからDBサーバーへ分散する際に複数台のマルチマスタ構成のDBサーバーや、複数のreadのみ担当するslaveサーバーへ分散する、などの用途で利用できます。

 

L7ロードバランサを担う「Application Gateway

L7はレイヤ7ですので、アプリケーション層の分散を担うロードバランサです。L4ではIPアドレスを担う分散が可能でしたが、L7ではURLやHTTPヘッダによる分散ができるようになります。こちらはいわゆる仮想ロードバランサと呼ばれる位置づけになりますが、仮想マシンへログインして操作するものではありません。仮想マシンと同列のレイヤで負荷分散機能が利用できます。

 

今回はお試しで利用するためAzure Load Balancerを利用しますが、もしSSLオフロード機能が必須であったり、Cookie処理による振る舞いが必要なケースであればApplication Gatewayを利用しましょう。Azure Load BalancerではSSLオフロード機能は現時点で搭載されていません。

 

Tips

SSLオフロードとは。SSLアクセラレータとも呼ばれる機能ですが、この機能を理解する前にSSL通信を理解する必要があります。

まずクライアント(ブラウザ)がhttpsから始まるWEBサイトへアクセスします。そうするとWEBサーバーから証明書が送られてくるためブラウザはブラウザに搭載されているルート証明書から署名を確認します。※ここで見つからないと警告がでます。確認が取れれば、通信データの暗号化に使用可能な暗号の種類をサーバに通知し共通鍵暗号方式が選択されます。ブラウザは暗号用の共通鍵を生成しサーバの公開鍵で暗号化して送ります。ブラウザから送られた暗号化された公開鍵は、サーバー側の秘密鍵で複合されます。そして双方が共通鍵(セッションキー)を使って暗号化通信が開始されます。これがSSL通信/TLS方式になります。

、、、という具合に、サーバー側で毎回複合化する処理が走るため、結構サーバー側の負担(性能負荷)が大きいのが現状です。この役目を上位にいるロードバランサにやってもらおう、というのがSSLオフロード機能になります。また、数台のサーバーであれば証明書の配置や展開は苦にならないですが、数十台、数百台となってきますと、SSL証明書の更新タイミングや脆弱性発生時の入れ替えなどの手間を考えるとロードバランサの証明書を1つ変更するだけで終わる、という運用の手間軽減にもつながります。

 

今回の記事はここまでとします。

 

ロードバランサに関する種類はある程度理解できたと思いますので、次の記事からは

「2、WEBアクセスできる仮想マシンを2台用意し上位にロードバランサを設置する」を始めたいと思います。