Quantcast
Channel: idcfクラウド - IDCF テックブログ
Viewing all 122 articles
Browse latest View live

IDCFクラウドでkeepalivedを使ったLVS構築(1)

$
0
0

はじめまして、ソリューションアーキテクト部の金杉です!

最近、私が関わっている業務の一環として、IDCFクラウドでLVS(Linux Virtual Server)を立ててみました。エンジニアブログでまだ紹介されてなかったということで、今回はIDCFクラウドのCentOSで、keepalivedでLVSを使ったロードバランサーの構築を紹介します。

キャプチャ2

▲今回構築する構成

ご存知の方もいらっしゃると思いますが、IDCFクラウドではアカウントごとに仮想ルーターがついています。仮想ルーターの詳細についてはこちらをご覧ください。

仮想ルーターについているロードバランサー機能はとても便利なのですが、LVSを使う必要がある構成も稀ではないですよね。LVSを使いたい主な理由をまとめると:

  • 処理が速いので大量にバランシングできる
  • アプリサーバー側で接続元IPアドレスを特定できる
  • keepalivedを使うことによって、サービスに近いヘルスチェックができる
  • 内部トラフィックとサービス側のバランシングを分けることができる

などなどあります。そしてLVSはみんなが大好きなOSS(オープンソースソフトウェア)なので、導入も手軽にできるのです!

一方keepalivedは、LVSと組み合わせて使うデーモンです。LVSの設定は、keepalived.confファイルを編集するだけで反映されるので、とても便利です。keepalivedが提供する機能は主に2つあります:

  1. バランシングしているサーバーのヘルスチェック
  2. VRRPを用いたロードバランサーの冗長化

今回は、keepalivedの機能1、サーバーのバランシング+ヘルスチェックの部分についてです。

ではここから構築に入ってみましょうー!

 

仮想マシンの準備

CentOS 6.6の仮想マシンで構築をします。バランシングするリアルサーバー(Web)2台とバーチャルサーバー(LVS)1台、計3台の仮想マシンを以下のスペックで作成します。「台数」選択の部分で、【3】を選択すると一気に作れてしまいます★

マシンタイプ            Light.S1
 イメージ              CentOS 6.6 64-bit
 ボリューム             そのまま
 SSH Key              作成
 仮想マシン台数           3
 ネットワークインターフェース    そのまま
 詳細情報・仮想マシン名       Web1, Web2, LB
 詳細情報・プライベートIPアドレス  自動設定

IDCFクラウドポータル上でのVM一覧

仮想マシンは、それぞれSSHできるように「IPアドレス」の設定をしておいてください。 そしてLVSサーバーLBに関しては、HTTP通信ができるように80番ポートもあけておいて下さい。

詳しくは、めちゃ楽ガイドをご参照ください!

 

今回の構成

今回は、このような構成になります。

キャプチャc
公開用のIPは仮想ルーターのソースIPで、裏にLB、Web1、Web2などが同じセグメントに設置されています。LBがバランシングする時の通信を詳しく見てみると、こうなります。

キャプチャ2ここで2点補足です。

  1. 先ほども出てきたロードバランサー用語として、ロードバランサーのバランシング対象を集約する上位側のことを「バーチャルサーバー」と呼び、下位側のWeb等のことを「リアルサーバー」と呼びます。クライアントから見ると、トラフィックの宛先は実際のサーバーではなく、それらを1つのサーバーのように見せかけて、集約しているロードバランサーです。なのでこのロードバランサーをバーチャルサーバーと呼び、実際にリクエストに返信するバランシング対象をリアルサーバーと呼びます。この図で見ると、リクエストの宛先はバーチャルサーバーのIPアドレス、10.5.0.133になります。
  2. 今回は、DSR(Direct Server Return)方式を使ってリクエストをクライアントに返します。この方式では、LVS宛に来たリクエストは、リアルサーバーにフォワードされた後、LVSを経由せず直接クライアントに返されます。一方、NAT(Network Address Translation)方式もありますが、これはロードバランサーを経由し、IPアドレスを書き換えてクライアントに返す方法のため、ロードバランサーに負荷がかかります。よって、LVSを使う時はDSR構成がよく使われます。

 

Step1. keepalivedの準備

LVSの設定をしていきます。

必要なパッケージをダウンロード

<code>[root@LB ~]# yum -y install ipvsadm keepalived</code>

自動起動の設定

<code>[root@LB ~]# chkconfig keepalived on</code>
<code>[root@LB ~]# chkconfig --list keepalived</code>
<code>keepalived  0:off  1:off  2:on  3:on  4:on  5:on  6:off</code>

パケット転送の設定

<code>[root@LB ~]# vim /etc/sysctl.conf</code>
<code>net.ipv4.ip_forward = 1 (0から1へ変更)</code>
<code>[root@LB ~]# sysctl -p</code>
<code>net.ipv4.ip_forward = 1 (変更されていればOK)</code>

LVSの設定

keepalivedはデフォルトでipvsadmをラップしているので、LVSの設定はkeepalivedのコンフィグを編集して行います。

<code>[root@LB ~]# vim /etc/keepalived/keepalived.conf</code>

<code># LVSのeth0側のIP</code>
<code>virtual_server 10.5.0.133 80 {</code>
<code>  # ヘルスチェック間隔</code>
<code>  delay_loop 3</code>
<code>    # 分散方式はround robinを使う</code>
<code>    lb_algo rr</code>
<code>     # パケット転送の方法はdirect routing (DSR)</code>
<code>    lb_kind DR</code>
<code>    protocol TCP</code>
<code>    # Web 1</code>
<code>    real_server 10.5.0.229 80 {</code>
<code>        weight 1</code>
<code>        # ヘルスチェック失敗時はweightをさげる</code>
<code>        inhibit_on_failure</code>
<code>        HTTP_GET {</code>
<code>            url {</code>
<code>               # ヘルスチェック用のページ</code>
<code>               path /healthchk.html</code>
<code>               status_code 200</code>
<code>            }</code>
<code>            connect_timeout 3</code>
<code>            # ヘルスチェック失敗時の間隔</code>
<code>            delay_before_retry 7</code>
<code>         }</code>
<code>     }</code>
<code>     # Web 2</code>
<code>     real_server 10.5.0.36 80 {</code>
<code>        weight 1</code>
<code>        #ヘルスチェック失敗時はweightをさげる</code>
<code>        inhibit_on_failure</code>
<code>        HTTP_GET {</code>
<code>            url {</code>
<code>              # ヘルスチェック用のページ</code>
<code>              path /healthchk.html</code>
<code>              status_code 200</code>
<code>            }</code>
<code>            connect_timeout 3</code>
<code>            # ヘルスチェック失敗時の間隔</code>
<code>            delay_before_retry 7</code>
<code>        }</code>
<code>    }</code>
<code>}</code>

Step2. リアルサーバーの準備

Webサーバーのセットアップをします。

必要なパッケージをダウンロード

<code>[root@Web1 ~]# yum install -y httpd</code>

公開用のページとヘルスチェック用のページの作成

<code>[root@Web1 ~]# echo ‘Hi, this is Web1.’ &gt; /var/www/html/index.html</code>
<code># 後ほど公開するページを作成</code>
<code># ここでは動作確認しやすいようにWeb1, Web2と区別する</code>
<code>[root@Web1 ~]# echo ‘just a page for health check’ &gt; /var/www/html/healthchk.html</code>
<code># ヘルスチェック用のページを作成</code>

iptablesの記入

重要です。リアルサーバーがLVS宛のパケットを受け取ったとき、自分宛のパケットとして処理できるようにさせてあげる必要があります。

<code>[root@Web1 ~]# iptables -t nat -A PREROUTING -d 10.5.0.133 -j REDIRECT</code>
<code># -d 10.5.0.133 の部分でご自身のLVSのIPを指定する</code>
<code>[root@Web1 ~]# service iptables save</code>

Apacheの起動および自動起動設定

<code>[root@Web1 ~]# service httpd start</code>
<code>[root@Web1 ~]# chkconfig httpd on</code>

Step3. keepalivedの起動

LVSもリアルサーバーも準備が出来たので、いよいよkeepalivedを起動して、様子を見てみます!

keepalivedの起動

<code>[root@LB ~]# service keepalived start</code>

動作確認

動作確認の一番手っ取り早い方法は、WebサーバーのApacheを落としてみて、切り替えができ ているか確認することになります。ブラウザ経由で確認できますし、LVS上でipvsadmコマンドでもバランシング対象のヘルスチェックが通っているかどうか確認できます。

<code>[root@LB ~]# ipvsadm -Ln</code>
<code>IP Virtual Server version 1.2.1 (size=4096)</code>
<code>Prot LocalAddress:Port Scheduler Flags</code>
<code>  -&gt; RemoteAddress:Port           Forward Weight ActiveConn InActConn</code>
<code>TCP  10.5.0.133:80 rr persistent 10</code>
<code>  -&gt; 10.5.0.36:80                 Route   1      0          0        </code>
<code>  -&gt; 10.5.0.229:80                Route   1      0          0  </code>

Web1とWeb2のIPが表示されました。重みが1なのでヘルスチェックが通っているという事ですね。続いて、Web1のApacheを落としてみます。

<code>[root@Web1 ~]# service httpd stop</code>
<code>httpd を停止中:                                            [ OK ]</code>

もう一度ipvsadmでみてみると、Web1はまだバランシング対象のリストに存在しますが、weightが0になっています。なので実際にトラフィックはWeb1に分散されません。

これはinhibit_on_failureをkeepalived.confで設定したからです。これによって障害時でもバランシングリストの確認が簡単にできるので、トラブルシューティングでも役立ちます。

<code>[root@LB ~]# ipvsadm -Ln</code>
<code>IP Virtual Server version 1.2.1 (size=4096)</code>
<code>Prot LocalAddress:Port Scheduler Flags</code>
<code>  -&gt; RemoteAddress:Port           Forward Weight ActiveConn InActConn</code>
<code>TCP  10.5.0.133:80 rr persistent 10</code>
<code>  -&gt; 10.5.0.36:80                 Route   1      0          0    </code>
<code>  -&gt; 10.5.0.229:80                Route   0      0          0  </code>

これで簡単な動作確認がとれました。ばっちりですね★

 

終わりに

みなさん、LVSの構築はいかがでしたか?とても簡単でわかりやすくてヘルスチェックもできるので、お手軽に使い始めて頂けます。

DSR方式を使用しているので、LVSがボトルネックになるのはほとんど無いと思います。そして仮想ルーターのロードバランサー機能を使わない事によって仮想ルーターのリソースにも余裕ができるので、大規模な構成を組む時はLVSがおすすめです!

今回はS1で構築してますが、もし処理性能を高めたい場合はCPUを増やすのが効果的です。IDCFクラウドのマシンタイプで言うとhighcpu.M4、highcpu.L8などが一番良い性能を出します。特にhighcpu.L8はコスパが一番良いかと思います!

ですが、もしLVSが落ちたらどうするの?という心配もきっとあるので、次回はkeepalivedでVRRPを使ってLVSを冗長化してみたいと思います。お楽しみに!

<関連記事>


IDCFクラウドでkeepalivedを使ったLVS構築(2)

$
0
0

こんにちは、ソリューションアーキテクト部の金杉です!

前回は、IDCFクラウドでkeepalivedを使ったLVSを構築しました。LVSの主な二つの機能を振り返ってみると、

  1. バランシングしているサーバーのヘルスチェック
  2. VRRPを用いたロードバランサーの冗長化

などがありますね。機能1は前回のブログで紹介させて頂いたので、今回は機能2の部分、VRRPを用いてLVSを冗長構成にしてみたいと思います。そしてバランシングするサーバーの特徴に基づいた、2種類の構築方法を紹介します!

f:id:toshimi727:20160226100744p:plain
▲今回構築する構成

仮想マシンの準備

CentOS 6.6の仮想マシンで構築します。バランシングするリアルサーバー(WebやDBなど)2台とバーチャルサーバー(LVS)2台、計4台の仮想マシンを以下のスペックで作成します。「台数」選 択の部分で、"4"を選択すると一気に作れてしまいます★

マシンタイプ             Light.S1
 イメージ               CentOS 6.6 64-bit
 ボリューム              そのまま
 SSH Key                作成
 仮想マシン台数            4
 ネットワークインターフェース     そのまま
 詳細情報・仮想マシン名        LB, LB-backup, Real1, Real2,
 詳細情報・プライベートIPアドレス   自動設定

仮想マシンは、それぞれSSHできるように「IPアドレス」の設定をしておいてください。 もしリアルサーバーが公開用であれば、80番ポートのファイアウォールだけあけておいて、ポートフォワードルールは記入しないでください。後ほど新しいルールを記入します。

詳しくは、めちゃ楽ガイドをご参照ください!

 

今回の構成

今回は、Figure 1のような構成になります。仮想ルーターの下にLB(マスターロードバランサー)、LB-backup(バックアップロードバランサー)、Real1、Real2(リアルサーバー)が同じセグメントに設置されています。仮想ルーターのIPアドレスが公開用のIPアドレスになります。

一方、LBがバランシングする時の様子がFigure 2になります。LVSを冗長化することが今回の目的なので、LVSはLBとLB-backupの二台になります。LB-backupは、LBが万が一落ちてしまった場合バックアップとして動作する役割を持っています。中身はLBとほぼ同じです。

f:id:toshimi727:20160226100917p:plainf:id:toshimi727:20160226100943p:plain

普段、マスターロードバランサーとバックアップロードバランサーはセットになっていて、仮想的に1台のロードバランサーとして動作します。マスターに問題が発生した時、バックアップがマスターに昇格し、処理を代行します。このように、同じLANで複数台のルーターを1つに束ねる仕組みをVRRP(Virtual Router Redundancy Protocol)と呼び、自動的な切り替えをフェイルオーバーと言います。

右の図で見ると、LBとLB-backupは仮想的に1台のロードバランサーとして扱われます。なので、リクエストを一括で受けとるため、VIP(Virtual IP)と言う複数台のLVSを代表する仮想的なIPアドレスが必要となります。VIPを使うことによって、サービスへのリクエストはVIP宛となり、SSHなどのLVS単体へのリクエストは、サーバーの実IP宛のままで大丈夫です。イメージしやすくするには、VRRPによって束ねられているロードバランサー達を1つの仮想ロードバランサーと見て、そしてVIPはその仮想ロードバランサーのIPアドレスと想像すると良いかもしれません。

この肝心なVRRPですが、インフラの環境によってはサポートされていない場合が多いです。ですがIDCFクラウドではVRRPが使用できて、そしてVIPを取得する方法が、なんと二つもあります★共通の手順が多いのですが、構築される環境の特徴に応じて「Step1. VIPの取得」の部分を手順1と手順2に分けて紹介します。

  • バランシング対象がWeb等といった、トラフィックが仮想ルーター経由でくる場合→手順1
  • バランシング対象がDB等といった、トラフィックが内部サーバー経由でくる場合→手順2

手順がわかれる主な理由は、IDCFクラウドの仕様にあります。とても簡単な話ですが、仮想マシンが直接外部と通信する場合、仮想ルーターを経由するので、ポートフォワードを設定する必要があります。ポートフォワードをする場合はAPIでIPアドレスを取得する必要があり、具体的な方法は手順1で紹介されています。一方、リアルサーバーが内部サーバーのみと通信する場合、ポートフォワードは必要ありません。この場合、LVSの構築は比較的簡単で、その方法が手順2で紹介されています。

Step1. VIPの取得

【共通手順】

使用できるIPアドレスの確認

VIPとして使うIPアドレスの確認をします。IDCFクラウドのポータル画面より、左メニューバー「ネットワーク」、ターゲットのネットワーク名、「IPアドレス一覧」をクリックします。

f:id:toshimi727:20160226101311p:plain

手順1の場合

ここに表示されている仮想マシンやルーターに割当済みのIPアドレスと、「割当範囲外」のIPアドレスを除いたすべてのIPアドレスがVIPとして割当可能です。VIPはDHCPで取得することも可能ですが、今回は10.5.0.100を指定して使おうと思います。【手順1】の部分へお進みください。

手順2の場合

「割当範囲外」のIPアドレスがすべてVIPとして指定できるのですが、「利用不可」と書かれている最後の10個のIPアドレスだけはIDCFクラウド側で使用するため割当はできません。なので、この例では「利用不可」の10.5.7.235〜10.5.7.254を除いた範囲で選びましょう!特に決まりはないですが、今回は10.5.4.100を使います。では、【手順2】の部分へお進みください。

【手順1】仮想ルーター経由トラフィック用のLVS

トラフィックが仮想ルーターからくる場合は、下の図のような構成になります。Webなどの公開用サーバーをバランシングする時は、基本このような構成を取ります。リクエストは仮想ルーターを通過したら、直接ロードバランサーのVIP宛に届きます。そしてバランシング処理が済んだあと、再度このVIPよりリアルサーバーへ転送されます。

f:id:toshimi727:20160226101337p:plain

VIPの取得はAPI経由で行います。APIはハードルが高そうに見えますが、何回か使ううちにAPIのファンになっていく方が多いです(笑)。実際私もそうでした!IDCFクラウドではCloudStackのAPIがそのまま使えるので、なじみがある方もいらっしゃるかもしれませんね!IPアドレスの値は、先ほど確認した10.5.0.100をスタティックで付与します。APIに関しては、API Referencesをご参照ください!

コマンドラインツールのインストール APIを利用するにあたって、コマンドラインツールのインストールが必要になります。インストールするサーバーは、同じアカウント内のどのサーバーでもかまいません。APIのGetting Started ガイドに沿って「簡単な使い方:Step4」までを実行して頂いても良いですし、以前上野がご説明した「IDCFクラウド APIを利用した仮想マシンの作成からSSH接続まで」の「Step3」まで実行することでも実装できます。

APIでVIPを取得いよいよ準備はOKです。VIPをマスターロードバランサーLBのNICに追加する作業を行います。

<code>[root@LB ~]# cloudstack-api listVirtualMachines -t displayname,id</code>
<code>+-------------+--------------------------------------+</code>
<code>| displayname |                  id                  |</code>
<code>+-------------+--------------------------------------+</code>
<code>| LB          | a2fa6425-aacc-4aba-bb84-e486a41e1c9e |</code>
<code>| LB-backup   | bb4095f1-c6b1-4646-8e89-762cd26a53d2 |</code>
<code>| Web1        | 785020c1-4d3b-4bb4-84c4-c9abe8da9ccb |</code>
<code>| Web2        | ea2f2045-64b5-4f70-9201-e0a6aa9c81c5 |</code>
<code>+-------------+--------------------------------------+</code>
 
<code># 仮想マシンLBのNIC idを表示</code>
<code>[root@LB ~]# cloudstack-api listNics --virtualmachineid a2fa6425-aacc-4aba-bb84-e486a41e1c9e -t ipaddress,id</code>
<code>+------------+--------------------------------------+</code>
<code>| ipaddress  |                  id                  |</code>
<code>+------------+--------------------------------------+</code>
<code>| 10.5.0.133 | d555c213-3ede-4bb4-96bd-d1ce6c475852 |</code>
<code>+------------+--------------------------------------+</code>
 
<code># 仮想マシンLBのNICにセカンダリIPアドレスを指定して割り当てる</code>
<code>[root@LB ~]# cloudstack-api addIpToNic --nicid d555c213-3ede-4bb4-96bd-d1ce6c475852 --ipaddress 10.5.0.100</code>

<code># もう一度仮想マシンLBのNICの情報を表示</code>
<code>[root@LB ~]# cloudstack-api listNics --nicid d555c213-3ede-4bb4-96bd-d1ce6c475852 --virtualmachineid a2fa6425-aacc-4aba-bb84-e486a41e1c9e</code>
<code>{</code>
<code>  "listnicsresponse": {</code>
<code>    "count": 1,</code>
<code>    "nic": [</code>
<code>    {</code>
<code>      "gateway": "10.5.0.1",</code>
<code>      "id": "d555c213-3ede-4bb4-96bd-d1ce6c475852",</code>
<code>      "ipaddress": "10.5.0.133",</code>
<code>      "isdefault": true,</code>
<code>      "macaddress": "02:00:56:df:00:0f",</code>
<code>      "netmask": "255.255.252.0",</code>
<code>      "networkid": "15616765-d713-4ff3-bba3-a1c71a46d9bf",</code>
<code>      "secondaryip":</code>
<code>      {</code>
<code>        "id": "f2ff97fe-ecfd-4e01-ab34-9b17cbce16f9",</code>
<code>        "ipaddress": "10.5.0.100"</code>
<code>      }</code>
<code>    }</code>
<code>    ]</code>
<code>  }</code>
<code>}</code>

APIでポートフォワードルールを記入

<code>[root@LB ~]# cloudstack-api listPublicIpAddresses -t ipaddress,id</code>
<code>+----------------+--------------------------------------+</code>
<code>|   ipaddress    |                  id                  |</code>
<code>+----------------+--------------------------------------+</code>
<code>| 210.140.68.220 | 0c5cc05a-26d5-4539-9c7a-0f935291f71d |</code>
<code>+----------------+--------------------------------------+</code>
 
<code># VIPを指定してポートフォワードルールを記入</code>
<code>[root@LB ~]# cloudstack-api createPortForwardingRule --ipaddressid 0c5cc05a-26d5-4539-9c7a-0f935291f71d --privateport 80 --protocol tcp --publicport 80 --virtualmachineid a2fa6425-aacc-4aba-bb84-e486a41e1c9e --vmguestip 10.5.0.100</code>
<code>{</code>
<code>  "createportforwardingruleresponse": {</code>
<code>    "jobid": "dfc3d84e-c9e6-47d3-9f50-4fc4b2c25493",</code>
<code>    "id": "dfc3d84e-c9e6-47d3-9f50-4fc4b2c25493"</code>
<code>  }</code>
<code>}</code>

注意点 API経由で取得したsecondary IPの扱いには、2つ注意点がございます。 ※東日本リージョンのみの注意点となります。

  1. Secondary IPはポータルからの管理ができないので、ご自身での管理となります。なので誤って仮想マシンを削除してしまわないよう気を付けましょう!
  2. Secondary IPをグローバルIPアドレスとスタティックNATした場合、APIでスタティックNATを解除してから仮想マシンを削除するようにしてください。スタティックNATの設定解除せず、そのまま仮想マシンを削除してしまうとシステム側からスタティックNATが削除できなくなってしまいます。

【手順2】内部サーバー経由トラフィック用のLVS

トラフィックが内部サーバーからくる場合、下の図のような構成になります。DBなどの非公開用サーバーをバランシングするとき、よく取られる構成です。リクエストはWebサーバーなどの内部サーバーからロードバランサーのVIP宛に届きます。そしてバランシング処理が済んだあと、再度このVIPよりリアルサーバー1かリアルサーバー2へ転送されます。

f:id:toshimi727:20160226101354p:plain

このような構成の場合、VIPの取得はとても簡単です。VIPをあらかじめ決めておく事以外、特に設定の必要もありません!IPアドレスの値は、先ほど確認した10.5.4.100を使います。

注意点 VIPとして指定されたIPアドレスは、ポータルから管理ができないので、ご自身の管理となってしまいます。なのでIPアドレスが重複しないよう気を付けてください。

Step2. keepalivedの準備

LVSの設定をしていきます。もし前回の記事に沿って設定されているかたは「LVSの設定」部分から続けて下さい。

必要なパッケージをダウンロード

<code>[root@LB ~]# yum -y install ipvsadm keepalived</code>

自動起動の設定

<code>[root@LB ~]# chkconfig --list keepalived</code>
<code>keepalived  0:off  1:off  2:on  3:on  4:on  5:on  6:off</code>

パケット転送の設定

<code>net.ipv4.ip_forward = 1 (0から1へ変更)</code>
<code>[root@LB ~]# sysctl -p</code>
<code>net.ipv4.ip_forward = 1 (変更されていればOK)</code>

LVSの設定 keepalivedはデフォルトでipvsadmをラップしているので、LVSの設定はkeepalivedのコンフィグを編集して行います。マスターとバックアップ両方のコンフィグを記入する必要がありますが、priorityの値だけは異なるように設定してください。

<code># vrrp_instance [お好きな名前]で複数設定が可能です</code>
<code>vrrp_instance VI_1 {</code>
<code>  # マスター、バックアップのいずれか</code>
<code>  state MASTER</code>
<code>  # 監視するインターフェース</code>
<code>  interface eth0</code>
<code>  # VRIDは任意の数値で良いが</code>
<code>  # 同じセグメントの他のVRIDとかぶらないように設定する</code>
<code>  # 例:仮想ルーターのVRIDや追加ネットワークのVRID</code>
<code>  virtual_router_id 1</code>
<code>  # マスターとバックアップで必ず違う値にする</code>
<code>  # 例:マスター:300、バックアップ1:200、バックアップ2:100</code>
<code>  priority 100</code>
<code>  # VRRP信号を送る間隔</code>
<code>  advert_int 1</code>
<code>  # VIPを指定、手順2の場合は10.5.4.100</code>
<code>  virtual_ipaddress {</code>
<code>    10.5.0.100 dev eth0</code>
<code>  }</code>
<code>}</code>
<code># LVSの設定</code>
<code>virtual_server 10.5.0.100 80 {</code>
<code>  # ヘルスチェック間隔</code>
<code>  delay_loop 3</code>
<code>  # 分散方式はround robinを使う</code>
<code>  lb_algo rr</code>
<code>  # パケット転送の方法はdirect routing (DSR)</code>
<code>  lb_kind DR</code>
<code>  protocol TCP</code>
<code>  # リアルサーバのIPアドレスおよびヘルスチェックのポート番号</code>
<code>  # Webは80番や443番、MySQLは3306番など</code>
<code>  real_server 10.5.0.36 80 {</code>
<code>    weight 1</code>
<code>    # ヘルスチェック失敗時はweightをさげる</code>
<code>    inhibit_on_failure</code>
<code>    # ヘルスチェック方式</code>
<code>    # WebはHTTP_GETやSSL_GET、MySQLはTCP_CHECKなど</code>
<code>    HTTP_GET {</code>
<code>    # Webはurl、MySQLではconnect_port 3306など</code>
<code>    url {</code>
<code>    # ヘルスチェック用のページ</code>
<code>      path /healthchk.html</code>
<code>      status_code 200</code>
<code>    }</code>
<code>    connect_timeout 3</code>
<code>    # ヘルスチェック失敗時の間隔</code>
<code>    delay_before_retry 7</code>
<code>  }</code>
<code>}</code>
<code># リアルサーバー2台目以降も同じ設定にする</code>
<code>  real_server 10.5.0.229 80 {</code>
<code>    weight 1</code>
<code>    inhibit_on_failure</code>
<code>    HTTP_GET {</code>
<code>      url {</code>
<code>        path /healthchk.html</code>
<code>        status_code 200</code>
<code>      }</code>
<code>      connect_timeout 3</code>
<code>      delay_before_retry 7</code>
<code>    }</code>
<code>  }</code>
<code>}</code>

Step3. リアルサーバーの準備

手順1の場合はWebサーバー、手順2の場合はDBサーバーを例として準備します。ApacheやMySQLをインストールして、サービスをスタートすれば動作確認はとれます。Webサーバーに関しては、ヘルスチェック用のページも忘れず用意しておいてくださいね! iptablesの記入重要です。リアルサーバーがLVSのVIP宛のパケットを受け取ったとき、自分宛のパケットとして処理できるようにさせてあげる必要があります。

<code># -d 10.5.0.100 の部分でご自身のLVSのVIPを指定する</code>
<code>[root@Real1 ~]# service iptables save</code>

Step4. keepalivedの起動

LVS冗長構成の設定とVIPの準備ができたので、keepalivedを起動して、様子を見てみましょう! keepalivedの起動

VIPの確認マスター(LB)のほうでeth0に割り当てられているIPアドレスを見てみましょう。

<code>2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000</code>
<code>link/ether 02:00:56:df:00:0f brd ff:ff:ff:ff:ff:ff</code>
<code>inet 10.5.0.133/21 brd 10.5.7.255 scope global eth0</code>
<code>inet 10.5.0.100/32 scope global eth0</code>
<code>inet6 fe80::56ff:fedf:f/64 scope link</code>
<code>valid_lft forever preferred_lft forever</code>

マスターのほうにVIPがついています。VIPは、実際にLVSとして動いているサーバーに付きます。なのでこの時点で同じコマンドをバックアップのほうで入力しても、VIPは表示されません。マスターが正常にLVSとして稼働しているからです。

動作確認動作確認の前に、LVS上でipvsadmコマンドを使ってバランシングの状態をマスター、バックアップ両方で確認してみましょう。

<code>IP Virtual Server version 1.2.1 (size=4096)</code>
<code>Prot LocalAddress:Port Scheduler Flags</code>
<code>-&gt; RemoteAddress:Port           Forward Weight ActiveConn InActConn</code>
<code>TCP  10.5.0.100:80 rr</code>
<code>-&gt; 10.5.0.36:80                 Route   1      0          0</code>
<code>-&gt; 10.5.0.229:80                Route   1      0          0</code>

LVSのIPアドレスが見事VIPの10.5.0.100(手順2の場合10.5.4.100)になっています。ここでマスターを落としてみて、バックアップへフェイルオーバーするか確認してみます。

<code>keepalived を停止中:                                       [  OK  ]</code>
<code>[root@LB ~]# ip addr show eth0</code>
<code>2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000</code>
<code>link/ether 02:00:56:df:00:0f brd ff:ff:ff:ff:ff:ff</code>
<code>inet 10.5.0.133/21 brd 10.5.7.255 scope global eth0</code>
<code>inet6 fe80::56ff:fedf:f/64 scope link</code>
<code>valid_lft forever preferred_lft forever</code>

マスターでもう一度eth0に割り当てられているIPアドレスを見てみると、VIPが消えています。では、バックアップのほうを見てみましょう。

<code>2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000</code>
<code>link/ether 02:00:0a:30:00:10 brd ff:ff:ff:ff:ff:ff</code>
<code>inet 10.5.0.195/21 brd 10.5.7.255 scope global eth0</code>
<code>inet 10.5.0.100/32 scope global eth0</code>
<code>inet6 fe80::aff:fe30:10/64 scope link</code>
<code>valid_lft forever preferred_lft forever</code>

VIPが自動的にバックアップのNICに切り替わりました。冗長化は保たれていますね。

<code>IP Virtual Server version 1.2.1 (size=4096)</code>
<code>Prot LocalAddress:Port Scheduler Flags</code>
<code>-&gt; RemoteAddress:Port           Forward Weight ActiveConn InActConn</code>
<code>TCP  10.5.0.100:80 rr</code>
<code>-&gt; 10.5.0.36:80                 Route   1      0          0</code>
<code>-&gt; 10.5.0.229:80                Route   1      0          0</code>

バランシング状態も大丈夫のようです。これでLVSが冗長化されていることがわかりました。ばっちりですね★

 

終わりに

みなさん、LVSの冗長化はいかがでしたか?コンフィグの部分はさておき、VIPの取得が少し手間かもしれませんが、高価なロードバランサー2台分のお値段を考えると、全然お得ですよね!

もっとも魅力的なのはやはりクラウド環境で、VRRPを用いたLVSの冗長化が可能な仕様だと思っています。例の通り、IDCFクラウドはAPIさえクリアしてしまえば簡単にそれを実現できてしまいます。インフラのポイント、安定性と柔軟性においては文句なしです!

もちろん、もし内部トラフィックのバランシングのためでしたら、特にAPIを使う必要もないです。IPアドレスを指定してkeepalived.confに記述するだけで大丈夫です。なので、ぜひ構築したい環境の必要に応じて、楽できるインフラ構築を目指しましょう!ありがとうございましたー^ ^

<関連記事>

DNSの設定をRubyで自動化しよう!

$
0
0

原田さんトップ画像引用 https://rubygems.org/

はじめに 😁

こんにちは。IDCフロンティア UX開発部の原田梨沙です。 7月よりUX開発部に配属になりRubyの勉強をしています!

この記事では、IDCFクラウドDNS APIのRuby用クライアントの利用方法について説明します。

たくさんのゾーンやレコードの設定を、1つ1つ手動でやるのはとても大変ではないでしょうか 😟 そのような大変な作業もAPIを使うことで解決できます! IDCFクラウドDNSではAPIが公開されています。また、Ruby用のAPIクライアントidcf-dns-rubyがオープンソースとして公開されています。idcf-dns-rubyを使うことで簡単にDNSの設定を自動化することができます!🎉

この記事はLinuxやプログラムの基礎知識がある方向けに書いています。 Rubyが専門ではない方にもある程度理解できるように書きましたので、ぜひ最後までお付き合いください 😊

IDCFクラウド DNS 📟

IDCFクラウド DNSは、IDCフロンティアが提供するクラウド型DNSサービスです。DNSサーバーをクラウドで管理できるので、サーバーの構築や維持管理の手間がありません。詳しくはサービス紹介ページをご覧ください。 APIも提供されています。詳しくはAPI リファレンスを参照してください。

APIを使うことでDNSの設定を自動化することができます。 一般的に自動化のメリットとしては、作業ミスの防止や作業時間の短縮などがあります。 特にDNSの場合は1つの設定ミスがサービス全断の原因にもなるため、ミスは許されません。作業時間の観点で言えば、大量のゾーンやレコードを管理している場合、Webコンソールの画面で1つずつ設定変更をする必要がなくなり作業時間の短縮になります。また、アカウント毎にドメイン名を割り振るようなウェブサービスでは、APIを使えば簡単にドメイン設定をアプリケーションに組み込むことができます。

idcf-dns-rubyとは

idcf-dns-rubyはRubygemsとして公開されているIDCFクラウドDNS APIのRuby用クライアントです。 Rubygems名はidcf-dnsです。 他の言語でももちろんAPIを使うことはできますが、今提供されているのはこのRuby版のみです。

事前準備 🔧

bundlerでgemのインストール

idcf-dns-rubyを使うための準備をしていきましょう。

はじめに、bundlerというgemを使ってgemのインストールを行います。 bundlerはgemのパッケージとバージョンを一括管理することができるgemです。bundlerを使うことで依存関係のあるgemの管理がしやすくなります。今回はbundlerの詳しい説明は省きます。

gem installコマンドでbundlerをインストールします。 $ gem install bundler

作業用のディレクトリを用意してそのディレクトリに移動しましょう。

$ mkdir idcf-dns-ruby-test
$ cd idcf-dns-ruby-test

gemを一括管理するためのGemfileファイルを作成します。 $ bundle initGemfileにインストールしたいgem名を次のように書き込みます。

# Gemfile
gem "idcf-dns"
gem "dotenv"

idcf-dnsはidcf-dns-rubyのgem名です。 dotenvは次の項で説明するgemです。ついでにここでインストールしましょう。

Gemfileに書き込めたら、bundle installコマンドでgemをインストールします。

$ bundle install

f:id:rharada:20160226160853p:plain

idcf-dnsとdotenvがインストールされました。🎉

dotenvでAPI keyとSecret keyの管理

dotenvというgemを使って、API keyとSecret keyを環境変数に設定します。 dotenvはアプリケーションで使う環境変数を.envというファイルで管理することができるようになるgemです。 カレントディレクトリの.envに環境変数を設定しておくと自動でENVにその値を追加してくれます。今回はAPI keyとSecret keyの値を環境変数に設定しましょう。

まず、API keyとSecret keyの値を取得します。 IDCFクラウドのコンソール画面の[アカウント設定]から[API Key]をクリックします。ページ内に表示されているAPI KeyとSecret Keyを使います。 IDCFクラウド 3.png (99.2 kB)

次に、.envというファイルを作ります。このファイル内で環境変数を定義します。 以後説明で使用するキーはダミーのキーです。実際にはご自分のAPI keyとSecret keyをいれてください。

# .env
IDCF_API_KEY="81cee7430542c84e6c8d5f4ba8fd00ae43e26c4fc460d42e410481a2713f"
IDCF_SECRET_KEY="94dd39d0bbe3eceaa2b6746a35dba7c0f1354a30019451c6a5ceef6c08b3"

プログラムの中で環境変数を参照するには、ENV["IDCF_API_KEY"], ENV["IDCF_SECRET_KEY"]のように記述します。

# dotenv.rbrequire"dotenv"Dotenv.load

ENV["IDCF_API_KEY"] #=> "81cee7430542c84e6c8d5f4ba8fd00ae43e26c4fc460d42e410481a2713f"ENV["IDCF_SECRET_KEY"] #=> "94dd39d0bbe3eceaa2b6746a35dba7c0f1354a30019451c6a5ceef6c08b3"

Dotenv.loadメソッドはカレントディレクトリの.envファイルを読みこみ、ENV["IDCF_API_KEY"], ENV["IDCF_SECRET_KEY"]に呼び出します。

これでAPI keyとSecret keyの設定は終了です。

今回、API keyとSecret keyを環境変数に設定しました。 API key や Secret keyはユーザの認証にかかわる大事な情報です。今回の例にかかわらず、プログラム自体のソースコードとは分けて管理するのがおすすめです。理由としては、

  • 本番環境では環境変数をOS側に埋め込み、開発環境では値をファイルで管理できること
  • CIも認証情報を環境変数で管理することが多いので、この形にそっておくとCIを導入しやすいこと

などが挙げられます。

idcf-dns-rubyを使ってみよう 😉

GemのインストールとAPI Key・Secret keyの設定が終わり、idcf-dns-rubyを使うための準備が整いました。 いよいよ!idcf-dns-rubyを使ってみましょう!😁 🎉

クライアントの生成

リクエストを送るためにIdcf::Dns::Clientクラスのインスタンスを生成します。Clientのメソッドは基本的にResponseクラスのインスタンスを返します。 インスタンスの生成にはAPI keyとSecret keyが必要となります。dotenvで設定されている環境変数を使ってクライアントを生成してみましょう。

# client.rbrequire"idcf/dns"require"dotenv"Dotenv.load

client = 
  Idcf::Dns::Client.new(
    api_key: ENV["IDCF_API_KEY"], 
    secret_key: ENV["IDCF_SECRET_KEY"] 
  )

正しく設定されているか、ゾーン情報を取得するGETリクエストを送信して確認してみましょう。

# client.rb
response = client.get("zones")
response.success? #=> true
response.status #=> 200

Response#statusでHTTPレスポンスのステータスコードを確認できます。 (クラス名#メソッド名はあるクラスのインスタンスメソッドを表す表記方法です。この場合はResponseクラスのインスタントメソッドであるstatusを表しています。) HTTPステータスコード が"200"なので、クライアントがちゃんと動いていることを確認できました。😁

次項から、idcf-dns-rubyの具体的な使い方をみていきます。

ゾーン、レコードの一覧取得

Client#list_zonesでゾーン一覧を取得しましょう。 Response#bodyでレスポンスの内容を取得できます。 レスポンスにはゾーンのUUID、ドメイン名、ゾーンの作成日時などの情報が含まれています。

# list_zones.rb
response =
  client.list_zones

response.body #=>
[{"uuid"=>"283a5e3f-7597-4902-8b6a-f6751de60918",
  "name"=>"foobar.example.com",
  "default_ttl"=>3600,
  "created_at"=>"2015-11-09T13:24:58+09:00",
  "updated_at"=>"2015-11-20T17:41:11+09:00",
  "description"=>"Hello!",
  "authenticated"=>false},
 {"uuid"=>"c0ea3811-b7d4-4e3f-b2e8-bc65cd18d49c",
  "name"=>"foo.example.com",
  "default_ttl"=>3600,
  "created_at"=>"2015-11-09T13:28:38+09:00",
  "updated_at"=>"2015-11-09T15:09:49+09:00",
  "description"=>"DNSのRubyクライアントテスト用!",
  "authenticated"=>true},
 {"uuid"=>"7386f8f8-df54-4887-9e96-2f3ea624bcc5",
  "name"=>"foobarfoo.example.com",
  "default_ttl"=>600,
  "created_at"=>"2015-11-10T09:26:04+09:00",
  "updated_at"=>nil,
  "description"=>"",
  "authenticated"=>false}]

Response#countでゾーン数を取得できます。

# count.rb
response = client.list_zones
response.count #=> 3

Client#list_recordsでレコード一覧を取得しましょう。 Response#bodyでレスポンスの内容を取得できます。 レスポンスにはSOAレコード、NSレコード、レコードのUUIDなどの情報が含まれています。

# list_records.rb
response =
  client.list_records("ddcd8dbf-8d99-4f49-9958-7dd9a0bfb67f") # ゾーンのUUID

response.body #=>
  [{"uuid"=>"9fae4a12-319c-4afc-ac33-4542ef79dd0b",
    "name"=>"foobar.example.com",
    "type"=>"SOA",
    "content"=>
     {"dns"=>"ns01.idcfcloud.com",
      "email"=>"foobar.example.com.",
      "serial"=>4,
      "refresh"=>10800,
      "retry"=>3600,
      "expire"=>604800,
      "ttl"=>3600},
    "ttl"=>3600,
    "created_at"=>"2015-11-09T13:24:58+09:00",
    "updated_at"=>"2015-11-09T16:07:21+09:00",
    "priority"=>nil},
   {"uuid"=>"f61a75b7-8e9c-4e69-a91a-6e6aa90c2990",
    "name"=>"foobar.example.com",
    "type"=>"NS",
    "content"=>"ns01.idcfcloud.com",
    "ttl"=>3600,
    "created_at"=>"2015-11-09T13:24:58+09:00",
    "updated_at"=>nil,
    "priority"=>nil},
   {"uuid"=>"0195fe5d-7cff-4f94-8886-a13bb0f609b4",
    "name"=>"foobar.example.com",
    "type"=>"NS",
    "content"=>"ns02.idcfcloud.com",
    "ttl"=>3600,
    "created_at"=>"2015-11-09T13:24:58+09:00",
    "updated_at"=>nil,
    "priority"=>nil},
   {"uuid"=>"0bdc7d49-b1aa-4455-903f-35dc3c4338be",
    "name"=>"foobar.example.com",
    "type"=>"NS",
    "content"=>"ns03.idcfcloud.com",
    "ttl"=>3600,
    "created_at"=>"2015-11-09T13:24:58+09:00",
    "updated_at"=>nil,
    "priority"=>nil},
   {"uuid"=>"ecacc77f-e678-4f29-b6dd-6bec79c172a1",
    "name"=>"www.foobar.example.com",
    "type"=>"A",
    "content"=>"8.8.8.8",
    "ttl"=>3600,
    "created_at"=>"2015-11-09T16:07:21+09:00",
    "updated_at"=>nil,
    "priority"=>nil}]

Response#countでレコード数を確認できます。

# count.rb
response =
  client.list_records("ddcd8dbf-8d99-4f49-9958-7dd9a0bfb67f") 

response.count #=> 5

ゾーンの作成、更新、削除

Client#create_zoneでゾーンを新規作成します。 詳細なリクエストパラメータはドキュメントを 参照してください。 Response#uuidで新規作成したゾーンのUUIDを確認できます。

# create_zone.rb
response =
  client.create_zone(
    name: "foobar.example.com",
    email: "foobar@example.com",
    description: "",
    default_ttl: 600
  )

response.uuid #=> "384178f5-58a5-4f3c-9607-5e189ab2990d"

Client#update_zoneでゾーン情報を更新します。 詳細なリクエストパラメータはドキュメントを 参照してください。

# update_zone.rb
response =
  client.update_zone(
    "384178f5-58a5-4f3c-9607-5e189ab2990d", # 更新するゾーンのUUIDdescription: "Change description",
    default_ttl: 3600
  )

Client#delete_zoneでゾーンを削除します。

delete_zone.rb
response =
  client.delete_zone("83f55e72-e3fa-4961-89b3-99ee43617b93") # 削除したいゾーンのUUID

response.body #=> {}

response.status #=> 200

レコードの作成、更新、削除

Client#create_recordでレコードを新規作成します。 詳細なリクエストパラメータはドキュメントを 参照してください。

# create_record.rb
response =
  client.create_record(
    "ddcd8dbf-8d99-4f49-9958-7dd9a0bfb67f", # レコードを追加するゾーンのUUIDname: "www.foobar.example.com",
    type: "A",
    content: "8.8.8.8",
    ttl: 3600
  )

response.uuid #=> "40d5f26f-02bd-4fb1-b363-323675772289"

Client#update_recordでレコードを更新します。 詳細なリクエストパラメータはドキュメントを 参照してください。

# update_record.rb
response =
  client.update_record(
    "ddcd8dbf-8d99-4f49-9958-7dd9a0bfb67f", # 更新するレコードの属するゾーンのUUID"d612aabb-3fea-471a-8712-586f1ac9c29c", # 更新するレコードのUUIDcontent: "6.6.6.6"
  )

Client#delete_recordでレコードを削除します。

# delete_record.rb
response =
  client.delete_record(
    "ddcd8dbf-8d99-4f49-9958-7dd9a0bfb67f", # 削除したいレコードの属するゾーンUUID"d612aabb-3fea-471a-8712-586f1ac9c29c"# 削除したいレコードのUUID
  )

response.body #=> {}
response.status #=> 200

idcf-dns-rubyの使い方の説明は以上です。

バグ報告、質問、改善要望 🐛

バグ報告、質問、 改善要望などがありましたら、GithubのIssueでお知らせください。 なぜか英語ばかりですが、もちろん日本語でも大丈夫です😁 🇯🇵 Pull Requestは大大大歓迎です! お待ちしております 😊

おわりに 🙏

idcf-dns-rubyを使ってゾーンやレコードを設定する方法について説明しました。 作業効率化やサービス開発のお役に立てれば幸いです。

そして!

IDCフロンティア UX開発部 ではソフトウェアエンジニアを募集中です 😊 自社サービスの開発に興味のある方はぜひご応募ください 🙌

ボリュームアップロード機能の紹介

$
0
0

こんにちは。IDCフロンティア UX開発部の進藤です。

5/19にIDCFクラウドにおきまして、ボリュームアップロード機能をリリース致しました。
IDCFクラウド以外の環境(他社クラウドサービス等)で作成されたボリュームを、より簡単にIDCFクラウドでご利用頂けるようになりました。
ボリュームアップロード機能は、クラウドコンソール画面からはもちろん、APIもご利用頂けます。

この記事では、ボリュームアップロード機能の具体的なご利用方法を紹介します。

準備

ご準備頂くのは、OVA形式のボリューム だけです!

APIから実施される場合は、CloudStackのAPIを実行できる環境もご用意ください。

以降では例として、IDCFクラウドで作成したボリュームを、別アカウントのIDCFクラウドにアップロードする方法をご紹介します。

なお 例で使用するアカウントは下記の通りとします。
 - アップロード アカウント:アカウントA
 - アップロード アカウント:アカウントB

アカウントAのボリューム(OVAファイル) f:id:cshintoidcf:20160524174143p:plain

今回はこちらのURLのボリュームを使用します。


IDCFクラウドコンソールでアップロードする

まずは、IDCFクラウドのコンソールにてアップロードする方法を紹介します。

1. アップロード先のアカウントでログインします。

例では、アップロード先のアカウントを"アカウントB"としています。f:id:cshintoidcf:20160524172609p:plain

2. 「コンピューティング」>「ボリューム」へ遷移し、「ボリューム作成」をクリックします。

f:id:cshintoidcf:20160524171614p:plain

3. 「アップロード」をクリックし、必要事項を入力します。

《入力事項》

  • ボリューム名:任意の名前をご入力ください
  • ゾーン :アップロードするゾーンをご選択ください
  • URL :OVAファイルのURLをご入力ください
  • ※"http://*****.ova"形式のファイルのみアップロード可能です。
    お持ちのOVAファイルのURLが"https://・・・.ova"の場合、"s"を削除してご入力ください。

    f:id:cshintoidcf:20160524171902p:plain
    入力が完了したら「作成する」をクリックします。
    確認画面が表示されたら、「はい」をクリックしてください。

    4. アップロードが完了するまで待ちます。

    f:id:cshintoidcf:20160524171936p:plain

    アップロードが完了すると、ステータスが「Uploaded」に変わります。
    図はアップロードしたボリュームの詳細画面です。
    アカウントBにOVAファイルがアップロードできました。f:id:cshintoidcf:20160524172654p:plain

    仮想マシンにアタッチしてみる

    アップロードしたボリュームはそのまま仮想マシンへアタッチできます。

    1. アカウントBでアップロードしたボリュームの詳細画面で、「アタッチ」をクリックします。

    f:id:cshintoidcf:20160524172716p:plain

    2. アタッチ先の仮想マシンを選択して、「アタッチする」をクリックします。

    f:id:cshintoidcf:20160524172741p:plain

    アタッチが完了すると、アタッチ先仮想マシン名が表示され、ステータスもReadyに変わります。f:id:cshintoidcf:20160524172759p:plainアタッチ完了後ボリューム詳細画面
    これでアカウントBの仮想マシンでボリュームが使えるようになりました。
    f:id:cshintoidcf:20160524172815p:plain

    CloudStack APIを実行してアップロードする

    次にCloudStackのAPI:uploadVolumeでのアップロード方法を紹介します。

    1. 利用可能なゾーンを確認する

    listZones やlistVolumesを実行し、IDCFクラウドのアップロード先のアカウントBで有効化されているゾーンを確認します。
    今回はuploadVolume実行後との比較のためlistVolumesを実行しました。
    エンドポイントは西日本リージョンを指定しています。

    $ cs listVolumes
    {
      "count": 2,     //作成済ボリュームは2台ある
      "volume": [
        {
          "account": "*************", 
          "attached": "2016-05-24T15:39:48+0900", 
          "created": "2016-05-24T15:35:31+0900", 
          (中略)
          "name": "UpLoad_Test001",     //先程IDCFクラウドコンソールからアップロードしたUpLoad_Test001
          "pcidevicepath": "*************", 
          "provisioningtype": "thin", 
          "quiescevm": false, 
          "size": 16106127360, 
          "state": "Ready", 
          "storagetype": "shared", 
          "tags": [], 
          "type": "DATADISK", 
          "virtualmachineid": "*************", 
          "vmdisplayname": "testS1-w", 
          "vmname": "testS1-w", 
          "vmstate": "Running", 
          "zoneid": "{augusta_zoneid}",     //augustaゾーンのID(ボリュームアップロード時に使用します)
          "zonename": "augusta"
        }, 
        {
          "account": "*************", 
          "chaininfo": "{\"diskDeviceBusName\":\"scsi0:0\",\"diskChain\":[\"[jw01v-str03-p01b-DS23] i-1953-20809-W1VM/ROOT-20809.vmdk\"]}", 
          "created": "2016-05-17T14:30:33+0900", 
          (中略)
          "name": "ROOT-20809", 
          "provisioningtype": "thin", 
          "quiescevm": false, 
          "serviceofferingdisplaytext": "1 CPU x 0.8 GHz / 1 GB RAM", 
          "serviceofferingid": "*************", 
          "serviceofferingname": "light.S1", 
          "size": 16106127360, 
          "state": "Ready", 
          "storagetype": "shared", 
          "tags": [], 
          "templatedisplaytext": "Root Disk: 15GB,(v2)", 
          "templateid": "*************", 
          "templatename": "CentOS 7.1 64-bit", 
          "type": "ROOT", 
          "virtualmachineid": "*************", 
          "vmdisplayname": "testS1-w", 
          "vmname": "testS1-w", 
          "vmstate": "Running", 
          "zoneid": "{augusta_zoneid}", 
          "zonename": "augusta"
        }
      ]
    }


    2. uploadVolumeを実行する

    必要なパラメータを指定してuploadVolumeを実行します。

    • パラメータ
      • zoneid:アップロード先ゾーンのid(listZones等で取得)
      • format:OVAを指定
      • name:任意のボリューム名(例ではUplLoad_Test002)
      • url:ボリュームのURL
        ※uploadVolumeでは、"http://・・・.ova"形式のファイルのみご利用頂けます。
        例では準備にて記載している アカウントAで作成したボリュームを指定しています。


    uploadVolume実行例

    $ cs uploadVolume zoneid={augusta_zoneid} format=OVA name=UpLoad_Test002 url=http://X-X-X-X.systemip.idcfcloud.com/userdata/2e94a824-89fb-43cc-b177-31583d57a774.ova
    Polling result... ^C to abort
    {
      "accountid": "*************", 
      "cmd": "org.apache.cloudstack.api.command.user.volume.UploadVolumeCmd", 
      "created": "2016-05-24T15:45:40+0900", 
      "jobid": "*************", 
      "jobprocstatus": 0, 
      "jobresult": {
        "volume": {
          "account": "*************", 
          "created": "2016-05-24T15:45:40+0900", 
          "destroyed": false, 
          "diskofferingdisplaytext": "Custom Disk", 
          "diskofferingid": "*************", 
          "diskofferingname": "Custom", 
          "domain": "*************", 
          "domainid": "*************", 
          "id": "*************", 
          "isextractable": true, 
          "name": "UpLoad_Test002", 
          "provisioningtype": "thin", 
          "quiescevm": false, 
          "size": 0, 
          "state": "UploadNotStarted", 
          "status": "", 
          "storagetype": "shared", 
          "tags": [], 
          "type": "DATADISK", 
          "zoneid": "{augusta_zoneid}", 
          "zonename": "augusta"
        }
      }, 
      "jobresultcode": 0, 
      "jobresulttype": "object", 
      "jobstatus": 1, 
      "userid": "*************"
    }


    ステータスが"UploadNotStarted"となっていますが、listVolumesを実行すると、アカウントBの指定のゾーンに正常にアップロードされていることが確認できます。

    $cs listVolumes
    {
      "count": 3,     //1台アップロードしたため、作成済ボリューム台数が3になった
      "volume": [
        {
          "account": "*************", 
          "created": "2016-05-24T15:45:40+0900", 
          (中略) 
          "name": "UpLoad_Test002",     //APIからアップロードしたボリューム
          "provisioningtype": "thin", 
          "quiescevm": false, 
          "size": 16106127360, 
          "state": "Uploaded",          //ステータスがUploadedになっている
          "storagetype": "shared", 
          "tags": [], 
          "type": "DATADISK", 
          "zoneid": "{augusta_zoneid}", 
          "zonename": "augusta"
        }, 
        {
          "account": "*************", 
          "attached": "2016-05-24T15:39:48+0900", 
          "created": "2016-05-24T15:35:31+0900", 
          (中略) 
          "name": "UpLoad_Test001",     //IDCFクラウドコンソールからアップロードしたUpLoad_Test001
          "pcidevicepath": "*************", 
          "provisioningtype": "thin", 
          "quiescevm": false, 
          "size": 16106127360, 
          "state": "Ready", 
          "storagetype": "shared", 
          "tags": [], 
          "type": "DATADISK", 
          "virtualmachineid": "*************", 
          "vmdisplayname": "testS1-w", 
          "vmname": "testS1-w", 
          "vmstate": "Running", 
          "zoneid": "{augusta_zoneid}", 
          "zonename": "augusta"
        }, 
        {
          "account": "*************", 
          "chaininfo": "{\"diskDeviceBusName\":\"scsi0:0\",\"diskChain\":[\"[jw01v-str03-p01b-DS23] i-1953-20809-W1VM/ROOT-20809.vmdk\"]}", 
          "created": "2016-05-17T14:30:33+0900", 
          (中略)
          "name": "ROOT-20809", 
          "provisioningtype": "thin", 
          "quiescevm": false, 
          "serviceofferingdisplaytext": "1 CPU x 0.8 GHz / 1 GB RAM", 
          "serviceofferingid": "*************", 
          "serviceofferingname": "light.S1", 
          "size": 16106127360, 
          "state": "Ready", 
          "storagetype": "shared", 
          "tags": [], 
          "templatedisplaytext": "Root Disk: 15GB,(v2)", 
          "templateid": "*************", 
          "templatename": "CentOS 7.1 64-bit", 
          "type": "ROOT", 
          "virtualmachineid": "*************", 
          "vmdisplayname": "testS1-w", 
          "vmname": "testS1-w", 
          "vmstate": "Running", 
          "zoneid": "{augusta_zoneid}", 
          "zonename": "augusta"
        }
      ]
    }

    IDCFクラウドコンソールでも確認できます。 f:id:cshintoidcf:20160524172852p:plain

    (補足)CloudStack API実行環境について

    CloudStackAPI実行環境の構築方法はいくつかありますが、今回は以下の記事(Qiita)を参考にcsライブラリを使用しました。
    シンプルなCloudStack CLI/ライブラリ cs
    こちらも当社エンジニアが執筆しております♪

    詳細はQiitaの記事をご覧いただければと思いますが、環境構築方法を簡単にまとめますと次の様になります。

    • 使用環境
      • Mac OSX Yosemite10.10.5
    ①csライブラリインストール
    $which pip          //pipがインストールされているか確認
    $easy_install pip   //pipインストール
    $pip install cs     //csライブラリインストール

    ※pipはPythonを使用しているため 事前にPythonがインストールされているかご確認ください。


    ②.cloudstack.iniファイルの作成

    .cloudstack.iniファイルを新規に作成します。 .cloudstack.iniファイルに、次の様にIDCFクラウドアカウントのエンドポイント、APIキー、シークレットキーを記述して保存します。
    エンドポイント等は、IDCFクラウドコンソールの「コンピューティング」または「アカウント設定」>「API」で確認することができます。

    $ vi .cloudstack.ini
    [cloudstack]
    endpoint = END_POINT //IDCFクラウドAPIエンドポイント
    key = API_KEY         //IDCFクラウドアカウントのAPIキー
    secret = SECRET_KEY   //IDCFクラウドアカウントのシークレットキー


    ③動作確認

    APIを正常に実行できるかどうか listZonesを実行して確認してみます。
    以下は、.cloudstack.iniでエンドポイントを西日本リージョンに指定した場合の実行例です。
    正常に完了すると augustaゾーンの情報が取得できます。

    $cs listZones
    {
      "count": 1, 
      "zone": [
        {
          "allocationstate": "Enabled", 
          "dhcpprovider": "VirtualRouter", 
          "id": "{augusta_zoneid}", 
          "localstorageenabled": true, 
          "name": "augusta", 
          "networktype": "Advanced", 
          "securitygroupsenabled": false, 
          "tags": [], 
          "zonetoken": "********"
        }
      ]
    }


    もし、下記の様なエラーがでたら、エラー内容に記載されている場所に.cloudstack.iniを移動させて再度実行してみてください。

    $ cs listZones
    Config file not found. Tried /{Path to .cloudstack.ini}/.cloudstack.ini, /{Path to cloudstack.ini}/cloudstack.ini


    おわりに

    IDCFクラウドコンソール、CloudStack APIを用いた外部でボリュームアップロード方法をご紹介しました。
    IDCFクラウドへの移行等の際に是非ご活用ください。

    超高速NoSQLデータベースAerospikeを試してみた

    $
    0
    0

    お久しぶりです、ソリューションアーキテクト部の金杉です!

    今年度から、ソリューションアーキテクト部に新たにエバンジェリストグループができました。いろいろと情報を発信していく他、みなさまのお役に立てるコミュニティテンプレートの公開も順次していこうと思います。本日は、その第一弾、Aerospike Server Community Editionテンプレートの使い所を紹介しますー!

    Aerospikeってなに?

    社会がビッグデータやIoT革命を起こしている今、アプリケーションはより高品質なデータベースを必要としています。"高品質"には、リアルタイムで的確に答えを出せる速度と、より膨大なデータを処理できるスケーラビリティが求められています。Aerospikeは、そのようなニーズを満たす、速度とスケーラビリティを両立させた高性能なNoSQLデータベースサーバーです。

    www.aerospike.jp

    今回のブログでは、簡単に以下4点を紹介します!

    1. Aerospikeのすごいところ
    2. IDCFクラウドでAerospike Serverを立ててみる(500円でできるんだぜ)
    3. AMCから確認してみる
    4. C言語のクライアントとベンチマークツールを試してみる
    Aerospikeこんなにすごい!その1〜高パフォーマンス〜

    大量な情報から的確に答えを短時間で求められるシーンが増えている今、データベースの処理速度は常に課題となってきました。そこで従来のRDBMSとは別に、メモリ上で動作するNoSQLが登場しました。AerospikeもNoSQLの一種で、マルチスレッド、マルチコアのアドバンテージを存分に活かし、スペックによっては1台のノードで秒間100万TPSも処理できます。

    Aerospikeこんなにすごい!その2〜スケーラビリティ〜

    TB、PB単位でデータが増えて行く一方、メモリ上で動くNoSQLはスケールが常に課題になってきました。スケーラビリティを意識せずに開発が進んでしまうと、気づいた時点ではすでにスケールができず、一から作り直しになってしまう可能性もあります。Aerospikeはスケーラビリティを考慮した上設計されたため、ノードを追加すれば性能と容量がリニアで増加する仕様になっています。稼働中でも低負荷でノードの追加ができるため、データの増減が多いシステムには特に適しています。

    Aerospikeこんなにすごい!その3〜フラッシュ(SSD)最適化〜

    NoSQLはメモリ上で動かすのが一般的ですが、Aerospikeは業界初のフラッシュに最適化されたNoSQLソリューションです。RAM/SSDストレージアーキテクチャを採用しているため、RAM並みの高パフォーマンスを持ちながらもコストを低く抑えることができます。さらに、フラッシュ(SSD)をつかっているのでサーバーの台数も低く抑えることができます。 ご存知の方もいるかと思いますが、IDCFクラウドの新しいゾーンではオールフラッシュストレージが採用されているため、Aerospikeとの相性は抜群です!

    Aerospikeサーバーを作ってみよう

    Aerospikeは、現在二つの製品を提供しています。オープンソースのAerospike Community Editionと、追加機能、試験済・保証されたビルド、ホットパッチの提供、24時間サポートが含まれるAerospike Enterprise Editionです。両者の違いについてはこちらを参考にしてください。 今回は、IDCFクラウド上でコミュニティテンプレートとして公開されているCommunity Editionを試してみます。なんと、500円からお試しできます!

    Aerospikeの仮想マシンを作成

    それではまず、IDCFクラウドにログインします。左のメニューの「テンプレート」に入ると、マイテンプレートとコミュニティテンプレート二つのタブがあります。今回は、「コミュニティテンプレート」を見てみましょう。

    f:id:ykanasugi:20160706103519p:plain

    ここに、IDCフロンティアの公式パートナーや個人ユーザーの方々がシェアしたテンプレートが公開されています。上図の一番下に「Aerospike Server Community Edition」が見えたら、クリックします。発行者にある"IDCFエバジェリストグループ"がやけにかっこいいです(笑

    続いて、画面右側にある「仮想マシン作成」をクリックします。

    f:id:ykanasugi:20160706104704p:plain

    作成をするゾーンを選択し、下のサービス仕様同意のチェックボックスにチェックを入れます。最後に、「仮想マシン作成画面へ」をクリックします。ここからは普段の仮想マシン作成と同じ流れなので、割愛します。詳しくはご利用ガイドを参考にしてください!以下が、今回作成した仮想マシンのスペックです。

    項目
    ゾーンAugusta(西日本リージョン)
    マシンタイプLight.S1
    イメージAerospike Server Community Edition
    ボリュームそのまま
    SSH Key作成
    仮想マシン台数1
    ネットワークインターフェースそのまま
    詳細情報・仮想マシン名Aerospike-1
    詳細情報・プライベートIPアドレス自動設定

    作成が完了したら、仮想マシンへ接続するため「IPアドレス」の設定をする必要があります。 22番ポートのポートフォワードとファイアウォールの設定をしましょう。また、後ほどAMCへアクセスするため、8081番ポートも同じくポートフォワードとファイアウォールの設定をしておきましょう。

    ログインしてREADMEを読んでみよう

    では、早速作成したAerospikeサーバーにrootでSSHしましょう。仮想マシンへの接続方法は、こちらのガイドを参考にしてください。 ログイン後、rootのホームを見てみると、READMEがあります。READMEには簡単な使い方が記載されています。

    [root@AeroSpike-1 ~]# ls  
    README  aerospike  
    [root@AeroSpike-1 ~]# cat README  
    2016.5.9  
    ・本コミュニティテンプレートについて  
      このテンプレートは IDCフロンティア エヴァンジェリストG により構築提供されています。  本テンプレート内容についてのサポートは、IDCフロンティアおよびAerospike社からは提供されません。
    ・Aerospike Server Community Edition について  
      詳細やドキュメントについては、  
        http://www.aerospike.com/  
      または  
        http://www.aerospike.jp/  
      を参照ください。  
    ...(略)...

    Aerospikeを起動してみよう

    では、READMEの指示に沿って実行してみましょう。

    # 仮想マシンタイプによってAerospikeのスレッド数とキュー数を設定  
    # 各namespaceのメモリサイズを搭載メモリの半分に設定します  
    [root@AeroSpike-1 ~]# /root/aerospike/setconfig.sh  
    Config file path: /etc/aerospike/aerospike.conf  
    Backup file path: /etc/aerospike/aerospike.conf.20160705181650  
    Number of cores on the host: 1  
    Memory size on the host [GB]: 1  
    Set memory-size: 512M  
    
    # Aerospikeの起動および自動起動の設定
    [root@AeroSpike-1 ~]# service aerospike start  
    Increasing read socket buffer limit (/proc/sys/net/core/rmem_max): 124928 -> 15728640  
    Increasing write socket buffer limit (/proc/sys/net/core/wmem_max): 124928 -> 5242880  
    Starting and checking aerospike:                           [  OK  ]  
    [root@AeroSpike-1 ~]# chkconfig aerospike on  
    
    # AMCの起動および自動起動の設定
    [root@AeroSpike-1 ~]# service amc start  
    Starting AMC....  
    AMC is started.  
    [root@AeroSpike-1 ~]# chkconfig amc on  

    これで、初期設定は一通り終わった状態になります。

    AMCにアクセス

    AMCとはAerospike Management Consoleの略で、ウェブベースでAerospikeのクラスタの管理ができるツールです。 READMEに記載がある通り、AMCへのアクセスはブラウザよりhttp://<グローバルIPアドレス>:8081/で接続ができます。 ※もし繋がらない場合は、8081番のポートフォワードとファイアウォールの設定がされているか再度確認してみてください。

    f:id:ykanasugi:20160713124935p:plain

    接続ができたら、ノードを指定する入力欄がでますので、ここで127.0.0.1もしくは先ほど作成したサーバーのプライベートIPアドレスを入力してください。入力が完了したら、「Connect」をクリックします。

    f:id:ykanasugi:20160713125537p:plain

    これで、今のAerospike Clusterの状態が見れるようになりました!

    Aerospikeを使ってみよう

    Aerospikeの大きな特徴の一つとして、"開発者に優しい"が挙げられます。Aerospikeは下記クライアントライブラリを提供しているので、様々な環境から簡単に使うことができます。

    Java Client
    C# Client
    C Client
    Go Client
    libevent Client
    Node.js Client
    Perl Client
    PHP Client
    Python Client
    Ruby Client
    Erlang Client

    詳しくは、公式ページを参考してみてください。好きな言語を選択し、GET STARTEDから試してみてください。

    http://www.aerospike.com/docs/client

    コマンドラインを実行してみよう

    IDCFクラウドが提供するAerospike Server Community Editionでは、コマンドラインのクライアントが含まれています。ここではascliコマンドを使って、Aerospikeでデータのputとgetを試してみましょう。

    [root@AeroSpike-1 ~]# ascli put test demo 1 '{ "name": "Morio", "age": 1 }'  
    [root@AeroSpike-1 ~]# ascli get test demo 1  
    {"name": "Morio", "age": 1}  

    これで、先ほどputしたデータがgetできていますね。では、AMCをもう一度みてみましょう。

    f:id:ykanasugi:20160713161909p:plain

    まず、Cluster Throughputのセクションでreadとwriteが発生しているのがリアルタイムで確認できます。それぞれがgetとputを実行した時のThroughputになります。 そして、下のNodesセクションの「RAM」の部分でも、使用量が100Bに増えています。先ほどputした{ "name": "Morio", "age": 1 }がきちんと入っていますね。

    ベンチマークをかけてみよう

    コマンドライン以外に、Aerospike Server Community Editionでは簡単なベンチマークツールも提供されています。

    [root@AeroSpike-1 ~]# cd /root/aerospike/package/aerospike-client-c-4.0.4.el6.x86_64/benchmarks  
    [root@AeroSpike-1 benchmarks]# make run  
    ./target/benchmarks -h 127.0.0.1 -p 3000  
    hosts:          127.0.0.1  
    port:           3000  
    ....  

    これでベンチマークが始まります。では、AMCをもう一度みてみましょう。

    f:id:ykanasugi:20160713171639p:plain

    これで、デフォルトの値を使ったベンチマークが始まります。また、スレッド数やkeyの数を指定してベンチマークをかけることもできますので、詳しくはこちらのページを参考してください。

    まとめ

    これで、Aerospike Server Community Editionを一通り試してみました。AMCや豊富なライブラリはとても魅力的ですし、IDCFクラウドのオールフラッシュストレージ上で動かすAerospikeは特に速いので、大規模なNoSQLソリューションを使いたい場合は、ぜひAerospikeを検討してみてください!

    利用明細&ビリングAPIでIDCFクラウドの利用状況を把握しよう

    $
    0
    0

    使いたいときに使いたいだけリソースを使用できるのはクラウドの魅力ですが、無駄なく効率的に利用するためには利用状況を把握しておく必要があります。今回はIDCFクラウドの利用状況を把握するために、利用明細とビリングAPIを活用する方法をご紹介します。

    利用明細を見てみよう

    まずは利用明細を見てみましょう。https://console.idcfcloud.com/billing/からみることができます。 (下図のように右上のアイコンから「ビリング」を選んでも良いです。)

    f:id:asasaki:20160823144700p:plain

    利用明細では下図のように、各月の明細を確認することができます。 今月分については昨日までの値が反映されており、今月どのくらい使っているか確認できます。

    f:id:asasaki:20160823144813p:plain

    各項目をクリックするとスペックや個数など詳細な情報をみることができます。

    f:id:asasaki:20160823145058p:plain

    CSV形式の利用明細を活用する

    各仮想マシン毎の明細を確認したい、集計方法を変えたいといった場合はCSV形式の利用明細が便利です。 CSV形式の利用明細は右上のボタンからダウンロードできます。

    f:id:asasaki:20160823145329p:plain

    ExcelやGoogleスプレッドシートへ貼り付ける扱いやすくなります。

    f:id:asasaki:20160823145559p:plain

    CSV形式の利用明細はポータル画面上よりも詳細です。ポータル画面上では表示されないリソースの表示名や作成・削除日の情報も含まれています。

    CSVの各列の意味は以下の通りです。

    明細画面のエクスポートCSVの各項目の意味を教えて下さい | IDCFクラウド

    列名説明
    Regionjp-eastリージョン
    ServiceNameCloud Computingサービス名(IDCFクラウド、オブジェクトストレージなど)
    ZoneNamenewtonゾーン名
    CategoryVirtualMachineリソースのカテゴリー(仮想マシン、ボリューム、IPアドレスなど)
    Menulight.S1商品名(仮想マシンのスペック、トラフィックの種類など)
    ResourceDisplayNamevm01リソースの表示名
    StartDate2016-08-01リソース使用量の算出開始日
    EndDate2016-08-01リソース使用量の算出終了日
    Usage39.05944442749リソースの使用量
    Allocated216リソースの確保時間。単位は時間
    Running39.05944442749仮想マシンの起動時間(CategoryがVirtualMachine以外の場合は0)
    Stopped176.94055557251仮想マシンの停止時間(CategoryがVirtualMachine以外の場合は0)
    Amount15税抜き請求額
    Tax1消費税
    Net16税込み請求額

    ピボットテーブルなどで集計すると利用状況がよりわかりやすくなります。 下図はGoogleスプレッドシートのピボットテーブルで、ポータル画面と同様の表示になるようリージョン(Region)、サービス(ServiceName)、カテゴリー(Category)ごとに税抜き請求額(Amount)を合計したものです。

    f:id:asasaki:20160823150258p:plain

    ビリングAPI+Googleスプレッドシートで日々のリソース利用の変化を把握する

    ビリングAPIで利用明細を取得する

    ここまで、利用明細から各月の利用状況を把握できることをみてきました。 本項ではもう一歩踏み込んで月内でのリソース使用量・課金額の変化を調べてみましょう。

    利用明細に記載されている値は月初〜月末(今月分は昨日)までの合計使用量・課金額であるため、それだけをみても月内の変化はわかりません。しかし、今月分の利用明細に昨日までの値が反映されていることから、毎日利用明細を取得すれば値の変化からリソース使用量・課金額の変化がわかります。

    しかし、毎日利用明細をダウンロードしてExcel等に読み込ませるのは大変です。このように定期的なタスクがある場合はAPIを使って自動化できると便利です。IDCFクラウドには利用明細を取得するためのビリングAPIがあるので、これを使ってみましょう。

    ビリングAPIを使うと、次のように指定した月の利用明細をJSON形式で取得することができます(シグネチャの生成方法などの詳細はドキュメント)を参照してください。)。レスポンスのdataの配列の中にCSV形式の利用明細の行に対応するオブジェクトが入っています。

    $ curl -n https://your.idcfcloud.com/api/v1/billings/2016-04\-G\-dformat=json \-H"X-IDCF-APIKEY: SrE5Ceeb1Q9MPl0yM0qbd3D3_CCpLWqnbcruMBj2WyK03Q6r0l6YJhIdCsYUmB7VM8AFttoqsxc3FxQrsAh8VQ"\-H"X-IDCF-Expires: 1437142261"\-H"X-IDCF-Signature: EenNFoNxnYEQVGW279XcQ+tBgwFPpMmTkDZQvKryIZg="
    {"meta": {"account_id": 71000090048,
        "billing_period_start_at": "2016-04-01",
        "billing_period_end_at": "2016-04-30",
        "invoice_no": "B7112834501",
        "taxable_amount": 43608,
        "tax": 3484,
        "total": 47092,
        "updated_at": "2016-04-07T10:03:00+0900"
      },
      "data": [{"Allocated": 42.0,
          "Amount": 42,
          "Category": "example",
          "Enddate": "2016-02-01",
          "Menu": "highio.5XL128",
          "Net": 42,
          "Region": "jp-east",
          "ResourceDisplayName": "ROOT-2622",
          "Running": 42.0,
          "ServiceName": "Cloud Computing",
          "StartDate": "2016-02-01",
          "Stopped": 42.0,
          "Tax": 42,
          "Usage": 42.0,
          "ZoneName": "tesla"
        }]}

    Google Apps ScriptとビリングAPIで利用明細をスプレッドシートに取り込む

    ビリングAPIの実行用に新しく仮想マシンを用意しても良いですが、今回はGoogleが提供しているスクリプト環境であるGoogle Apps Scriptを使って実行しGoogleスプレッドシートに利用明細を取り込んでみます。Google Apps ScriptはGoogleの環境上で動くので新しく仮想マシンを用意することなくビリングAPIを実行することができます。さらに、実行されていることがわかるよう実行時にSlackで請求額を通知するようにしてみます。

    Google スプレッドシートでデータ取り込み用に新しくスプレッドシートを作成します。(名前は何でもかまいません。)作成したスプレッドシートを開きID(URL https://docs.google.com/spreadsheets/d/*************/edit#gid=0のアスタリスクの部分)を控えて下さい。

    SlackにはIncoming Webhooksという仕組みを使って通知を行います。Slackにログインしている状態でhttps://my.slack.com/services/new/incoming-webhook/にアクセスしメッセージを投稿するチャンネル等の設定を行って生成されるWebhook URLを控えてください。どこから通知が送信されたのかわかりやすいよう名前やアイコンも変えておくとよいでしょう。

    次に、https://script.google.comにアクセスします。 空のプロジェクトが既に作成されているので、元からあるコードを消して以下のコードを貼り付けて下さい。 はじめの3行のAPIKEYSECRETSPREADSHEET_IDSLACK_WEBHOOK_URLをIDCFクラウドのAPIキー、シークレットキー(https://console.idcfcloud.com/user/apikeyで確認できます)、控えておいたスプレッドシートのID、SlackのWebhook URLに書き換えてください。

    var APIKEY = "IDCFクラウドのAPIキーをいれてください";
    var SECRET = "IDCFクラウドのSECRETキーをいれてください";
    var SPREADSHEET_ID = "GoogleスプレッドシートのIDをいれてください";
    var SLACK_WEBHOOK_URL = "SlackのWebhookのURLをいれてください";
    
    function getThisMonth() {var date = newDate();
      return date.getFullYear() + "-" + ("0" + (date.getMonth()+1)).slice(-2);
    }function getToday() {var date = newDate();
      var this_month = date.getFullYear() + "-" + ("0" + (date.getMonth()+1)).slice(-2);
      return this_month + "-" + ("0" + date.getDate()).slice(-2);
    }// Billing APIで利用明細を取得function getUsageData(month) {var query_string = "format=json";
      var expiration_seconds = 30;
      
      var date = newDate();
      var endpoint_uri = "/api/v1/billings/" + month;
      var expiration = (Math.floor(date.getTime()/1000) + expiration_seconds).toString();
      var message ="GET" + "\n" + endpoint_uri + "\n" + APIKEY + "\n" + expiration + "\n" + query_string;
      var signature = Utilities.base64Encode((Utilities.computeHmacSha256Signature(message, SECRET)));  
      var url = "https://your.idcfcloud.com" + endpoint_uri + "?" + query_string;
      var params = {"headers": {"X-IDCF-APIKEY": APIKEY,
          "X-IDCF-Expires": expiration,
          "X-IDCF-Signature": signature
        }}return JSON.parse(UrlFetchApp.fetch(url, params).getContentText())["data"];
    }// 利用明細に本日の日付を表すDate列を付加してGoogleスプレッドシートに書き込むfunction sendUsageDataToSpreadsheet(ss, sheet, data) {var this_month = getThisMonth();
      var today = getToday();
      var keys = ["Region",
        "ServiceName",
        "ZoneName",
        "Category",
        "Menu",
        "ResourceDisplayName",
        "StartDate",
        "EndDate",
        "Usage",
        "Allocated",
        "Running",
        "Stopped",
        "Amount",
        "Tax",
        "Net"];
      if (!sheet) {
        sheet = ss.insertSheet(this_month, 0);
      }if (sheet.getLastRow() == 0) {
        sheet.appendRow(["Date"].concat(keys));
      }
      data.forEach(function(resource) {var values = [today].concat(keys.map(function(key) {return resource[key]; }));
        sheet.appendRow(values);
      });
    }// Slackに現在の請求額を投稿するfunction postTotalAmountToSlack(webhook_url, data) {var total_amount = 0;
      data.forEach(function(resource) {
        total_amount += resource["Amount"];
      });
      var message = "今月分の請求額は現在" + total_amount + "円です";
      var params = {"method": "post",
        "payload": 'payload=' + JSON.stringify({"text": message})
      };
      UrlFetchApp.fetch(SLACK_WEBHOOK_URL, params)
    }function main() {var this_month = getThisMonth();
      var ss = SpreadsheetApp.openById(SPREADSHEET_ID);
      var sheet = ss.getSheetByName(this_month);
      
      var data = getUsageData(this_month);
      sendUsageDataToSpreadsheet(ss, sheet, data);
      postTotalAmountToSlack(SLACK_WEBHOOK_URL, data);
    }

    貼り付けると下図のようになります。(キー、IDはご自分の環境の値に書き換えて下さい。)

    f:id:asasaki:20160824140432p:plain

    適当な名前をつけて保存し、メニューから「実行 > main」を選択して実行します。スプレッドシートの操作と外部サービスへの接続の許可がもとめられたら許可してください。完了するとスプレッドシートの新しいシートに利用明細の内容が入力され、Slackに請求額が通知されます。

    最後にトリガーを設定し1日1回実行されるようにします。メニューから「リソース >現在のプロジェクトのトリガー」からトリガーを追加し、下図のように「日タイマー」で適当な時間に実行するようにしておけばOKです。

    f:id:asasaki:20160824140629p:plain

    これで自動で毎日今月分の利用明細がスプレッドシートに追記、請求額がSlackで通知されるようになりました!

    f:id:asasaki:20160824143936p:plain

    利用明細がたまってきたらピボットテーブルなどで集計しグラフを描いてみると、日々の利用状況の変化が一目瞭然となります。 例えば、下図では8/10〜8/18まで仮想マシンは停止中で課金されていないのですが、ボリュームが毎日33-35円程度課金されていることがわかります。8/19以降は仮想マシンも毎日30円程度課金されていることから新しく仮想マシンを作成したか既存の仮想マシンを起動したこともわかります。

    f:id:asasaki:20160823155155p:plain

    請求額に占める割合が大きいボリュームについてもう少し詳しく見てみましょう。Menu列とUsage列を使うとRoot Disk、Data Diskごとの使用量を見れます。8/10〜8/17まで1日で使用量がData Diskの値が480GB-Hour、Root Diskの値が360GB-Hour増えていることから、24時間で割るとData DiskとRoot Diskがそれぞれ20GB、15GB存在していたことがわかります。その後、Data Diskが不要であったことから削除するとその後は値が増えなくなり課金も止まっています。このように値の変化から無駄を発見し対応していくことで、より効率的にクラウドを使うことができます。

    f:id:asasaki:20160823162550p:plain

    利用明細をみるときの注意点

    最後に利用明細やビリングAPIの結果をみるときに注意点について少し触れておきましょう。

    利用明細やビリングAPIはあくまでも課金情報を提供するためのものなので、課金対象外のリソースの使用量が含まれていなかったり、計算方法がサービスにより異なることがあります。

    例えば、IDCFサービス間のトラフィックについては課金対象外となるため合計使用量(Usage)には含まれていません。また、多くのリソースでは毎時の使用量を合計した合計使用量を課金に利用していますが、平均使用量を課金に用いるオブジェクトストレージのストレージの料金のような例外もあります。このようなリソースでは合計使用量(Usage)の値も課金に使用される値(オブジェクトストレージの例では平均使用量)になるので注意が必要です。各リソースで使われている単位や請求額の計算方法については各サービスのドキュメントを参照してください。

    おわりに

    IDCFクラウドの料状況を利用明細とビリングAPIを使って把握する方法をご紹介しました。 コストの削減やリソース管理の効率化にお役にたてば幸いです。

    ILBを使ってWebサーバーをバランシング!構成事例もご紹介

    $
    0
    0

    はじめまして!ソリューションアーキテクト部の河合です。

    今回は、7月に正式リリースされたサービスILBを使ってWebサーバー3台のバランシングをしてみたいと思います!また、ILBを用いた構成の事例もあわせてご紹介します。

     

     

    IDCFクラウドでは、標準提供として仮想ルーターのロードバランサー機能があります。

    こちらの機能ではポート単位によるシンプルな負荷分散環境を構築することができますが、より高性能なロードバランサーが欲しい!というケースもありますよね。

    たとえば、

    ・イベントで突発的に増えるアクセスをさばきたい

    ・同時セッション数が多い

    ・SSL証明書をロードバランサーで処理したい

    などなど。

     

    ILBには次の3つの特長があり、こういったお悩みを解決することができます!

    1. 最速60秒でロードバランサーがオートスケール

    2. SSL証明書のターミネーションが可能

    3. 標準提供のロードバランサーと比べて約10倍の性能 

    詳しい性能については、ILBのサービスサイトをご覧ください。

    では、さっそくILBを使って分散環境を構築してみましょう!

     

    ILBを用いた負荷分散環境の構築

    今回はWebサーバー3台をバランシングします。構成は次の通りです。

     

    f:id:skawai488:20161020144905p:plain

     

    この構成図のようにILBは仮想ルーターと独立して動くので、すでに仮想ルータ―を使っている場合も影響なく導入することができます。また、Webサーバー側でデフォルトゲートウェイの設定変更も必要なく、シームレスに接続することが可能です。

     

    バランシングの対象となるWebサーバー3台ですが、今回はIDCFクラウドの標準提供テンプレート「AppTemplate CentOS 6.5 64-bit」を使って構築しています。

    AppTemplateを使うとLAMP環境が簡単に構築できるので、こういったサービスを試す環境を構築する際などに便利ですね!詳しい作成方法はこちらをご参照ください。

     

    それではILBの設定を行っていきましょう。まずはIDCFクラウドのコンソール画面からILBを選択し、有効化されていない場合はポップアップが表示されるので「有効にする」をクリックします。

    f:id:skawai488:20161020163608p:plain

     

    ILBの設定画面が表示されるので、右上の「ILB作成」をクリックしてロードバランサーを作成します。 

    f:id:skawai488:20161020164036p:plain

     

    ここから設定に入ります。ILBを作成するネットワークを選択し、任意のFQDNを記入します。ILBはDNSラウンドロビンでActive/Activeの冗長構成を実現しているので、外部からのアクセス先はIPアドレスではなくFQDNとなります。

    f:id:skawai488:20161020170434p:plain

     

    続いて、Configurationを設定します。

    まず「プロトコル」と「ポート番号」を設定して「+」をクリックします(下図①)。これは外部とILB間の通信に対する設定です。今回はプロトコルをHTTP、ポート番号を80としています。

    するとHTTPの設定項目が開くので、次に バランシング対象の仮想マシンを指定します。

    指定方法として「仮想マシンを指定」をクリック(下図②)し、対象の仮想マシンを選択します。右側の「+」をクリック(下図③)すると設定が追加されます。

    今回はWeb-1、Web-2、Web-3を選択しました。

    f:id:skawai488:20161020174115p:plain

    ここで2点補足です。

    1)「IPアドレスを入力」ではグローバルIPが対象となります

    2)仮想マシンを選択する際に「ポート番号」の項目がありますが、これはILBと仮想マシン間の通信で使用されます

     

    また、ILBではさらに詳細な設定もできます!

    指定した仮想マシン一覧の右下に「詳細設定」というボタンがあり、クリックすると詳細な設定項目が表示されます。

    最初の項目「バックエンドプロトコル」では、ILBと仮想マシン間の通信プロトコルを設定することができます。

    f:id:skawai488:20161020180107p:plain

    今回はすべてデフォルトの値で構築しますが、このようにバランシングの方法からSorryサーバーの指定まで、環境や目的に合わせてカスタマイズすることができます。標準提供のロードバランサ―よりも機能が充実していますよね!

    必要な設定項目を入力し、ページ下部の「確認画面へ」をクリックして作成します。ILBのステータスが「Running」になったら作成完了です!

    f:id:skawai488:20161020182025p:plain

     

    では、指定したFQDNをブラウザのアドレスバーに入力して動作を確認してみましょう。

    f:id:skawai488:20161020201309p:plain

    バランシング先として指定している仮想マシンWeb-1のページが表示され、アクセス可能なことが確認できました。

    続いてブラウザのリロードをすることでWeb-1、Web-2、Web-3のページが切り替わることも確認してみましょう。

    f:id:skawai488:20161020201336p:plain

    作成したILBがしっかり動作していますね!以上でILBを用いた負荷分散環境の構築は終了です。正式サービス時は、最後にDNSの設定でサービス用ドメインとILBのFQDNをCNAMEしましょう。

    今回の構成で仮想ルーターとILBを同時に利用していますが、仮想マシン側の設定は特に必要ありません。デフォルトゲートウェイは従来通り仮想ルータ―を向いています。通信の流れは以下のようになります。

    ・外部からILB宛ての通信は戻りの通信もILB経由

    ・仮想マシンから外部への通信は仮想ルータ―経由

     

    また、オプションとして「Firewallグループ」を指定することもできます。これは外部からILBの通信に対して、通信の許可/拒否を制御できる機能です。ロードバランサ―の作成時に設定することもできますし、作成後のILBに追加で設定することも可能です。

     

    ILBを用いた事例紹介

     冒頭でご紹介した通りILBはサーバーのトラフィック量に応じて自動でスケールするサービスなので、ゲームなど急なイベントでアクセス増が見込まれるシステムの構成に最適です!そこで、今回はゲーム会社の事例をご紹介したいと思います。

    某ゲーム会社構成例

    f:id:skawai488:20161025162429p:plain

    こちらはネイティブアプリで、DAU50万を想定した環境です。この構成ではフロントのWebサーバー100台をILBでバランシングしており、Photonのroomサーバー100台以上の接続もILBを通して通信しています。ILBの最大性能は30,000tps*1ですので、ボトルネックにならず負荷分散を実現しています。また、SSL終端もしているので仮想マシン側の負荷が軽減されています。

    同時に、アプリの配信にはIDCFクラウドのコンテンツキャッシュを利用することで、サーバー負荷と帯域逼迫への対策も行っています。

     

    おわりに

    ここまでILBを用いた負荷分散環境の構築と事例をご紹介してきました。現構成の設定に影響なく導入できて設定もとても簡単でしたね!SSL終端ができたりヘルスチェックをカスタマイズできるなど、ユーザーの利用用途に合わせた使い方ができるのも魅力のひとつですので、ぜひこの機能性を試してみてはいかがでしょう?

    ここまでお付き合いいただき、ありがとうございました!

    *1:計測ツール:Apach Bench 2.3 / リクエスト回数:100,000回 / 同時コネクション数:2,000 / ファイルサイズ:32KB

    AerospikeをIDCFクラウドで動かすとこんなに良い件

    $
    0
    0

    こんにちは、エバンジェリストの藤城(@tafujish)です。

    以前にAerospikeのMeetupで登壇させてもらったときに、ブログ書く書く言って長らく書けていなかったのですが、金杉がお試し記事を書いてくれました。

    blog.idcf.jp

    Aerospikeって何という方はそちらを読んでいただき、ここではAerospikeをIDCFクラウド上で使うのがなぜ適しているのかやベストプラクティスを紹介したいと思います。

    なぜ、AerospikeをIDCFクラウド上で動かすのか

    1) オールフラッシュストレージ

    Aerospikeのデータの格納方法として、超高速にトランザクション処理できるがデータは揮発な「インメモリ」と、データをディスクに格納することで不揮発な「パーシステンス」の両方が利用できます。
    その一方で、そもそもAerospikeは高速なトランザクションが得意で、なおかつSSDに最適化されていますので「パーシステンス」でも十分高速です。

    IDCFクラウドは、オールフラッシュストレージを採用していますので、ディスクI/Oとしても高速です。そのため、「パーシステンス」で利用したとしても、高速な処理かつデータは不揮発で利用可能です。

    2) 高速なCPU/メモリ

    Aerospikeの処理にはディスクI/OだけでなくCPUとメモリがもちろん使用されます。Aerospikeの特徴として、スケールアップすることでAerospikeの処理性能を引き上げることができます。

    もちろんIDCFクラウドはCPUとメモリの処理速度としても高速です。高性能な仮想化ハイパーバイザーとリソースの最適配置により高性能かつ安定した性能を提供していますので、Aerospikeの高性能を活かすことが可能です。

    3) 高帯域の内部ネットワーク

    ディスクI/O、CPU、メモリが高速になってくると、ボトルネックがネットワーク帯域になってきます。実際にAerpspikeをオンプレミスで利用しているユーザーの話でも1GbpsのNICがボトルネックになるという話がありました。

    IDCFクラウドでは、通常の仮想マシンであれば2Gbps、専有タイプの仮想マシン(3XL128や5XL128)であれば5GbpsのNIC帯域が利用できネットワークボトルネックを回避可能です。

    4) マルチキャスト対応

    Aerospikeの特徴のひとつとして自律的な動作があります。Aerospikeの各ノードが自動構成されクラスタが組まれ、故障時の切り離しや、クラスタへ戻したときのデータ再配置も自動で行われます。通常、この各ノード間のやりとりはマルチキャスト通信が利用されています。

    IDCFクラウドのネットワークでは、マルチキャスト通信が利用可能です。そのためAerospikeのクラスタは、ノードを起動するだけで、自動でクラスタが構築されスケールアウトしていくことが可能なため、簡単に運用することができます。

    Aerospike on IDCFクラウドのベストプラクティス

    それでは、実際にIDCFクラウド上でAerospikeを動かすときに性能を最大限活用するためのベストプラクティスを紹介します。

    ●リージョン/ゾーン

    高速なディスクI/Oが利用できるため、オールフラッシュストレージを採用しているゾーンを利用してください。
    具体的には、東日本リージョンのradian、newtonゾーン。
    西日本リージョンのaugusta、monsteraゾーン。
    またはこれらより新しいゾーンでオールフラッシュが利用可能です。これらのゾーン上で、仮想マシンを作成すると、そのストレージは特別な操作不要ですべてフラッシュとなります。

    最新の対応状況は次のページで確認できます。
    https://www.idcf.jp/cloud/spec/region_zone.html

    同じゾーン内でAerospikeの仮想マシンを作成すると、同じネットワークに属しマルチキャストにより自動でクラスタが構成されます。

    ●ネットワークインターフェース

    通常、仮想マシンを作成するだけで、高いパケット処理性能・高帯域なNICが提供されます。
    RSSに対応しているためRPS/RFSの設定も不要ですのでそのままお使いください。

    ただし、ISOからOSをインストールした場合は、その限りではないのでご注意ください。一応、確認方法ですが、

    $ ethtool -i eth0
    driver: vmxnet3
    ~以下、略~
    

    driverがvmxnet3になっていればそのままご利用ください。
    もし、e1000となっている場合は、テンプレートをエクスポート/インポートしNICを再設定するかRPS/RFSの設定を入れてください。

    ●DATAディスクのウォームアップ

    作成されたDATAディスクは、シンプロビジョニングで作られただけなので使用領域を事前に確保して、オーバーヘッドを減らしておきます。例えば、次のように構築前にゼロデータでディスク容量一杯まで埋めておきます。

    $ sudo dd if=/dev/zero of=/dev/sdb bs=1M
    dd: writing `/dev/sdb': デバイスに空き領域がありません819201+0 records in819200+0 records out858993459200 bytes (859 GB) copied, 2078.7 s, 413 MB/s

    2つ目のDATAディスクがあれば/dev/sdcといったように、利用するデバイスすべてに実施してください。

    ●ストレージエンジンの設定

    Aerospikeの設定(標準で/etc/aerospike/aerospike.conf )にてストレージエンジンの設定をパーシステンスにする際、大きく2パターンあります。

    storage-engine device { 
        file /aero/test.dat 
        filesize 64G 
    }

    こちらの設定では、ファイルシステム上にAerospikeのデータファイルを置くので取り回しが簡単です。
    一方、複数のデバイスを並列に扱うことができ、かつファイルシステムをバイパスすることで性能をスケールさせることができる設定もあります。

    storage-engine device { 
        device /dev/sdb 
        device /dev/sdc 
        write-block-size 1024K 
    }

    IDCFクラウドでは、ストレージの種類がひとつだけなので、shadow device(device /dev/sdb /dev/sdcと一行で書く)として階層を設ける必要はありません。接続されているデバイス(DATAディスク)を行を分けて書いてください。

    インメモリとパーシステンスのベンチマーク

    最後にベンチマークをして、インメモリ(揮発)とパーシステンス(不揮発)の性能差を確認しましょう。

    Aerospikeのサーバーは、IDCFクラウドのnewtonゾーン(オールフラッシュ)にて、Standard.X16(4コア/16GBmem)のCentOS6.7にて構築。サーバーとは別のマシンからベンチマークを実行。ベンチマークはAerospikeのCクライアント標準のものを利用し、次のとおり実行しています。結果はAMC上のスループットの値です。

    ・./benchmarks -h<IP Address>-k4000000-o S:2048-w RU,50-z64

    Aerospikeサーバーを1台のシングル構成と、3台でクラスタ構成でのベンチマーク結果が次の通りです。

    f:id:tafujish:20161116210720p:plain

    もちろんの結果ですが、パーシステンスよりインメモリの方がより高速な結果でした。ただ、ここで言いたいのは、インメモリとパーシステンスとの性能差が小さいことです。オールフラッシュが活き、パーシステンスでも十分に高速なので、データが消えるインメモリをわざわざ使わなくても良いのではないでしょうか。

    一点補足しておくと、シングル構成と3ノードクラスタ構成で、スコアにほぼ差が出ていないですが、クラスタ構成によりデータレプリケーションが生じるのでその分のオーバーヘッドがあるため台数分の性能になっていません。4台以上にノードを増設していくと、スコアもどんどん上がっていきます。このあたりのスケール性能は、次のAerospikeのMeetupで話させていただいた通りです。

    www.slideshare.net

    まとめ

    Aerospikeはその高性能かつ簡単にスケールできることがメリットのNoSQL DBですが、IDCFクラウドの構成や性能と相性がよいです。また、IDCFクラウドのオールフラッシュストレージの基盤を活用できるのでパーシステンスでの高性能に利用することが可能です。
    Aerospikeの事例紹介やEnterprise版の紹介なども可能ですので、これからAerospikeを検討するという場合も、IDCFまでお問い合わせください


    IDCFクラウドでセカンダリIPを取得する方法

    $
    0
    0

    こんにちは!ソリューションアーキテクト部の金杉です。よくお客様からご質問をいただくので、本日はIDCFクラウドでセカンダリIPを取得する方法について紹介しようと思います。

    はじめに

    1つのネットワークインターフェイスに複数IPを割り当てたいというケースは多々ありますよね。例えばバーチャルホストを使って同じサーバーで複数ドメインを運営する時や、Virtual IP (VIP)を用いて冗長構成を実現したい時など、様々なシーンでセカンダリIPが必要になってきます。このような技術を一般的に"IPエイリアス"と呼び、元から割り当てられているIPと追加で取得したIPをそれぞれ"プライマリIP"、"セカンダリIP"と呼んだりします。

    IDCFクラウドではセカンダリIPの取得が可能です。このブログではIDCFクラウドのサーバーでセカンダリIPの取得およびセカンダリIPアドレスをグローバルIPアドレスと紐づける方法を紹介します。

    セカンダリIP取得の2つのパターンと手順

    セカンダリIPの取得には以下2通りのパターンがあります。パターンによって、手順が異なりますのでご注意ください。区別がつかない場合は、図1を参考にしてみてください。

    パターン1 (手順1) セカンダリIP経由でインターネットと通信する場合
    パターン2 (手順2) セカンダリIP経由でインターネットと通信しない場合

    f:id:ykanasugi:20170223115939p:plain
       ▲図1 セカンダリIP取得の際の2つのパターン

    パターンによって手順が異なる理由は、IDCFクラウドのネットワーク仕様です。IDCFクラウドでは、コンピューティング環境とインターネットの間に仮想ルーターが存在します。対象のセカンダリIPがインターネットと通信をする場合、仮想ルーターを経由するので、セカンダリIPとグローバルIPを紐づける必要があります。一方、セカンダリIPがインターネットと通信をする必要がない場合、これらの操作が不要になります。なので、パターンによってセカンダリIPを取得する手順を両方紹介します。

    仮想マシンのデプロイに関してはこちらを参考にしてください。

    方法① インターネットと通信する場合

    今回は、Light.S1(1コア, 1GBメモリ)の仮想マシンを使ってセカンダリIPを取得していきます。ホスト名はsecondary-ip-test、OSはCentOS 6.8を使用します。プライマリIPは10.32.0.122がDHCPで設定されています。

    使用できるIPアドレスの確認

    セカンダリIPとして使用できるIPアドレスは限られているので確認をします。IDCFクラウドコンソールより、左メニューバー「ネットワーク」、ターゲットのネットワーク名、「IPアドレス一覧」をクリックします。

    f:id:ykanasugi:20170228101049p:plain

    DHCP範囲内(CIDRの前半)のIPアドレスが選択できます。つまり、このテーブルに表示されている割当済みのIPアドレスと、「割当範囲外」のIPアドレスを除いたすべてのIPアドレスがVIPとして割当可能です。セカンダリIPはDHCPもしくはスタティックで取得することが可能です。今回は10.32.0.100を指定して使います。

    TIPS: DHCP範囲内のIPを選択する理由は?
    今回、対象のセカンダリIPアドレスとグローバルIPアドレスを紐づける必要があります。紐づけるにはAPI経由でポートフォワードもしくはスタティックNATの2つの方法があるのですが、いずれも仮想ルーターに対しての操作になります。仮想ルーターに対してIPアドレス関連の操作を行う場合、その対象となるIPアドレスは仮想ルーターが認識できる必要があります。DHCP範囲外のIPアドレスは仮想ルーターでは認識できないので、ここではDHCP範囲内のIPアドレスを選択する必要があります。(でないと、グローバルIPアドレスと紐づけることができません。)

    セカンダリIPアドレスの取得

    手順①ではセカンダリIPアドレスの取得はCloudStack API経由で行います。IPアドレスの値は、先ほど確認した10.32.0.100をスタティックで付与します。APIに関しては、API Referencesをご参照ください。

    IPアドレスを付与するに必要なコマンドはaddIpToNicです。必要なパラメーターおよび取得方法は以下になります。

    パラメーター取得方法取得の際の注意点
    nicidlistNics取得にあたってvirtualmachineidが必要です。virtualmachineidはlistVirtualMachinesで取得できます
    ipaddress指定今回は10.32.0.100を入れます。指定しない場合はDHCPで付与されます

    IPアドレスの取得が完了した後、グローバルIPとセカンダリIPをenableStaticNatコマンドでスタティックNATします。必要なパラメーターおよび取得方法は以下になります。
    ※通常のスタティックNATの設定はIDCFクラウドコンソールからもできますが、今回はセカンダリIPを紐づけるため、操作はAPI経由で行う必要があります。

    パラメーター取得方法取得の際の注意点
    ipaddressidlistPublicIpAddresses特になし
    virtualmachineidlistVirtualMachines特になし
    vmguestip指定先ほど指定した10.32.0.100を入れます。DHCPで割り当てた場合もIPアドレスを入力する必要があります

    それでは、これらのコマンドを使って実際に操作をしてみましょう。

    コマンドラインツールのインストール
    APIを利用するにあたって、コマンドラインツールのインストールが必要になります。インストールするサーバーは、Pythonが動けばどのサーバーでもかまいません。APIのGetting Started ガイドに沿って「簡単な使い方:Step4」までを実行してください。

    APIでセカンダリIPアドレスを取得

    # 仮想マシンのid一覧を表示
    [root@API-Server ~]# cloudstack-api listVirtualMachines -t displayname,id
    +---------------------+--------------------------------------+
    |    displayname      |                  id                  |
    +---------------------+--------------------------------------+
    |  secondary-ip-test  | dd41b1a8-1c4a-48fd-b062-2ccab4c0ffc6 |
    +---------------------+--------------------------------------+
     
    # secondary-ip-testのNIC idを表示
    [root@API-Server ~]# cloudstack-api listNics --virtualmachineid dd41b1a8-1c4a-48fd-b062-2ccab4c0ffc6 -t ipaddress,id
    +-------------+--------------------------------------+
    |  ipaddress  |                  id                  |
    +-------------+--------------------------------------+
    | 10.32.0.122 | 0f25accf-06f8-4722-beda-508cc832c4ef |
    +-------------+--------------------------------------+
     
    # secondary-ip-testのNICにセカンダリIPアドレスを指定して割り当てる
    [root@API-Server ~]# cloudstack-api addIpToNic --nicid 0f25accf-06f8-4722-beda-508cc832c4ef --ipaddress 10.32.0.100
    
    # もう一度secondary-ip-testのNICの情報を表示
    [root@API-Server ~]# cloudstack-api listNics --virtualmachineid dd41b1a8-1c4a-48fd-b062-2ccab4c0ffc6
     (略)
     "secondaryip": [
      {
        "id": "fadd1502-3aaa-4576-a05a-0d4eb1762265",
        "ipaddress": "10.32.0.100"
      }
    ]
    (略)

    IDCFクラウドコンソールでグローバルIPを取得する
    まずは、スタティックNATで使用するグローバルIPをIDCFクラウドコンソールより取得します。標準で1個付与されているグローバルIPはスタティックNAT用に使用できませんのでご注意ください。

    IDCFクラウドコンソールにログインしたら、対象のリージョン→コンピューティングを選択し、左の「IPアドレス」タブをクリックします。画面の右上にある「IPアドレス取得」をクリックします。 f:id:ykanasugi:20170221105603p:plain

    続いて、ポップアップが出てきたらIPアドレスの表示名と対象のネットワークを選択します。入力が終わったら右下の「取得する」をクリックします。 f:id:ykanasugi:20170221105948p:plain

    先ほどのIPアドレスの画面に戻ったら、新たにグローバルIPが追加されているのが確認できます。現在「NAT」の欄は"なし"となっていますが、後ほど対象の仮想マシン名(secondary-ip-test)が表示されます。

    f:id:ykanasugi:20170221112948p:plain

    APIでセカンダリIPをグローバルIPとスタティックNATをする
    それでは、先ほど取得したグローバルIPを10.32.0.100とスタティックNATします。

    # 現在あるグローバルIPとそのidを表示
    # 先ほど取得した210.140.43.145を使う
    [root@API-Server ~]# cloudstack-api listPublicIpAddresses -t ipaddress,id
    +----------------+--------------------------------------+
    |   ipaddress    |                  id                  |
    +----------------+--------------------------------------+
    | 203.137.176.8  | eaa68c54-29a9-4ad1-bd93-32740e8bc15d |
    | 210.140.42.154 | 7b469138-8504-4133-9c73-2d28ebde7aba |
    | 210.140.43.145 | 17efd86a-9e2e-452a-ade9-d8b11610a091 |
    +----------------+--------------------------------------+
    
    # スタティックNATを有効化
    [root@API-Server ~]# cloudstack-api enableStaticNat --ipaddressid 17efd86a-9e2e-452a-ade9-d8b11610a091 --virtualmachineid dd41b1a8-1c4a-48fd-b062-2ccab4c0ffc6 --vmguestip 10.32.0.100
    {
      "enablestaticnatresponse": {
        "success": "true"
      }
    }

    スタティックNATのを確認
    スタティックNATの設定が完了したら、ポータルから確認してみましょう。「NAT」の欄にsecondary-ip-testと表示されていますね。これで設定は完了です。 f:id:ykanasugi:20170221161116p:plain

    手順② インターネットと通信しない場合

    手順②ではセカンダリIPアドレスの取得は直接OS内で指定して行います。手順①より簡単です。このブログではCentOS6系とCentOS7系両方のやり方を紹介します。

    使用できるIPアドレスの確認
    セカンダリIPとして使用できるIPアドレスは限られているので確認をします。IDCFクラウドコンソールより、左メニューバー「ネットワーク」、ターゲットのネットワーク名、「IPアドレス一覧」をクリックします。

    f:id:ykanasugi:20170227091449p:plain

    ここで表示されている「割当範囲外」のIPアドレスがすべてセカンダリIPとして指定できます。(「利用不可」と書かれている最後の10個のIPアドレスだけはIDCFクラウド側で使用するため割当はできません)なので、この例では10.32.4.1を使います。

    セカンダリIPアドレスの取得

    CentOS 6系とCentOS 7系を例に手順を紹介します。

    CentOS 6系の場合
    今回は、Light.S1(1コア, 1GBメモリ)の仮想マシンを使ってセカンダリIPを取得していきます。ホスト名はsecondary-ip-test-cent6、OSはCentOS 6.8を使用します。プライマリIPは10.32.0.122がDHCPで設定されています。

    #ifcfg-eth0:1の設定ファイルを作成
    [root@secondary-ip-test-cent6 ~]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0:1
    
    #IPアドレスをDHCP取得ではなく、スタティックに書き込む
    [root@secondary-ip-test-cent6 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0:1
    DEVICE=eth0
    ONBOOT=yes
    IPADDR=10.32.4.1
    NETMASK=255.255.248.0
    
    #ネットワークの再起動
    [root@secondary-ip-test-cent6 ~]# service network restart
    
    #eth0の情報確認
    [root@secondary-ip-test-cent6 ~]# ip addr show eth0
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 02:03:01:be:00:05 brd ff:ff:ff:ff:ff:ff
        inet 10.32.0.122/21 brd 10.32.7.255 scope global eth0
        inet 10.32.4.1/21 brd 10.32.7.255 scope global secondary eth0
        inet6 fe80::3:1ff:febe:5/64 scope link 
           valid_lft forever preferred_lft forever
    

    10.32.4.1がちゃんと設定されていました。

    CentOS 7系の場合
    今回は、Light.S1(1コア, 1GBメモリ)の仮想マシンを使ってセカンダリIPを取得していきます。ホスト名はsecondary-ip-test-cent7、OSはCentOS 6.8を使用します。プライマリIPは10.32.0.209がDHCPで設定されています。

    #まずは現在の状態を見てみます
    [root@secondary-ip-test-cent7 ~]# ip addr show
    (略) 
    2: eno16777984: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 02:03:01:be:00:06 brd ff:ff:ff:ff:ff:ff
        inet 10.32.0.209/21 brd 10.32.7.255 scope global eno16777984
           valid_lft forever preferred_lft forever
        inet6 fe80::3:1ff:febe:6/64 scope link 
           valid_lft forever preferred_lft forever
    
    #nmcliコマンドでセカンダリIPを追加
    [root@secondary-ip-test-cent7 ~]# nmcli connection modify eno16777984 +ipv4.addresses  "10.32.4.1/21"
    
    #ネットワークを再起動する
    [root@secondary-ip-test-cent7 ~]# systemctl restart network
    
    #再度NICの状態を確認
    [root@secondary-ip-test-cent7 ~]# ip addr show
    (略)
    2: eno16777984: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 02:03:01:be:00:06 brd ff:ff:ff:ff:ff:ff
        inet 10.32.0.209/21 brd 10.32.7.255 scope global eno16777984
           valid_lft forever preferred_lft forever
        inet 10.32.4.1/21 brd 10.32.7.255 scope global secondary eno16777984
           valid_lft forever preferred_lft forever
        inet6 fe80::3:1ff:febe:6/64 scope link 
           valid_lft forever preferred_lft forever
    

    こちらでも10.32.4.1がちゃんと設定されていますね。

    まとめと注意点

    セカンダリIPを使いたい時は、まずはどのような利用をするかに沿って方法を選択しましょう。ちなみに以前セカンダリIPを使ってLVSを冗長化する記事も書いたのでご参考ください。

    手順①のAPI経由で取得したセカンダリIPの扱いには、2つ注意点がありますのでご参考ください。

    1. セカンダリIPはIDCFクラウドコンソールからの管理ができないので、ご自身での管理となります。
    2. セカンダリIPをグローバルIPとスタティックNATした場合、APIでスタティックNATを解除してから仮想マシンを削除するようにしてください。スタティックNATの設定解除せず、そのまま仮想マシンを削除してしまうとシステム側からスタティックNATが削除できなくなってしまいます。

    方法2については特に注意点はないのですが、紹介したCentOS6と7の方法は両方ともネットワークの再起動が伴うため、動的にIPを追加したい場合はip addr addコマンドなどで追加することも可能です。

    ぜひ、試してみてください。

    IDCFクラウドのGPU搭載仮想マシンを使い始める手順~CUDAインストール編~

    $
    0
    0

    2016年11月25日、IDCFクラウドに新しいリージョンが追加され、あわせて「GPU BOOSTタイプ Tesla M40」がリリースされました。 www.idcf.jp

    ディープラーニング等、通常のCPUでは計算性能が足りなくなるシーンでの利用を想定したGPU搭載仮想マシンです。本記事では、GPUを使い始めるための手順について紹介いたします。

    f:id:kkamiyakenshiroh:20161207155756p:plain

    1. GPUコンピューティング

    GPUコンピューティングとは

    主に3DCGなどの画像処理を行うデバイスであるGPUを、計算分野で利用することをGPUコンピューティングといいます。 昨今の「ディープラーニング(深層学習)」「ビッグデータ」「IoT」「AI(人工知能)」「機械学習」など注目ワードには、GPUコンピューティングが密に関係しています。

    なぜGPUを利用するのか

    CPUとGPUは、それぞれ下記の特徴をもちます。

    • CPU:数コア~数10コアを持ち、逐次処理が得意
    • GPU:数百コア~数千コアを持ち、並列処理が得意

    このそれぞれの特徴を活かして、逐次処理をCPU、並列処理をGPUに割り当てることで、CPU単体よりも圧倒的な速度で演算することができます。

    2. IDCFクラウド GPU BOOSTタイプの特長

    大容量GPUメモリ搭載のGPUを採用

    「GPU BOOSTタイプ Tesla M40」は名前の通りNVIDIA Tesla M40 (24GBメモリ版)を搭載しています。ディープラーニングなどのGPUを用いた計算では、GPUメモリ容量がボトルネックになりやすいため、Tesla M40の中でもGPUメモリが多い24GB版を採用しています。

    専有タイプで他仮想マシンからの性能影響無し

    GPU BOOSTタイプは1物理サーバーに1台だけ仮想マシンが稼働する占有タイプとして提供しているため、共有環境で発生しうる、他の仮想マシンからの負荷による影響を受けず、物理サーバーの全性能を使う事が出来ます。

    IDCFクラウドの通常の仮想マシンと同じ操作で利用可能

    GPU BOOSTタイプは通常の仮想マシンと全く同じ操作で作成・削除などが実施できます。また課金についても上限金額ありの従量課金となっております。ただし、ハードウェア占有タイプである事と、GPUを仮想マシンに直接認識させているため、以下の制限があります。

    • 仮想マシンが起動した状態でのボリュームのスナップショットの取得ができません
    • 物理サーバーが故障などで停止した場合の別サーバーへのフェイルオーバー機能はありません

    3. GPUを利用するためのCUDAライブラリの導入方法

    Tesla M40などのNVIDIA社製GPUを用いて計算を行うためには、GPUのドライバと計算を行うためのCUDAライブラリを導入する必要があります。本記事では、IDCFテンプレート「CentOS 7.2 64bit」仮想マシンを前提に、CUDAライブラリのインストール手順を解説いたします。

    GPU BOOSTタイプの仮想マシンの作成

    GPU BOOSTタイプは現時点では「東日本リージョン2(jp-east-2)」でのみ提供しています。そこで、仮想マシンを作成するためにIDCFクラウドのポータルから東日本リージョン2のコンピューティングを選択します。

    f:id:anikundesu:20161201114304p:plain

    次に、仮想マシン一覧画面から「仮想マシン作成」をクリックします。

    f:id:anikundesu:20161201114340p:plain

    仮想マシン作成画面で、ゾーンを「weber」もしくは「lux」を選択し、次の「マシンタイプ」で「GPU」タブをクリックします。するとマシンタイプ一覧に「gpu.7XLM40」が表示されるので、選択します。

    f:id:anikundesu:20161201114521p:plain

    以後は通常の仮想マシンと同じように設定します。ここではテンプレートとして「CentOS 7.2 64bit」を利用して、設定を確認の上で作成を実行します。

    CUDAインストール用のレポジトリRPM取得とインストール

    NVIDIA社のCUDA Toolkit配布サイトから、次の図のようにOS等を選択します。そして図内の「rpm (network)」をクリックし、RPMをダウンロードします。

    f:id:anikundesu:20161129201908p:plain

    ダウンロードしたRPMをGPU BOOSTタイプの仮想マシンにアップロードし、以下のコマンドでインストールを行います。

    $ sudo rpm -i cuda-repo-rhel7-8.0.44-1.x86_64.rpm
    警告: cuda-repo-rhel7-8.0.44-1.x86_64.rpm: ヘッダー V3 RSA/SHA512 Signature、鍵 ID 7fa2af80: NOKEY
    (以下省略)

    CUDAライブラリのインストール

    CUDAおよびNVIDIAドライバを配布するレポジトリ情報が登録されたので、次はCUDAのインストールを行います。

    $ sudo yum clean all
    読み込んだプラグイン:fastestmirror, remove-with-leaves, show-leaves
    リポジトリーを清掃しています: base cuda epel extras updates
    Cleaning up everything
    Cleaning up list of fastest mirrors
    
    $ sudo yum install cuda
    (以下省略、大量のパッケージが導入されます)

    万一、パッケージのダウンロードやインストールが一部失敗するようなことが発生した場合は、yum clean allから再インストールをもう一度実行します。インストールが無事に完了したら、仮想マシンのOS再起動を実行します。

    GPUが認識された事の確認

    NVIDIAドライバが導入され、正常に認識されると、nvidia-smiコマンドでGPUのステータスが確認できます。

    # nvidia-smi
    Tue Nov 22 15:00:36 2016       
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 367.48                 Driver Version: 367.48                    |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  Tesla M40 24GB      Off  | 0000:03:00.0     Off |                    0 |
    | N/A   39C    P0    60W / 250W |      0MiB / 22939MiB |    100%      Default |
    +-------------------------------+----------------------+----------------------+
                                                                                   
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID  Type  Process name                               Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+

    なお、正常にGPUが認識されていない場合は、以下のようなエラーが表示されます。

    # nvidia-smi 
    modprobe: FATAL: Module nvidia not found.
    NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
    

    再起動後も上記のエラーが表示された場合、もう一度OS再起動をすると認識される場合があります。

    以上でGPUを利用するためのCUDAライブラリの導入が完了しました。ディープラーニングで利用するためには、下記のような各種フレームワークを導入する必要があります。

    フレームワークの導入に関しては、今後の記事で紹介していきたいと思います。

    まとめ

    • ディープラーニングするにはGPUコンピューティングによる強力な計算リソースが必要
    • IDCFクラウドなら、GPU「NVIDIA Tesla M40」搭載の仮想マシンを利用可能
    • CUDAのインストール・フレームワークの導入だけですぐ使える

    IDCFクラウド「GPU BOOSTタイプ Tesla M40」のパワーを、ぜひ体験してみてください!

    超簡単〜ILBをMackerelで監視してみよう

    $
    0
    0

    こんにちは!ソリューションアーキテクト部の金杉です。

    12/15(木)のアップデートで、IDCFクラウドILBのノードに対してMackerelを使った監視ができるようになりました。今まで、ILBに対しての監視サービスは提供されていなかったので、これでパフォーマンス調査やトラブルシューティングがだいぶ楽になりますね。

    f:id:ykanasugi:20161220120547p:plain

    ちなみにILBもMackerelも過去の記事で紹介してきましたが、ILBとはIDCFクラウド上で動作するオートスケール可能なロードバランサーで、Mackerelは株式会社はてなが提供するエージェント型のリソース監視ツールです。詳しくは、以下の記事を参考にしてください。

    Mackerel関連記事
    Mackerelブログリレー『第1回 新人がIDCFクラウドでMackerelを使ってみた』Mackerelブログリレー『第2回 新人がMackerelにホスト登録してみた』

    ILB関連記事
    ILBを使ってWebサーバーをバランシング!構成事例もご紹介

    はじめに

    今回のアップデートのポイントを3つにまとめてみました。 ポイントの紹介後に、早速導入をしてみます。

    1. Mackerelの導入が簡単かつ無料

    ILBに対してのMackerel導入はとても簡単で、エージェントのインストールやコンフィグの書き換えなどの手間は一切不要です。設定の際にチェックを一つ入れて、APIキーを貼り付けるだけのめちゃ楽作業です。そして、無料です😉

    また、Mackerelインターフェイスでのメトリックグラフもすでに定義済みなので、手動で設定する必要もありません。現在は、以下3つの項目が見れるようになっています。項目ごとの説明はステップ③を参考にしてください。
    1) Health Check Errors
    2) Sessions
    3) Traffics

    2. UXを重視した見せ方

    Mackerelを使って監視をする時、通常はサーバー1台ごとにリソースグラフが表示されますが、ILBでMackerelを使うとすべてのノードの状態をまとめて表示してくれます。

    前提として、ILBは負荷に応じてオートスケールする(ノード数が増える)という特徴があります。しかし、ILBを監視する立場になると、ノード単体のリソース状況よりも全体のリソース状況が気になりますよね。よって、今回のアップデートではILBの全ノードを一体化したUX重視な見せ方を採用しています。

    3. 稼働中のILBにも適用OK

    「ええ!すごいじゃん!でもILBずっと昔に立てちゃったよ...」という方も、心配不要です!Mackerelの実装は、稼働中のILBに対しても可能です👌 新規ILBとほぼ同様の方法で導入できるので、同じ手順を参考にしてください。

    ILBにMackerelを導入してみる

    それでは、早速ILBにMackerelをインストールしてみましょう。インストールには必ずMackerelのAPIキーが必要になってくるので、まずはMackerelの画面でAPIキーを確認し、その次にILBに対してインストールの手順を紹介します。

    IDCFクラウドコンソールの上にカーソルを移動するとサービス一覧がでるので、そこからMackerelとILBの管理画面が開けます。 f:id:ykanasugi:20161219164644p:plain

    ①事前準備〜Mackerel API Keyを確認〜

    まずはMackerelの管理画面に移動します。IDCFクラウドからはシングルサインオンができるので、便利です。新規登録ができていない方は、ぜひこれを機会に登録してみてください。無料で使える特典プランもあります。

    左のメニューから対象のオーガニゼーションを選択します。続いて「APIキー」のタブをクリックします。ここでAPIキーのコピーができます。一番右のアイコンをクリックするとそのままコピーしてくれますのでぜひ活用ください。 f:id:ykanasugi:20161219164700p:plain

    これでMackerelのAPIキーの確保ができましたので、ILBの設定に移ります。

    ②ILBにMackerelを導入

    新規ILBに対してMackerelを導入する場合、まずILBの作成を行います。画面右上にある「ILB作成」をクリックします。 既存のILBの場合は、直接対象となるILBのILB名をクリックし、直接オプション入力のステップに移ります。

    ●パラメーター入力
    ロードバランサーのネットワーク、FQDN、Configurationなどのパラメーターを入力します。設定で迷ったら、こちらの記事を参考にしてみてください。 f:id:ykanasugi:20161215210717p:plain

    ●オプション入力
    一通り設定が終わったら、オプションの入力をします。Mackerelのインストールもここで選択します。
    「リソース監視」の欄にチェックを入れたら、APIキーの入力欄が表示されるので、先ほど確認したMackerelのAPI Keyをペーストします。Firewallの設定も適宜入れます。終わったら、「確認画面へ」をクリックし、問題なければ作成をします。 f:id:ykanasugi:20161219164730p:plain

    ③MackerelでILBの様子を確認

    ILBの画面にもどって、作成したILBのステータスがRunningになったらMackerelの画面で確認してみましょう。

    Mackerelのダッシュボードで「Hosts」を確認すると、ILBのFQDNが表示されていて、ステータスがWorkingになっているはずです。 f:id:ykanasugi:20161219164754p:plain

    上図のホスト名をクリックすると、各種メトリックグラフが見えます。例のILBでは、Webサーバー2台を分散させています。(10.15.0.98と10.15.0.245) f:id:ykanasugi:20161219113750p:plain  ▲Health Check Errorsのメトリック
    ILBから分散先サーバーに対してのヘルスチェックの結果を見ることができます。値が1の時はヘルスチェック結果がエラーで、値が0の時はヘルスチェックが正常に通っているということになります。

    f:id:ykanasugi:20161221103844p:plain  ▲Sessionsのメトリック
    分散先サーバーごとのセッション数を見ることができます。さらにcurrentとrateで分かれており、currentは現在のセッション数で、rateは秒間の新規セッション数を表しています。
    また、totalの値も見ることができます。currentのtotal値は分散先サーバーの合計のセッション数で、rateのtotal値は分散先サーバーの合計の新規セッション数です。

    f:id:ykanasugi:20161221103849p:plain  ▲Trafficsのメトリック
    分散先サーバーごとの秒間トラフィックを見ることができます。さらにtxBytesとrxBytesと分かれており、txBytesは秒間送信バイト数で、rxBytesは秒間受信バイト数を表しています。 (※単位はMbpsではなく、Mbytes/secなのでご注意くださいね)
    トラフィックも同じく、totalの値を見ることができます。txBytesのtotal値は、各サーバーの秒間送信トラフィックの合計値なので、ILBの秒間トラフィックとも解読できます。今ままではIDCFクラウドのビリングより合計転送量のみ確認できましたが、今後は秒間トラフィックも確認できるのでとても便利です!

    これで、ILBに対してのMackerelの導入は完了となります。監視ルールでもこれらのメトリックに対して設定を行えます。

    さいごに

    ILBのリソース状況が知りたい!という時は、ぜひこの記事に沿ってMackerelをインストールしてみてください。メリットは先ほどもありました通り、以下3点です。
    1) 簡単かつ無料👍
    2) 見やすい👍
    3) 新規/既存のILBどちらも適用可能👍

    Mackerelについては以前もたくさん紹介してきましたが、毎日進歩しています。IDCFクラウドとも非常に相性がいいので、ぜひ仮想ルーターやホスト監視などでも活用してみてください。

    コーポレートサイトのセキュリティ対策は万全ですか?

    $
    0
    0

    はじめましてみなさん、コンテンツマーケティング部の河田です。
    おもにIDCフロンティアのコーポレートサイトの運営を担当しています。

    f:id:dkawata:20161226185447p:plain

    当社のことをみなさんに知っていただく看板サイトとして、日々、新サービスの紹介やイベント、キャンペーン情報などを発信し続けています。
    本日は、IDCFクラウド上で稼働しているコーポレートサイトを運用し続けるための仕組みを次のポイントに分けてわかりやすくご紹介していきたいと思います。

    はじめに

    今回お伝えしたい内容がこちらです。

    • 24時間365日運営できるサイト作り
    • サイトを守るために必要な3つの対策
      • GSLBによる広域負荷分散
      • DDoS対策サービスの導入
      • WAFの活用
    • 実際に障害が起こってしまったら
    • 最後に

    前提となるWeb上の脅威のお話から、具体的な対策方法、障害発生時への備えまで一連の流れでご紹介したいと思います。では早速、本題に入りましょう。

    24時間365日運営できるサイト作り

    Webの世界にはリアル社会のように年末年始の休業期間などはありません。 基本的に24時間365日、サイトを運用し続けることが前提となります。
    そしてWeb上でサービスを提供しているかぎり尽きないのがサイバー攻撃の脅威です。
    中でもコーポレートサイトのような会社のブランディングに直結するサービスには DDoS攻撃などが猛威を振るってきます。 TCP・SYNフラッド、UDPフラッド、DNSアンプ、Low and Slow攻撃など、その種類は上げればきりがないくらい存在します。
    また、それぞれの攻撃が狙うターゲットレイヤーも異なり、その規模もどんどん大きくなってきています。

    こうした悪意のある攻撃からサイトを守るためには、単純にサーバーを強化するだけでは対策不足です。ネットワークインフラからサーバーまで一貫した対策が必要になります。

    サイトを守るために必要な3つの対策

    IDCFのコーポレートサイトは、これからご説明する3つのサービスを用いてセキュリティ対策を実現しています。
    では、実際にどのような取り組みをしているのか簡単にご紹介していきます。

    1)GSLBによる広域負荷分散

    サイバー攻撃に関わらず、人為的なミスや大規模災害などが起きて、サーバーに何らかの障害が発生した場合、ただちにGSLBは登録されているディザスタリカバリ(DR)サイトへ自動でアクセスを切り替え、ダウンタイムを 最小限に抑えてくれます。
    通常のロードバランサーと違い、東西の拠点でロードバランシングを行うため、より一層可用性が担保されます。アクセス数の多い都心部からのレイテンシを考慮し、プライマリサイトを東日本に構築していることもポイントです。
    そして、拠点間でのコンテンツ同期やバックアップを行い、さらにプライベートコネクト接続で セキュアな通信網を利用すればベストです。

    f:id:dkawata:20170106140952p:plain
    ▲GSLBによるDRサイトへの自動切り替わりイメージ

    2)DDoS対策サービスの導入

    このDDoS対策サービスというのは、トラフィックがサーバーに届くより前の段階のネットワーク領域でDDoS攻撃を緩和、防御してくれます。

    もう少し詳しく説明すると、以下のフローを自動で行います。
    1. ネットワーク上の振る舞いから悪意のあるトラフィックを検知する
    2. そのトラフィックを遮断するためのシグネチャを自動生成(動的シグネチャ
    3. フィルタリングを実行

    既知の攻撃手法に対しての防御は不正侵入検知/防御サービス(IDS/IPS)で対応可能ですが(静的シグネチャ)、未知の攻撃や巧妙に細工された攻撃にはこのDDoS対策サービスが特に効果を発揮します。

    ※静的シグネチャとは、既知の攻撃パターンをデータベース化して管理した上で、該当する攻撃をフィルタリングする方式です。

    3)WAFの活用

    WAFとはWeb Application Firewallの略称で、一般的によく知られているFirewallがポート、IP制限などのネットワークレイヤーの不正アクセスを防ぐのに対して、WAFは「SQLインジェクション」「XSS」などのWebアプリケーションを狙った攻撃を防御してくれます。

    例えば、お問い合わせなどのフォームからサーバーへ送られる入力データのチェックを行い、不正なデータが渡されないようにします。つまりサーバーとクライアントの間に立って通信を遮断し、Webアプリケーションを防御してくれます。

    しかしながら、WAFを導入すればすべてのWebアプリケーションの脆弱性対策ができるかというと、答えはNOです。 あくまで暗号化された通信(SSL)上でのセキュアなプログラミングや適切なサーバー設定の漏れを補完することが目的です。

    f:id:dkawata:20161226185515p:plain
    ▲各レイヤーによりサイバー攻撃を防御する対象が異なる

    こうしたネットワークサービスを導入することで、一定のサイバー攻撃からサイトを守ることができます。 しかもその負荷を専用機器でまかなうことができるため、Webサーバーに無駄な負荷をかけずに済みます。
    SSLの暗号化・復号処理をサーバーではなく、ロードバランサーで行っていることもポイントの一つです(SSLアクセラレーション)。 普段何気なくアクセスしているコーポレートサイトも、コンテンツへ到達するまでには 上図のような様々なサービスを通過して閲覧できているワケですね。

    実際に障害が起こってしまったら

    ここからは人や組織の対策です。
    あまり考えたくないことですが、実際に問題や障害が発生してしまった時の行動を緊急時対応マニュアルとしてフローチャート形式でまとめることや、エスカレーション先を決めた表を作成する必要があります。
    この時、自分ひとりですべての作業を差配している人は少ないと思います。複数の部署をまたいだ連携が必要になってくるハズです。そのため、物事の決定権が誰にあるのかを事前に決めておくことは非常に重要です。できれば担当部署だけでなく、担当者名まで決めておくことができれば安心です。
    またその代理や、最悪、誰とも連絡がつかなかった場合などその条件は多岐に渡りますが、まずは自分の上司など身近なところから決めて行き、表を完成させていきましょう。

    まとめ

    今回は少し駆け足でコーポレートサイトの全体像をお伝えしました。
    以上のことを踏まえてIDCFのコーポレートサイトはざっくりと下図のような構成になっています。

    f:id:dkawata:20161227171522p:plain

    普段は個々のサービスとして独立して説明する機会が多いと思いますが、このように一連の流れで説明することで、それぞれのサービスが担当する守備範囲がわかりやすくなったのではないでしょうか。

    要点をまとめてみます。

    • GSLBによるDRサイト構築
    • DDoS対策サービスを含むネットワークサービス(FW、IDS/IPS、WAF、LB)の導入
    • SSLによる通信の暗号化
    • セキュアなプログラミングや適切なサーバー設定
    • コンテンツの同期とバックアップ
    • 障害時の対応マニュアルの作成

    これらがすべて揃って初めて24時間365日運営できるサイト作りが実現することになります。

    最後に、今回取り上げたこれらのサービスを実際使ってみたいという方へのお知らせです。
    中でもIDCFクラウド上で導入可能なGSLB(DNS)プライベートコネクトILBならすぐにでも対策を始めることができます。 また、お申込みベースでDDoS対策サービスを含むIDCFネットワークサービスも利用可能です。

    これを機にみなさんが運営されているサイトのリスクマネジメント対策を見直してみてはいかがでしょうか?

    IDCFクラウドでのマルチキューネットワーク

    $
    0
    0

    f:id:tafujish:20170127205753p:plain

    仮想環境や古いサーバーだと上記画像のように、CPU使用率が特定のコアに偏ることがあると思います。特に2番のCPUのsi(ソフトウェア割り込み)の値のみ大きいです。このような場合、マルチキューネットワークに対応することで複数のCPUコアを利用することができるためネットワーク性能をスケールすることができます。

    この話はしばしば質問いただきますが、IDCFクラウドの仮想マシンのNICはRSS(Receive Side Scaling)に標準で対応しているので、マルチキューネットワークのためにこれといった操作や設定は不要です。

    「以上です。」
    で終わってしまいそうな話ですが、以下ではもう少し踏み込んでみるので、CPUの各コアの利用が偏っている場合は次を参照ください。だいたい多い話として、irqbalanceが入っていなかったり、ダイナミックスケール後の話だったり、ISOから作った仮想マシンだったりします。

    1) RSSに対応しているか確認するには

    RSSはNIC側で複数のキューを持ち、複数のCPUコアを活用できます。

    IDCFから提供しているテンプレートから仮想マシンを作成すると、標準でRSSに対応したNICである「vmxnet3」が搭載されています。vmxnet3であることの確認は、

    # ethtool -i ens160
    driver: vmxnet3
    version: 1.4.7.0-k-NAPI
    ~略~

    ※ens160はネットワークインターフェース名(eth0等適宜置き換えてください)

    driverがvmxnet3であれば、このNICはRSS対応となります。

    では、具体的にマルチキューになっているか確認しましょう。

    # ls /sys/class/net/ens160/queues/
    rx-0  rx-1  rx-2  rx-3  tx-0  tx-1  tx-2  tx-3

    ※ens160はネットワークインターフェース名(eth0等適宜置き換えてください)

    rx-0からrx-3の4つが受信キュー、tx-0からtx-3の4つが送信キューです。
    仮想マシンのCPUのコア数と同じ数のキューが有効になっています。(この仮想マシンはHighcpu.L8の4コアマシン)

    この4つのキューが、どこのCPUコアに割り当てられてるかは次のように確認できます。

    # cat /proc/interrupts | grep ens160
      56:         39          0          0      44516   PCI-MSI-edge      ens160-rxtx-0
      57:          7      44132          0          0   PCI-MSI-edge      ens160-rxtx-1
      58:         16          0      44175          0   PCI-MSI-edge      ens160-rxtx-2
      59:         28          0          0      44739   PCI-MSI-edge      ens160-rxtx-3
    ~略~

    ※ens160はネットワークインターフェース名(eth0等適宜置き換えてください)

    割り込みのカウントが上がっているところを見ると、0番のキューはCPUの3番、1番のキューはCPUの1番、2番のキューはCPUの2番、3番のキューはCPUの3番に割り当てられてます。
    この環境はCentOS7.3ですが、0番のCPUが使われておらず、3番のCPUに2つのキューが割り当てられています。このあたり、気になる方は、次の 2) を参照ください。

    では、この環境に負荷をかけて、CPUの使用率を確認します。

    f:id:tafujish:20170127205755p:plain

    上記のキューの割り当ての通り、0番のCPUの負荷は低く、3番のCPUの負荷が高くなっています。
    ここまで確認したように動いていれば、RSSが正常に機能しています。
    NICがvmxnet3で、キューの数もCPUコア数に応じた数があるのに、CPUの使用率が異なる場合、キューが各CPUに割り当てられていない可能性があります。そのようなときはirqbalanceをyumやaptでインストールして動かしてみてください。

    執筆時点のIDCFクラウドの標準テンプレートだと、CentOS6.xと7.xでははじめからirqbalacneがインストールされていますが、Ubuntu16.04ではインストールされていません。

    2) CPU0番コアが使われていないとき

    先述のとおり、RSSが機能しており、irqbalanceが各CPUコアにキューを割り当てているのに、0番のCPUが使われないのは、irqbalanceが0番のCPUに割り当てないためです。
    CnetOS6.xでは0番にも割り当てますが、CentOS7.xやUbuntu16.04では0番に割り当てられません。

    偏りが問題ないレベルであれば、そのまま利用いただいて問題ないですが、カツカツにCPUリソースを消費していて偏りが困る場合は、キューの割り当て先CPUを手動で変更することもできます。

    まずは、割当先を変更したい0番のキューのIRQ番号確認します。ここでは56番です。

    # cat /proc/interrupts|grep ens160
      56:         39          0          0     268151   PCI-MSI-edge      ens160-rxtx-0
    ~略~

    ※ens160はネットワークインターフェース名(eth0等適宜置き換えてください)

    次に現在の割当先を念のため確認します。ここで先ほど調べたIRQ番号を入れます。ここでは、「8」となってますがビットで記載されているので、3番のCPUに割り当てとなっています。
    (ちなみに、0番のCPUは「1」、1番のCPUは「2」、2番のCPUは「4」となります)

    # cat /proc/irq/56/smp_affinity
    00000000,00000000,00000000,00000008

    0番のCPU(値としては「1」)に割り当て、確認します。

    # echo 1 > /proc/irq/56/smp_affinity
    # cat /proc/irq/56/smp_affinity
    00000000,00000000,00000000,00000001

    この状態で負荷をかけるときれいに分散されました。

    f:id:tafujish:20170127205757p:plain

    この設定はOS再起動で消えてしまうので、必要だったらOS起動時のスクリプトに記載ください。
    また、irqbalanceがデーモンとして動いていると変更した設定を戻されてしまうので、irqbalanceのサービスを止めるかONESHOTの設定にする必要があります。

    3) ダイナミックスケール後の対応

    IDCFクラウドでダイナミックスケールした後、増えたCPUのコアがちゃんと使われていないというような質問をしばしばいただきます。

    実はダイナミックスケールによりCPUのコアが増えたとしても、RSSのキューの数が増えないため、増えたCPUコアをNICが使うことはありません。
    増えたCPUコア分のキューを増やすには、vmxnet3のモジュールをいったん削除し、再度追加することで認識できます。

    # modprobe -r vmxnet3; modprobe vmxnet3

    ただ、この方法だとモジュールを削除するので瞬断が発生します。
    それが難しい場合は、以下の4)のようにRPS/RFSでマルチキュー化でしのぎ、次回OS再起動時にRSSに戻るという方法もあると思います。

    4) RSS対応してないときはRPS/RFSで

    RSSはNICの方が対応しているマルチキューネットワークであり、NIC(今回だとvmxnet3)が対応している必要があります。IDCFクラウドでは、vmxnet3以外のNICも利用可能です。

    • テンプレートインポート時にe1000かpcnet32を選択することもできます
    • ISOインストールでの仮想マシンはデフォルトでe1000となります

    このように、vmxnet3以外のときは、OS側でマルチキューネットワークに対応させます。具体的には、 RPS(Receive Packet Steering)、RFS(Receive Flow Steering)です。

    では具体的な設定を紹介します。
    例えば、以下のようなe1000のNICでキューが1つしかない、4コア仮想マシンの環境があったとします。デバイス名はens35とします(eth0等適宜置き換えてください)。

    # ethtool -i ens35
    driver: e1000
    version: 7.3.21-k8-NAPI
    ~略~
    
    # ls /sys/class/net/ens35/queues/
    rx-0  tx-0

    まずはRPSの設定です。入力している「f」は4コアすべて利用するときでビット計算となってます。例えば、2コアのときは「3」、8コアのときは「ff」となります。

    # echo f > /sys/class/net/ens35/queues/rx-0/rps_cpus

    次にRFSです。rps_sock_flow_entriesの値は、一般的に「32768」が推奨されています。
    一方で、rps_flow_cntは、rps_sock_flow_entries÷受信キューの数となります。e1000のこの環境ではキューは1つのため、rps_sock_flow_entriesと同じ値となります。

    # echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
    # echo 32768 > /sys/class/net/ens35/queues/rx-0/rps_flow_cnt

    以上ですが、上記設定はネットワークインターフェース毎に設定が必要なので、複数NICがある場合はその分実行ください。また、これらの設定はOS再起動で消えてしまうので、必要だったらOS起動時のスクリプトに記載ください。

    5) e1000のテンプレートをvmxnet3に変える

    先述のとおり、e1000でもRPS/RFSでマルチキューネットワークは利用できますが、設定が面倒だとか何らかの理由でvmxnet3に置き換えたいときもあると思います。

    そのときは、テンプレートを一度エクスポートしていただき、再度インポートしていただければ、インポート時の設定で下図のようにNICの種類を指定することが可能ですので、こちらもご検討ください。

    f:id:tafujish:20170127205758p:plain

    まとめ

    長くなりましたが、基本的にはRSS標準対応なので、手間なくそのままご利用いただけます。もしCPUのコアが偏っているようであれば、上記ご参照ください。

    IDCFクラウドで採用されたVXLAN over CLOS

    $
    0
    0

    みなさまはじめまして、UX開発部の橋口です。

    今回の記事は、IDCFクラウドの東日本リージョン2に採用された、新ネットワークアーキテクチャである「VXLAN over CLOS」についてです。
    「VXLAN over CLOS」の設計思想や、今までのアーキテクチャと比べ何が違うのかなどを書いていきます!

    VXLAN over CLOSとは

    IDCフロンティアの新ネットワークアーキテクチャである「VXLAN over CLOS」は、ネットワークをオーバーレイとアンダーレイという2つの階層に分けた設計になっています。
    オーバーレイは、トラフィックをカプセル化する仮想的なネットワーク層です。アンダーレイは、いわゆる物理的なネットワーク層であり、オーバーレイでカプセル化されたトラフィックを転送します。

    このようにオーバーレイとアンダーレイの2階層に分離することにより、シンプルな設計になっています。

    アンダーレイ:CLOS (IP Fabric)

    CLOSの考えとしては、小さなインターネットを作ると考えていただければわかりやすいと思います。 実際に今もインターネットを支えているBGPを用いて、多数の機器を相互に接続し、最適な経路を導き出しています。 これにより、一般的なL2ネットワークに比べ拡張性を高めたり、帯域の有効活用を実現しています。

    オーバーレイ:VXLAN

    VXLANでは、マルチテナントのネットワーク、個別のプライベートなネットワークの構築を行っています。 全サービスで一意なID(VNI)を付与することが可能になり、VLAN4000の壁に捉われない柔軟性に優れたネットワークの設計が行えます。

    CLOSの拡張性、VXLANの柔軟性を組み合わせた次世代のネットワークアーキテクチャが「VXLAN over CLOS」というわけです。

    VXLAN over CLOSのメリット

    「VXLAN over CLOS」には大きく下記の2つのメリットがあります。

    1. 新ネットワークアーキテクチャ間のL2接続が容易に可能
    2. 拡張性の高い設計思考

    それぞれ説明していきます。

    1.新ネットワークアーキテクチャ間のL2接続が容易に可能

    現在、下記サービスがVXLAN over CLOSで構成されています。

    • IDCFクラウド 東日本リージョン2
    • プライベートクラウド
    • データセンター(ハウジング)

    これらのサービス間は、シームレスなL2ネットワークで接続することが可能です。
    これにより、例えば下図のように異なる環境で収集・蓄積したデータを簡単に連携させることができます。 f:id:kkamiyakenshiroh:20170329123444j:plain

    IDCFクラウドのゾーン間接続の申し込み方法については、こちらをご参照ください。

    2.拡張性の高い設計思想

    以前の構成では、各ネットワーク機器がActive-Standby構成となっており、Standby側にはトラフィックが流れていませんでした。しかし「VXLAN over CLOS」ではActice-Active構成となったため、全てのLinkや機器にトラフィックを流すことができ、通信効率と拡張性の向上を実現しました。これにより、各サービス間のネットワークは、従来比の16倍の帯域になりました! f:id:kkamiyakenshiroh:20170329123526j:plain

    また、耐障害性も向上しています。Actice-Active構成のため、ネットワーク機器の故障時に切り替えが起こらず、縮退のみで留めることができるため、サービス断が発生しなくなりました。
    今時はユーザーからすると、内部ネットワークはあまり意識することのない部分ですが、このようにチャレンジと改善を積み重ねることにより、日々サービス品質の向上に努めています!

    まとめ

    IDCフロンティアが新たに採用したネットワークアーキテクチャ「VXLAN over CLOS」の以下2つのメリットについて紹介しました。

    1. 新ネットワークアーキテクチャ間のL2接続が容易に可能
    2. 拡張性の高い設計思考

    より技術的な内容については、IDCフロンティアの見崎より「JANOG39 Meeting」にて発表しています。 詳しく知りたい方は、下記URLより資料をご覧ください! https://www.janog.gr.jp/meeting/janog39/application/files/8514/8478/6659/JANOG_IDCF.pdf

    今後もシンプルかつパワフルなクラウドを目指し、機能やユーザビリティの向上に努めてまいります!

    AngularJS開発TIPS(後編)

    $
    0
    0

    今回は前回に引き続きSingle Page Application をAngularJSで構築する際のTIPS「後編」をお届けします。

    AngularJS
    (引用)https://angularjs.org/

    前編はこちらです。これからAngularJSを勉強しよう、という入門者の方は、前編の「AngularJSについてこれから勉強する方」をご覧下さい。

    【前編】
    1.ServiceとFactoryの使い分け
    2.URLのルーティングにはUI-Routerを使う
    3.画面操作の多い画面では複数のController、Viewに分割した設計をする

    【後編】
    4.複数のController間のデータ共有にはShared Serviceを使う
    5.サーバーサイドのURLをRESTで設計できる場合、AngularJSのRESTクライアントを利用できる。
    6.Ajaxリクエストの共通処理はインターセプターで実装する

    4.複数のController間のデータ共有にはShared Serviceを使う

    Controllerを分割すると、Controller間のデータ共有をどうするか?という問題が出てきます。 いくつか方法はあるのですが、最もシンプルな方法としては、共有のデータ領域として使うServiceを用意することです。

    こちらのサイトがController間のデータ共有についての方法を記載されており、3つのデータ共有の方法を紹介してくださっています。

    「Qiitaの複数Controller間のデータ共有について」
    http://qiita.com/sunny4381/items/aeae1e154346b5cf6009

    IDCFの社内のいくつかのプロジェクトではShared Serviceによって共有データ領域を実現しました。 各データ共有の方法と、なぜそれを選んだか?という点を解説します。

    Shared Service

    AngularJSでは、Controllerでthis(または$scope)にプロパティを設定することで、ControllerとViewのデータの受け渡しをすることができます。 Shared Serviceを使う方法は、thisにShared Serviceを登録します。 Shared ServiceにControllerとViewで受け渡ししたいプロパティを設定します。

    Shared ServiceをインジェクションすればどのControllerからもアクセスできます。 これはメリットでもあり、アクセスのルールを決めておかなければ、 どこからアクセスしているのかわからなくなるスパゲッティコードを招く危険もありますので、アクセスのルールを決めておく必要があります。

    オブジェクトストレージのプロジェクトでは下記のようなアクセスルールを決めました。

    • 1つの機能のカテゴリーにひとつのShared Service
    • 同じカテゴリーのControllerから以外はアクセスしない(APIユーザーを扱うControllerからはオブジェクトリストShared Serviceにアクセスしないなど。)

    その他のデータ共有の方法も確認しながら利用方法を比較してみます。

    Parent Scope

    親クラスの$scopeを利用するデータ共有の方法です。 AngularJSでは、Viewの中でControllerを入れ子にすると、内側のControllerが外側のControllerを継承しする親子関係になります。 内側の子のControllerは親の$scopeの値を参照でききます。 このように自分のプロパティのようにアクセスすることができます。

    Pub / Sub

    イベントを利用したデータ共有の方法です。

    データ共有方法の比較

    比較したところ、それぞれ下記の課題があがりました。

    Shared Service・Controllerにインジェクションすれば、どのControllerからも共有のデータ領域を利用できる。
    ・どのControllerからもアクセスできるため、アクセスのルールをプロジェクトで決める必要がある。
    Parent Scope・値を共有するために、継承を利用する設計が足かせにならないか。
    Pub / Sub・SharedServiceに比べると大掛かりなしくみ
    ・値を取得するときにはSharedDataServiceから取得する必要がある。 値を渡すときには$bloadcastで送信し、bloadcastを受け取った側がSharedDataServiceに保存する必要がある。

    最終的には、Shared Serviceを選びました。理由としては以下になります。

    • Shared Serviceが最も仕組みがシンプルなこと。
    • アクセスのルール化がしやすかったこと。
    • Serviceを使う仕組みのため、AngularJSのインジェクションの仕組みを利用したテストもしやすかったこと。

    5.サーバーサイドのURLをRESTで設計できる場合、AngularJSのRESTクライアントを利用できる。

    AngularJSには、サーバーへリクエストを送るAPIとして$httpライブラリーが用意されています。 これを使ってデータのリスト、登録、更新、削除などのHTTPクライアントを作るのは少し手間がかかります。 もしサーバー側のAPIをRESTで設計出来る場合、AngularJSのREST用クライアントの$resourceライブラリが便利です。HTTPクライアントを簡単に実装できます。

    $resourceの例

    idとtextというふたつのパラメータを持つNoteを管理するURLがこのような場合の例をみてみます。

    URLHTTPメソッド機能
    /api/notes/GETリソースの一覧を取得
    /api/notes/:idGETリソースを取得
    /api/notes/POST新規登録する
    /api/notes/:idPUT更新する
    /api/notes/:idDELETE削除する

     

    $resourceを使ったRESTクライアントの定義

    (function (angular) {
      angular.module('myApp.note').factory('Note',Note);
    
      function Note ($resource) {
        return $resource(
          '/api/notes/:id',
          {id: '@id'},
          {'update': { method:'PUT' } }
        );
      }
    })(angular);

    $httpを使ったRESTクライアントの定義

    $resourceを使わずに、$httpでRESTクライアントを作ることもできますが、 GET、PUT、POST、DELETEのメソッドを$httpを利用して自分で実装する必要があります。

    (function (angular) {
      angular.module('myApp.note').factory('Note',Note);
    
      function Note ($q, $http) {
        var Note = function(params) {
          this.id = params.id;
          this.text = params.text;
    
          this.query = function() {
            var defer = $q.defer();
            $http.get('/api/notes/').
              success(function(result) { defer.resolve(result); }).
              error(function(result) { defer.reject(result);});
            return defer.promise;
          };
    
          this.save = function () {
            var defer = $q.defer();
            $http.post('/api/notes/',? {id:this.id, text:this.text}).
              success(function(result) { defer.resolve(result); }).
              error(function(result) { defer.reject(result);});
            return defer.promise;
          };
    
          this.update = function () {
            var defer = $q.defer();
            $http.put('/api/notes/' + this.id , {id:this.id, text:this.text}).
              success(function(result) { defer.resolve(result); }).
              error(function(result) { defer.reject(result);});
            return defer.promise;
          };
    
          this.delete = function () {
            var defer = $q.defer();
            $http.delete('/api/notes/' + this.id).
              success(function(result) { defer.resolve(result); }).
              error(function(result) { defer.reject(result);});
            return defer.promise;
          }
        }
    
        Note.query = function() {
          var defer = $q.defer();
          $http.get('/api/notes/').success(function(result) {
            var ret = result.map(function(r) {
                           return new Note({id:r.id, text:r.text});
            })
            defer.resolve(ret);
          }).error(function(result) { defer.reject(result); });
          return defer.promise;
        };
        return Note;
      }
    })(angular);

    $resourceで定義したRESTクライアントの利用例

    Controllerでの$resourceの簡単な利用例です。

    //MainController.js
    function MainController($scope, $state, Note, NoteSharedData) {
    
      /* 一覧 */
      Note.query().$promise.then(function(notes) {
        data.notes = notes;
      });
    
      /* 登録 */
      this.add = function () {
        note.$save().then(function(res) {
          /* リクエスト完了後の処理 */
        });
      }
    
      /* 更新 */
      this.update = function (note) {
        note.$update().then(function(res) {
          /* リクエスト完了後の処理 */
        });
      }
    
      /* 削除 */
      this.delete = function (note) {
        note.$delete().then(function(res) {
          /* リクエスト完了後の処理 */
        });
      }
    }

    参考
    https://docs.angularjs.org/api/ngResource/service/$resource

    6.Ajaxリクエストの共通処理はインターセプターで実装する

    $http、$resourceの両方の対してAjaxのリクエスト前、レスポンス取得時の共通処理を実装出来ます。下記のような処理をしたい場合に有効です。

    • 全てのリクエストに共通パラメータを付与したい場合
    • レスポンスの共通的なエラーハンドリング
    • リクエストやレスポンスの内容をブラウザのコンソールログに出力したい

    インターセプターの作成

    (function (angular) {'use strict';
      angular.module('myApp.note').factory('HttpInterceptor', HttpInterceptor);
      function HttpInterceptor($q, $log, $rootScope) {
        /**
         * エラーハンドリング
         */
        function handleError(rejection){
          $log.error("HttpInterceptor.errorhundler", rejection.status, rejection);
          if (rejection.status == 400) {
            /* error handling */
            return;
          }
          if (rejection.status == 500) {
            /* error handling */
            return;
          }
        }
    
        var service = {
          // リクエスト前
          'request': function(config) {
            $log.debug('HttpInterceptor.request:',config);
            return config || $q.when(config);
          },
    
          // レスポンス success
          'response': function(response) {
            var headers = response.headers();
            $log.debug("HttpInterceptor.response:", response, "header:", response.headers());
            return response || $q.when(response);
          },
    
          // レスポンス error
          'responseError': function(rejection) {
            var headers = rejection.headers();
            $log.debug("HttpInterceptor.responseError:", rejection, "status:",rejection.status, "headers:",rejection.headers(), "config:",rejection.config);
            handleError(rejection);
            return $q.reject(rejection);
          }
        };
        return service;
      }
    })(angular);

    作成したインターセプターの登録

    (function(angular) {'use strict';
      angular.module('myApp.note', ['ui.router', 'ngResource']).config(Config);
      function Config ($httpProvider, $stateProvider) {
      //HTTPリクエストの共通処理の設定
      $httpProvider.interceptors.push('HttpInterceptor');
    })(angular);

    まとめ

    AngularJSは機能が多い分、どれをどのように使っていくか、、という点で悩みました。 現在は色々な参考開発スタイルガイドが出ていますので、自分のチームに合うものを選択されるのが良いと思います。

    これからの利用にあたってはAngular2を意識した実装を考える例が多くでてきます。 こちらの公式ブログの記事のようにAngular1から2へ移行しやすい機能をそろえていくようですので、現時点ではAngularJSのガイドラインに従った開発が良いのではないかと思います。

    「Angular 1 and Angular 2 integration: the path to seamless upgrade」
    http://angularjs.blogspot.jp/2015/08/angular-1-and-angular-2-coexistence.html?view=classic

    「AngularJS Style Guide」
    https://github.com/johnpapa/angular-styleguide

    Angular2のリリースはまだしばらく先になりそうですが、一時期バッシングされたところからどのように変わっていくのか、、という点が楽しみです。

    Angular2への移行機能などをまた試して紹介していければと思います。
    以上、UX開発部の樋代でした。

    参考

    こちらの記事を書く際に参考にさせていただきました。

    「AngularJS blog」
    http://angularjs.blogspot.jp/

    「AngularJS Advent Calendar 2014」
    http://qiita.com/advent-calendar/2014/angularjs

    「AngularJS モダンプラクティス」
    http://qiita.com/armorik83/items/5542daed0c408cb9f605

    です。こちらも試してみると面白いと思います。

    <連載記事>


    根尾 IoT Bootcampレポート Day1 前編 イントロダクション

    $
    0
    0

    9/28,29に岐阜県本巣市根尾で、「IoT Bootcamp」と題し、限界集落*の課題解決を通してIoT分野がどのように活用できるかをテーマにしたワークショップをIAMAS,トリガーデバイス,IDCフロンティアの3社の主催で開催しました。今回のブログでは本イベントをレポートします。

    *限界集落…高齢者が人口の半数以上を占める集落

    比較的コンパクトなイベントだったこともあり、イベントの企画と参加の両面でかかわることができたため、二つの視点で感じたことをお伝えしたいと思います。

    根尾の限界集落
                                                                            根尾の限界集落

    開催の目的

    IoTはBtoBや製造現場など法人での取組は具体的に進みつつあるものの、一般ユーザーが生活場面における具体的な解は、まだまだ模索が続いてる状況です。そこで社会課題の先進地として限界集落をフィールドに、多様なスキルや視点の人々でフィールドワークやプロトタイピングを行い、IoTの可能性と課題を抽出しつつ、課題の解決をどのような環境やプロセスですすめていくことがよいのか、テクノロジー以外の要素もふくめて検証していきます。

    当社は、イベントに参加しつつ、myThingsおよびIDCFクラウドとプロトタイプを効率化するためのツールを、トリガーデバイスさんと開発提供する立場で参加しました。

    根尾について

    根尾は岐阜県の西部、福井県との境に位置していて、大垣より電車で1時間ほどかかる集落です。

    春は淡墨桜という樹齢1500年以上と推定される桜で有名で、美しい山々と清流が印象的でした。

    IMG_5678

    会場はIAMASが管理している、ねおこ座という根尾の古い公共施設をリノベした場所をお借りして行いました。

    天気にもめぐまれ、川のせせらぎを充実した時間を過ごせました。

    IMG_5691

    IMG_5689

    参加者は、西は福岡から東は東京まで様々な立場の方17名が集まりました。

    主に企業で新規事業やマーケティング担当者、Webやアプリ、バックエンドのエンジニア、製品やWebなどのデザイナーなクリエイター、IAMASで学ぶ学生などで多様なやりとりが生まれました。

    主催のIAMAS 小林先生 と ディスカッションの風景
                                          主催のIAMAS 小林先生 と ディスカッションの風景

     

    スケジュール

    日程は2日間で、初日はフィールドワークを中心に課題の抽出を行い、翌日は提供環境のハンズオンとアイデアスケッチと開発が行われました。

     

    • DAY 1
      • 11:00〜12:00:イントロダクション、自己紹介
      • 13:00〜16:00:フィールドワーク
      • 16:30〜17:30:フィールドワークの分析
      • 17:30〜19:00:アイデアスケッチ
      • 19:00〜20:00:発表
    • DAY 2
      • 09:00〜10:00:技術ハンズオン
      • 10:30〜12:00 : アイデアスケッチと共有
      • 13:00〜16:00:開発
      • 16:00〜18:00:発表、振り返り

     

    イントロダクション

    イベントの主旨説明と各参加者の自己紹介の後に、今回IoTに関わる環境として提供されるYahoo! JAPANmyThingsの紹介やセンサーのセットの説明を行いました。IoTに詳しい人ばかりを集めたわけではないので、ここではあくまでちょっとしたご紹介という内容です。

    ccd64fce-f16d-4bab-a684-0dae1ae7322d

    トリガーデバイスの佐藤さん(写真右)からの挨拶。

    IoT Bootcampの監修とプロトタイプ用スマートフォンアプリの開発を担当されました。

    IMG_5697

    greycellの中原さん(中央 黒い服)、地域おこし協力隊の山口さん(右 青い服)。

    IAMAS卒業生で根尾で生活をしているお二人。フィールドワークとアレンジなどを担当いただき、多くのかたと短い時間がやりとりができました。現地に住んでいない参加者と現地のかたとの感覚や認識には、ときには大きなものがあるなか、お二人の存在は大変重要でした。また、ワークショップの随所でフィードバックいただくことで、ディスカッションに深みをもたせることができました。

    IMG_5698

    IDCフロンティアの清水より、myThingsの概要とプロトタイプ開発のための環境について、紹介をしました。今回はIoTの活用がテーマの一つですが、ツールであるmyThingsにひっぱられすぎずに課題の解決をすすめつつ、実現性のあるプロトタイプをしてもらうための対応に悩みました。

    ここでは今回の環境でできることの概要だけ説明して、フィールドワーク後に参加者のかたに実現したいイメージが出てきたあとに、ハンズオンを行うことにしました。

    <Day1後編に続く> blog.idcf.jp

    根尾 IoT Bootcampレポート Day1 後編 フィールドワーク

    $
    0
    0

    今回のブログでは、前回に引き続き、IoT Bootcampのレポートをお伝えします。高齢者が過半数の人口を占める限界集落の課題を、IoTで解決しようというフィールドワークです。前回のエントリーは、こちらです。

    フィールドワーク

    フィールドワークでは、3班にわかれて、獣害(さる、くま)、森林セラピー、観光地、商店、水管理などのポイントをまわり、その後コミュニティバスで人がほとんどいなくなった集落を訪問、現場の状況を肌で感じました。

    訪問先だけでなく、道中でも根尾のかたが気さくにやりとりをしてくれたため、資料だけでは得られない情報に触れられました。

    淡墨桜にはじまり、山河やそれをとりまく橋梁などは美しく、菊花席や猿楽などの古くからの芸能の存在など興味がつきませんでした。

    ddaa5b7a-4254-4d47-ae89-011e3ff46251(1)(1)
    ▲猿のわなについて説明を受けるグループ

    フィールドワーク1

    フィールドワーク2

    フィールドワーク3B
    この終点の集落にお住まいのかたは1名、しかしご覧の通り、家屋は複数あり、以前はもっと人がいたことがわかります。

    ほかにも当日の写真に残せなかったのですが、能郷の猿楽の舞台は木々に合間にたたずむ白山神社にあり大変幻想的でした。毎年4月に開催される室町時代より集落で世襲で伝わってきた芸能で、国の重要無形民族文化財にもなっています。

    6e72a083-79ee-4743-9f8c-09b4fdf9c311

    フィールドワークの後、本巣市社会教育指導員として、地元の方の教育やリクリエーションのプログラムを企画運営されいる三本木さんと、本巣市観光協会会長の青木さんに根尾についてお伺いしました。

    e2974b6a-67a3-45c3-905b-bcef84324498

    話題は、淡墨桜以外にも菊花石や前述の猿楽などの観光資源と現状、猪や鹿の狩猟後の課題、旧村役場の施設を活用したサークル活用、自転車のツーリングでの来訪者の存在など多岐におよび、集落の活性やくらしの向上に日々努力されているかたのリアルな情報をお聞きできました。

    フィールドワークの分析

    フィールドワーク後に各チームで気付きや課題についての分析を行いました。

    各々で撮った写真や情報をベースに、根尾のもっと活かしたほうが良い点や、課題について、大小様々な粒度や角度でやりとりしつつ、課題の分析をします。

    付箋を利用して発散、収束をさせているチームもあれば、ネット上で写真を共有して写真ごとにコメントを書き入れたうえでディスカッションするチームなど様々でした。

    s_a

    その後、各チームのディスカッションの結果を参加者全員で共有しました。

    主にはまちの生活、観光、林業など地場産業についての話題が中心でした。

    観光については、魅力的な場所や食べ物があることを感じたうえで、一般の観光情報にはのっていないのような、川あそびの最適な場所や菊花石の見つけ方や拾えそうな場所、おいしいモーニングやジビエがたべられる場所、コミュニティバスでの散策の仕方など、実際に来てみてほしくなった情報がうまく見つけられるような仕組みや現地のかたに聞ける機会をつくっていければというような意見がみられました。

    生活面については、水源の水当番などの手間の削減や、移住に際しては不動産取引の情報やサービスなど山村地域では提供がうけづらい仕組みについてのやりとりなどがありました。

    獣害対応については食料にできるイノシシやシカについては、取れるタイミングが不定期で読めない状態でも、おすそ分けから観光や飲食につかえるようなバリューチェーンの仕組みについての話題、猿、熊については人との衝突を緩和させるような対応について、他国の取り組みなどについてもやりとりがありました。

    s_b

    s_12042745_887478381348469_8039836076055693790_n

     

    ということで初日の日程がすべて終了。

    日は暮れて、外は十五夜の月が顔をだしてました。

    根尾の旅館の住吉屋にお世話になり、自家栽培、手打ちのそばなどを楽しみ、疲れを癒しつつ、翌日のプロトタイピングにのぞみます。

    <Day2に続く> blog.idcf.jp

    <関連記事>

    根尾 IoT Bootcampレポート Day2 ハンズオン プロトタイピング

    $
    0
    0

    今回のエンジニアブログは、根尾 IoT Bootcampの2日目をお伝えします。1日目の様子は、こちらをご覧ください。

    ハンズオン

    気持ちよい晴天のなかDay2が始まりました。

    プロトタイピングにはいるまえに、まずは現実どのようなことがmyThingsを通じて実現できるのかについて、ハンズオンを行いました。

    s_3

    今回の技術的な仕掛けとして、センサーやボタンなどの機能をmyThingsを経由させて、どのようなことができるかを実際にやって理解してもらうことにしました。

     

    IoT関連のプロトタイピングですが、以前と比べるとクラウドサービスなどの進化でやりやすくなったものの、依然ソフトウェア、ハードウェア様々な知識を必要とします。

    エンジニアだけでなく、地元のかたやデザイナーのかたなど、多くの方がかかわることでイノベーションをおこすとりくみだからこそ、レイヤーを俯瞰しつつ、チームでイメージをあわせるために、ベースの技術でどのようなことができるのかを、チーム全体に知ってもらうことが重要だと考えていました。

    今回は、トリガーデバイスさんとIDCフロンティアで後述するkonashiやSensorTag, iBeaconに限定してmyThingsへ接続が簡単にできるアプリを準備することで、企画の方でも感覚的にツールでできることを理解でき、フロントサイドやデバイスサイドのエンジニアでもサンプルを改変することでプロトタイプしやすい環境を準備しました。

    7ad9e16a-16e2-472c-9973-be3c123030d6

    konashi

    ユカイ工学の提供しているフィジカルコンピューティングのプロトタイピングキットです。

    konashi.jsというアプリをつかうことで、JavaScriptでデバイスを制御できるため、ハードウェア系の知識が少ないWeb系のエンジニアでも実装が容易になる点が魅力です。サンプルとしてIDCFチャンネルサーバ(myThingsと自作電子機器をつなぐためのサーバ)へデータをおくるコードも提供しているので、簡単な連携はスマホのみでできるようになりました。

    SensorTag

    TI社のセンサーと通信モジュール、スマートフォンアプリがセットになった開発キットです。温度センサ、湿度センサ、圧力センサ、加速度計、ジャイロスコープ、磁力計などのセンサを内蔵しています。今回ハッカソン用の専用アプリを準備し、BLE経由で取得したデータをスマホ経由でIDCFチャンネルサーバにデータをあげます。

    おもにセンサーから取得したデータをトリガーにして、通知やアクションをする想定で環境を準備しました。

    なお、今回利用したCC2541はすでに販売が終了しており、新しいモデルがでています。

    iBeacon

    Apple Inc.の商標で、位置や近接の検出技術です。近接を検出することで通知やアクションをするような利用が想定されると考え、スマートフォンよりIDCFチャンネルサーバへ通知をおくるアプリを準備しました。

    s_2

    利用するインターフェースを極力スマートフォンに絞り、ユースケースもセンサーやボタンからの通知に絞ることで、1時間程度でひと通りのハンズオンができました。

    短時間でたくさんの技術情報をインプットするのでなく、大まかな可能性を伝えることで、むしろチームとして発想を促進できたのではと感じています。

    アイデアスケッチ

    実際に誰がどのようなときにどんな体験や効果を有無かをイラストにしてだしあい、まわりのアイデアやコメントを参考にアイデアを具体化していくために”アイデアスケッチ”という手法を使いました。IAMAS小林先生のリードのもとセッションが進みます。

    アイデアスケッチについてはこのサイトなど参考になります。

    アイデアスケッチ

    まずは個々で浮かんだアイデアをイラストにします。ポイントになる部分(利用者がタッチする部分など)を赤で強調し、全体を太線でかくことでアイデアをアイコン化してその後も頭にイメージが残りやすくなるそうです。

    アイデアスケッチ2

    利用する人や物の働いている状況を切り取ることで、実際にプロダクトがどんな形で使われて、効果を発揮しているかを描くことになるので、アイデアのイメージやポイントが描く人にとっても、まわりの人にも伝わりやすくなりました。

    s_72(2)

    s_71

    その後アイデアの共有を行います。一回のアイデアスケッチで一人2,3個のアイデアがでるのですが、スケッチがあるので着想のポイントが伝わりやすく、スムーズに共有がすすみます。

    一方で多様な視点があるので、アイデアを磨くきっかけにもなります。たとえば、イノシシやシカの肉や料理提供のアイデアには、現地の方から供給量が読みにくかったり、運搬が大変だったりで商業的に扱いにくい現状などのインプットがありました。

    今回は、アイデアスケッチと共有を2回おこないましたが、1度目のアイデアを参考にして2度目をだすなどして、アイデアを深めたり掛け合わせる様子が見られました。

    s_41

    最終的にでてきたアイデアから投票を行い、多く投票が集まったアイデアのなかで自分の興味がある題材にわかれて、プロトタイピングのチームをつくりました。

    プロトタイピング

    プロトタイピングは実質3時間程度でしたが、各チームかたちにできる部分まで実装ができていました。各人得意な領域が違うので、プログラムをする人から、ダンボールで模型をつくる人まで相談しながら進めていました。

    また、当初想定していた実装方法では時間が間に合わず、実装方法をかえるなども、短い時間ですが、チームで連携してプロトタイピングを進めていました。

    Team A NEO CHANNEL

    Team-A根尾の中心である駅や各種施設にボタン付きの掲示板を設置をし、観光客に地元のかたをガイドとしてマッチングする仕組みです。ボタンで提供することで、普段スマホなどを使わないような地元の人でも利用ができるとこがポイントです。

    写真右に掲示板のモックがあり、掲示板上のボタンを押すと、お店などにいる地元の人に通知が行きます。通知をうけた方がOKの返事をすることで、マッチングされる仕組みです。

    通知されるほうの媒体やタイミングなど検討していく点はありますが、掲示板とボタンという単純な仕組みを入り口にする点におもしろさを感じました。

    一方、こういった観光系のサービスを継続的に効果を確認したり、ビジネスとして町がつづけていくことを考えると、ボタンをおす方の情報をどのようなかたちで取得すると利用者にとっても、提供者にとってもいいかという点で、議論が活発に行われました。

    ボタンやスイッチのような単純な仕組みとネットの組み合わせですが、案外未開拓のように感じています。

    Team B 水監視と小水力発電

    根尾では、きれいな沢の水を利用して暮らしており、現在も重要なライフラインとなっています。

    この水の監視を当番制で行っており、当番時には時間ごとに現地に行っています。

    町の中心からは車で10ぷんくらいかかるところに水場があり、確認には当然手間がかかります。

    IMG_5776
    ▲水場の様子、水が一定量あると水が流れる仕組みになっている。

    そこでこのチームでは、取水に異常があったときだけ通知するために、水の流れ出す場所に加速度センサーつきの水車をつけ、データをもとに水車が停止したと判断するとメールで通知を行う仕組みを作成しました。木々のなかの薄暗い場所に位置しているので、太陽光でなく水で発電しエネルギーを溜め、長期間利用するイメージでしたが、発電部分はプロトタイプからは除外しました。

    全体と水車部分

    実際に水で発電するには、機材の耐久性、水の量による誤動作や過剰に蓄電した場合の制御など課題も多いのだと思いますが、すでに見えている身近な課題に答える内容でした。

     

    Team C 熊よけ鈴

    チームC熊よけ鈴をiBeaconをつかって、より広範囲に熊に人の居場所をつたえる。

    設置している鈴が、iBeaconを利用して、スマホを保持している人が熊出没地帯に近づいてくると、設置しているユーザの位置におうじてサーバが反応し、各々の連動してなる仕組み。

    熊の遭遇情報を集めるきっかけにもなる。

    こちらはIDCFチャンネルサーバをメッセージブローカとしてつかって、スマートフォンとサーボモータを設置したコンピュータの通信を仲介した構成になっています。

    ハッカソンでもたまに見受けられますが、IDCFチャンネルサーバは、WebSocketやHTTP, MQTTをブリッジできるため、myThingsの利用はしなくても、プロトタイプには有用だったりします。

    最後に

    課題の対応ありきでフィールドワークや課題の分析を通じて、チームごとにプロトタイプまでを行うことができました。

    フィールドワークを通じて根尾への関心が強くなり、根尾のかたや参加者のかたとのネットワークができ、町に関心をもつ多様な人を結びつける場としても効果的な場になったように感じました。企画系のかたは今後の仕事上のアイデアにしたり、エンジニアのかたはいままで知らなかった分野の知識や可能性などをきづくきっかけになったのではと思います。今回のワークショップを通じて引き続き対応を続けるものもでてきており、今後の展開が楽しみです。

    また、IoTは企業が先行して活用をすすめる分野ですが、ハードウェア、ソフトウェアともに利用がしやすくなってきており、身近な課題を個人やチームでDIYできるような環境や手法が整備されれば、IoTの活用シーンももっと広まってくるのではという期待を感じました。

    最後に、今回のワークショップが成功した大きなポイントは、現地で準備や情報提供のご対応を頂いたり、様々な参加者のかたが各々の意見を積極的に出しつつ、尊重してコミュニケーションをとっていただいたことがあると思います。あらためて感謝です。

    IDCフロンティアではワークショップやハッカソンでのmyThingsの活用をサポートをしています。ご興味のあるかたは、お気軽にお声掛けください。

    <ワークショップやハッカソンのお問い合わせ>

    <関連記事>

    IDCFクラウドでJenkinsのビルド失敗をMackerelで検知し、Reactioから架電

    $
    0
    0

    今回は、IDCFクラウドを使ってJenkinsでビルドが失敗した際にmackerelで検知して、Reactioから電話を掛けさせるというシステムを紹介します。

    mackerel

    こんにちは。

    カスタマーサービス本部 カスタマーリレーション部 テクニカルサポート第2グループの山下です。

    部署名長いですが、以後、お見知りおきください。

    この記事は、IDCFクラウドを使ってJenkinsでビルドが失敗した際にmackerelで検知して、
    Reactioから電話を掛けさせるというシステムの紹介になります。
    Mackerelだと、SlackやHipChatやChatworkと連携して簡単に通知できますが、
    あえてここは電話で!notificationに溢れているこの時代、ちょっとスマホがブルブルしただけでは気づきません。連絡の最強ツールは今も昔も電話です!
    忘年会や新年会の続くこの時期、業務を忘れて心置きなくワイワイできるように、導入してみてはいかがでしょうか?
    結局、電話来たら対処しないといけないんですが、初動は早くなると思います!

    概要

    Jenkinsのログである、/var/log/jenkins/jenkins.logから、
    ビルド失敗時に出るFAILUREの項目を抽出して、表示させるカスタムメトリックをMackerelに作成。
    MackerelとReactioを連携し、架電させる。

    環境

    IDCFクラウド

    CentOS 7.1 64bit
    Standard.S4 メモリ4GB

    Jenkins

    jenkins-1.639-1.1.noarch
    ※Jenkinsのインストール方法については割愛します。

    mackerel

    mackerel-agent-0.25.0-1.noarch mackerel-check-plugins-0.2.0-1.noarch

    手順

    IDCFクラウドでの、mackerelインストール、初期設定の方法は、
    下記、エンジニアブログを参照してください。
    http://www.idcf.jp/blog/cloud/mackerel1/
    http://www.idcf.jp/blog/cloud/mackerel2/
    また今回は、サービスにIDCF、ロールにtech2gと設定しています。
    サービスは、Services - サービスを追加 から登録完了です。

    mackerelプラグインインストール

    # yum install mackerel-check-plugins -y

    mackerelでカスタムメトリックを作成する方法は下記を参照ください。
    http://help-ja.mackerel.io/entry/advanced/custom-metrics
    以下、カスタムメトリックの説明URLから抜粋

    メトリックの投稿

    設定ファイルで指定するコマンドは、標準出力の各行に以下のフォーマットの出力をすることが期待されます( \tはタブ文字です):

    {metric name}\t{metric value}\t{epoch seconds}
    • 名前の最後のドットまでが共通するメトリックがひとつのグラフにまとめられ、ホスト詳細で閲覧できます。
    • メトリック名の先頭には自動的に"custom."という文字列が付与されます。
    • メトリック名に使える文字は英数字もしくはハイフン(-)、アンダースコア(_)、ドット(.)のいずれか(/[-a-zA-Z0-9_.]/)です。

    私にはmackerelさんのドキュメントにある対応が技術的に難しかった為、上記、抜粋の仕様にあわせるように、

    めんどくさがりな設定を追加しました。

    念のためバックアップ

    # cp /etc/mackerel-agent/mackerel-agent.conf{,.`date +%Y%m%d%H%M`}

    mackerel-agent.confを編集

    - /etc/mackerel-agent/mackerel-agent.conf
    

    ↓追加行

    [plugin.metrics.failure_sum_jenkins]
    command = 'echo -e &quot;failure_sum.jenkins	`tail -1 /var/log/jenkins/jenkins.log | grep -c FAILURE`	`date -u +%s`&quot;'

    反映させるため、mackerelエージェントを再起動

    # systemctl restart mackerel-agent.service

    まずは、reactioに登録

    https://reactio.jp/sign_up
    こちらのページからPCのメールアドレスを入力し、
    届いたメールの案内に従い、登録してください。

    mackerel と reactio の連携を行う

    いまmackerelでreactioチャンネルを使うと6か月無料です。
    https://reactio.jp/campaign/mackerel

    設定例

    API Keyは、Reactioのプロジェクト - プロジェクト詳細 から確認できます。
    Organization IDは、reactio登録時に付与されるサブドメインです。
    架電通知を利用するにチェックを入れると、mackerelから電話が来ます。
    連携方法は下記URLを参照ください。
    http://help-ja.mackerel.io/entry/howto/alerts/reactio

    テスト

    Jenkinsで意図的にビルドを失敗させてみましょう。
    /var/log/jenkins/jenkins.logの抜粋

    情報: {プロジェクトネーム} #xx main build action completed: FAILURE

    上記のようなログがでます。
    このログにあるFAILUREの文字列を検知して、mackerelにアラートが通知されます。

    Mackerel側の動き

    Hosts - 登録したホスト名 - 画面下のカスタムメトリックに、custom.failre_sum.* というグラフが表示されます。

    ※アラートを検知すると下記のグラフのように1以上になります。

    またAlertsの項目でも検知します。

    Reactioの動き

    Mackerelのアラートをトリガーとして、050から始まる番号から電話が来ます。

    IMG_0010reactio-05

    ちなみに、Reactioの電話を掛ける仕組みはtwilioを使っています。

    http://twilio.kddi-web.com/

    そうこうしているうちに、reactioにアラートが来ます。
    TOPメニュー - 発生中 から確認できます。

    インシデントをクリックすると詳細が表示されます

    いかがでしたでしょうか。
    電話は来ましたでしょうか?

    注意点

    1)Reacioのインシデントは対応完了に!

    長時間更新されていません。
    対応漏れの可能性がありますので、ご確認ください。
    というように後追いの電話が定期的に来ます。
    対応漏れには気をつけましょう。

    2)アラート重複検知

    今回紹介した自己流カスタムメトリックだと、下記のコマンドの実行結果を見ています。

    tail -1 /var/log/jenkins/jenkins.log | grep -c FAILURE

    Mackerelの1分周期のチェックだと、
    /var/log/jenkins/jenkins.logに最終行に FAILUREがある限りアラートが発報します。。
    つまり、次にSUCCESS等のログがでない限りアラートが続きます。

    Mackerelプラグインでは、アラートは重複チェックされない為、
    このようなことは起きません。
    ただし、reactioとの連携はできないようでした。
    私のようなめんどくさがりな設定ではなく、mackerelプラグインを使ったログ監視(check-log)の方法について紹介します。
    mackerelプラグインのログ監視(check-log)の紹介ページはこちら
    http://help-ja.mackerel.io/entry/howto/check/log
    /etc/mackerel-agent/mackerel-agent.conf に、下記を追加

    [plugin.checks.jenkins_log]
    command = &quot;usr/local/bin/check-log --file /var/log/jenkins/jenkins.log --pattern 'FAILURE' --return&quot;

    説明

    /var/log/jenkins/jenkins.log からFAILURE行を監視して、検知したらMackerelにアラートを飛ばします。

    一度、引っかかったFAILURE行については重複チェックされないようになっています。
    反映させるため、mackerelエージェントを再起動

    # systemctl restart mackerel-agent.service

    mackerel pluginのアラートでの表示

    他、Mackerelの機能

    用途は異なりますが、サービスメトリックであれば、reactioとの連携は可能です。
    https://mackerel.io/ja/features/service-metrics

    あと、trial、有料プランのみのサービスになりますが外形監視でも、reactioとの連携は可能です。
    http://help-ja.mackerel.io/entry/external-monitoring

    今回は、Jenkinsのビルド失敗を検知していますが、/var/log/messeagesのある文字列を拾って来たり
    などなど柔軟に監視やグラフ化が可能です。
    ぜひ、今回紹介できなかった他のプラグインも使ってみてください
    http://help-ja.mackerel.io/entry/howto/mackerel-agent-plugins

    IDCFクラウドなら月額料金無料、監視対象のサーバー台数無制限でMackerelをお使いいただけます。

    詳細は下記URLをご参照ください
    http://www.idcf.jp/cloud/mackerel/

    最後になりますが、Reactioのような電話通知や、
    さらに障害対応まで自動化できる、株式会社フィックスポイント様の
    Kompiraサービスもぜひお試しください!
    http://www.kompira.jp/about

    以上

    <関連記事>

    MastodonをIDCFクラウド上に構築してみた

    $
    0
    0

    Mastodonとは

    Mastodon(マストドン)はTwitterライクなSNSです。誰でも独自のMastodonインスタンスを作ることができて、すでに多数のインスタンスが立ち上がっています。登録されたインスタンスは、Mastodon instancesで参照することができます。

    好きなインスタンスに参加するもよし、自分ひとり用のインスタンスを立ち上げるもよしです!本日はMastodonをIDCFクラウド上で構築する手順を紹介します。

    f:id:ykanasugi:20170424140134j:plain

    利用環境

    • IDCFクラウド light.S2 (1 CPU, 2GB メモリ)
    • Let’s EncryptでSSL証明書を発行
    • CentOS 7.3 64-bit テンプレート

    仮想マシンの作成に関してはめちゃ楽ガイドを参照してください。

    SSH用のポートにポートフォワードとファイアウォールの設定をしてSSHで接続します。

    作業ディレクトリ作成

    今回の作業用ディレクトリとして、/home/mastodonを作成します。

    # mkdir -p /home/mastodon

    dockerインストール

    Mastodonはdockerコンテナを利用して構成されているため、dockerをインストール・設定していきます。

    # yum -y install docker

    docker保存先を変更

    CentOS 7のテンプレートを利用する場合、ルートディスクが15GBで構成されます。ルートディスクのサイズは変更できないため、ボリュームを追加・アタッチし、dockerの保存先を変更しておきます。(mastodonのDBが肥大化する恐れもありますので)

    仮想マシンへのデータボリュームの追加・パーティション作成・マウントについては、IDCFクラウドFAQを参照するかティアラちゃんに質問してみてください。

    ディスクの追加完了後、下記ファイルを編集し保存先を変更します。 今回は/data/dockerというディレクトリを作成し、そちらを保存先にしました。

    # vi /etc/sysconfig/docker

    下記行がありますので、

    OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'

    末尾に下記を追記します。

    OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false -g /data/docker'
    

    docker-composer準備

    MastodonはPostgreSQLやRedisも利用しますので、docker-compose.xmlファイルを利用してコマンド一発で起動できるように準備します。

    # curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    # chmod +x /usr/local/bin/docker-compose

    インストールが正常にされたかを確認します。

    # docker-compose --version
    docker-compose version 1.12.0, build b31ff33

    バージョンが表示されればOKです。

    dockerの起動

    dockerを起動します。

    # systemctl start docker

    Mastodonのインストール

    GitHubからcloneする

    MastodonをGitHubからcloneします。

    # git clone https://github.com/tootsuite/mastodon

    データの永続化設定

    標準状態のままですと、データの永続化設定となっていないためコンテナを停止してしまうとデータが削除されます。 ユーザの登録情報等を永続的に維持するためにdocker-compose.xmlファイルを編集します。

    # cd /home/mastodon/
    # vi docker-compose.yml

    下記のコメントアウトされているコンフィグを有効化します。(冒頭の#を外す)

    #    volumes:
    #      - ./postgres:/var/lib/postgresql/data
    
    #    volumes:
    #      - ./redis:/data

    環境ファイルをコピーし設定する

    # cp .env.production.sample .env.production

    シークレットキーの発行

    下記コマンドを実行してシークレットキーを発行します。(少し時間がかかります。)

    # docker-compose build
    # docker-compose run --rm web rake secret

    キーは3つ必要なため、上記の'docker-compose run –rm web rake secret'コマンドを合計3回実行する必要があります。最後に表示された長い文字列をコピーして次のステップで貼り付けます。

    環境ファイルを編集してシークレットキー・ドメイン名・HTTPSを有効化するかの設定をします。example.comとあるところはご自身のMastodonで利用するFQDNを設定してください。

    # vi .env.production
    PAPERCLIP_SECRET=(発行されたキー①を貼り付け)
    SECRET_KEY_BASE=(発行されたキー②を貼り付け)
    OTP_SECRET=(発行されたキー③を貼り付け)
    LOCAL_DOMAIN=example.com
    LOCAL_HTTPS=true

    データベースのマイグレーションとフロントエンドコンパイル

    下記コマンドを実行します。

    # docker-compose run --rm web rails db:migrate
    # docker-compose run --rm web rails assets:precompile

    Mastodonコンテナを起動

    # docker-compose up -d

    docker psコマンドを実行すると起動しているコンテナ一覧を表示することができます。

    # docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
    ae2dc853c315        gargron/mastodon    "bundle exec sidekiq "   4 seconds ago       Up 3 seconds        3000/tcp, 4000/tcp                 mastodon_sidekiq_1
    922437f3ff8b        gargron/mastodon    "bundle exec rails s "   4 seconds ago       Up 3 seconds        0.0.0.0:3000->3000/tcp, 4000/tcp   mastodon_web_1
    f72ac86fa74e        gargron/mastodon    "npm run start"          4 seconds ago       Up 3 seconds        3000/tcp, 0.0.0.0:4000->4000/tcp   mastodon_streaming_1
    147bec4a1086        redis:alpine        "docker-entrypoint.sh"   5 minutes ago       Up 5 minutes        6379/tcp                           mastodon_redis_1
    75e3c4008fb8        postgres:alpine     "docker-entrypoint.sh"   5 minutes ago       Up 5 minutes        5432/tcp                           mastodon_db_1

    Nginxのインストール

    epelリポジトリを追加して、NginxとCertbotをインストールします。

    # yum -y install epel-release
    # yum -y install nginx certbot python-certbot-apache

    Certbotを利用してSSL証明書を発行する

    Certbotを利用し、Let’s Encryptから証明書を発行してもらうためには、443番ポートへのアクセスが許可されている必要があるので、管理コンソールからファイアウォールとポートフォワードの設定を追加します。443番のファイアウォールは、ソースIPをANYで開けてください。 具体的な設定方法については、めちゃ楽ガイドを参照してください。

    下記コマンドを実行して証明書を取得します。

    # certbot certonly --standalone -d <mastodonで利用するFQDN>

    Nginx設定ファイルを準備する

    MastodonのGitHubページ内にあるconfファイルの内容をコピーします。 下記ディレクトリに、mstdn.confとして保存します。

    # cd /etc/nginx/conf.d
    # vi mstdn.conf
    コピーした内容を貼り付け

    server_name、SSL証明書へのフルパスとrootを変更します。 また、今回はRSA鍵を使用するため、ssl_dhparamの行はコメントアウトもしくは削除します。

    server_name example.com;
    
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    # ssl_dhparam         /etc/ssl/certs/dhparam.pem;
    
    root /home/mastodon/public/;

    Nginxを起動する

    # systemctl start nginx.service
    

    Mastodonへアクセスする

    設定したFQDNに対してブラウザでhttpsアクセスします。ユーザ登録画面が表示されれば完了です。

    f:id:hikita:20170421175221p:plain

    ユーザ認証をコマンドラインで実行する

    登録をしてもメールサーバの設定をしていないため、登録後の認証用メールを受信することができません。 そのため、コマンドラインからユーザの認証を実施します。

    # docker-compose exec web bundle exec rails mastodon:confirm_email USER_EMAIL=<認証するメールアドレス>

    認証が完了するとログインできるようになりますので、ログインしてトゥートしてみましょう!

    f:id:hikita:20170421175730p:plain

    最後に

    実は、IDCFクラウドでMastodonを運営するには結構メリットが多いのです。

    もしアクセスが伸びてきて仮想マシンのスペックが足りなくなった場合、IDCFクラウドには無停止でスケールアップする機能(ダイナミックスケール)もあるのでご活用ください。

    また、IDCFクラウドのメリットとして、アウトバウンドの転送量は3,240GBまで無償範囲内でご利用いただけます。超えてしまった分は10円/GBの従量課金となります。転送量の急増が心配な方は、予算アラート機能を使ってみてください。

    Viewing all 122 articles
    Browse latest View live