まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

2016/09

IBM Bluemix 上でスケーラブルな検索エンジンである ElasticSearch サービスが利用可能になりました:
https://console.ng.bluemix.net/catalog/services/compose-for-elasticsearch/

2016092906


実は以前からこの Compose for ElasticSearch サービスは利用可能な状態ではありましたが、まだ Bluemix との統合が完全ではなく、別途 Compose 社との契約が必要になる状況でした。それが先日 2016/Sep/22 のアップデートで Bluemix 画面から直接契約可能(というか、サービスとして追加やバインドが可能)になったのでした。

実際にサービスとして追加し、バインドしたランタイムからはこの ElasticSearch サービスを利用するための接続情報が環境変数から確認できます:
2016092901


この環境変数 VCAP_SERVICES 内の "compose-for-elasticsearch" と書かれたエントリー内 "credentials" の "uri" に記載された値が ElasticSearch サービス(のドキュメントルート)にアクセスするための URL になります(この図の XXXX 部分がユーザー名、YYYY 部分がパスワードになるので、取扱いにはご注意ください):
  :
  :
  "compose-for-elasticsearch": [
    {
      "credentials": {
        "db_type": "elastic_search",
          :
        "uri": "https://XXXX:YYYY@bluemix-ZZZZZZ.dblayer.com:NNNNN/"
          :
    }
  ]
  :
  :

試しに同 URL にブラウザでアクセスすると、ElasticSearch サービスのバージョン情報などの概要を確認することができます。この例だとバージョン 2.4.0 が動いていることがわかります:
2016092902


この ElasticSearch サービスで既に導入されているプラグインはあるのでしょうか?その確認には、以下の URL (上記 uri の値に "_nodes?plugin=true&pretty" を足したもの)にブラウザや curl などで GET アクセスします:
(上記 "uri" の値)_nodes?plugin=true&pretty

するとプラグイン情報を含むサーバー情報が整形された形で確認できるような結果が表示されます:
2016092903


この画面内で "plugins" を検索してスクロールすると、実際に導入済みのプラグインの一覧を確認できます。この例では "cloud-aws" と "head" と "kopf" の3つのプラグインが導入済みであることが分かりました:
2016092904


head プラグインは ElasticSearch では定番プラグインの1つで、ElasticSearch クラスタのウェブインターフェースを提供してくれるプラグインです。なので "uri" の値の最後に "_plugin/head" を付けてアクセスすると、head プラグインの画面が(特にカスタマイズ無しで)表示することができます:
2016092905


Bluemix がまた1つ便利になりました。


Microsoft が .Net アプリケーションを動かすためのフレームワークとしてオープンソース化を進めていた ".Net Core" の正式バージョン 1.0 がリリースされました:
https://www.microsoft.com/net/core

この .Net Core が .Net アプリケーションを動かすための基盤であり、同時に公開された ASP.Net Core は Web アプリケーションの開発基盤となる部分になります。従って .Net Framework のうちの GUI を除いた開発環境のオープンソース化が実現され、Linux や MacOS 上で動かすことができるようになった、ということになります。

というわけで、早速自分の CentOS 環境に導入して使ってみました。なお、.Net Core は CentOS 7 以降に対応しているので、CentOS 7.x 環境を用意した上で以下を説明します。

まずは .Net Core 1.0 をインストールします。CentOS 7 環境で(SSH などで)ターミナルログインし、以下のコマンドを実行します(この例では実体を /opt/dotnet/ 以下にインストールし、/usr/local/bin へシンボリックリンクしています):
$ sudo yum install libunwind libicu
$ curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=827529
$ sudo mkdir -p /opt/dotnet
$ sudo tar zxf dotnet.tar.gz -C /opt/dotnet $ sudo ln -s /opt/dotnet/dotnet /usr/local/bin

インストールはこれで完了です。では実際にアプリを作ってみましょう。雛形として用意されているアプリがいわゆる "Hello World" なので、"helloworldapp" というフォルダを作り、その中にアプリを作ることにします:
$ mkdir helloworldapp
$ cd helloworldapp
$ dotnet new

上記の最後に入力している "dotnet new" コマンドで雛形作成を含めた初期化を行います。この初期化によって、Program.cs ファイルと project.json ファイルという2つのファイルが作成されます:
2016092901


このうちの Program.cs ファイルがソースコードに相当するファイルです。デフォルト状態では "Hello World!" という文字列をコンソールに表示(WriteLine)するだけの内容になっています:
2016092902


これを vi などのエディタで適当に書き換えてみましょう。以下の例では "ハロー .Net ワールド!!" という日本語文字列に変えてみました:
2016092903


もう1つの proejct.json ファイルは依存関係などのパッケージ情報が記述されています。こちらは今回は変更が不要です:
2016092904

ではいよいよ CentOS 上でこの .Net アプリを動かしてみましょう。"dotnet run" と入力します:
$ dotnet run

成功すると以下のようにコンパイルされ、実行されて、書き換えた文字列が表示されるはずです:
2016092906


なお実行時にコンパイルされるので、このコマンド実行後には bin と obj フォルダがそれぞれ生成されているはずです:
2016092901


今回は CentOS 7.x 上でのインストールから実行までを紹介しました。実行手順は全てで共通ですが、インストール方法はシステムによって若干異なります(Docker イメージも公開されてるんですね・・・)。詳しくは公式ドキュメントを参照ください:
https://www.microsoft.com/net/core


IBM Bluemix の利用者に提供されているサービスの1つに IBM DevOps Services(以下、IDS)があります。名前の通り、DevOps のための統合環境サービスなのですが、事実上「ウェブから使えるエディタ」として認識している人もいらっしゃるかもしれません:
2016091306


もちろん統合環境であるからには、こうした「ウェブだけでソースコードが編集できる」機能があることも重要ですが、それだけではありません。ソースコードのバージョン管理として事実上の標準となった Git のリポジトリ機能も使えますし、ビルド&デプロイの管理機能も付属しています。これらはバラバラに(=自分の使い慣れたツールと組み合わせて)使うこともできますし、この環境だけで全て利用することもできます。今回はその前者の例として、IDS を Git のリポジトリとして(のみ)使う例を紹介します。要はソースコードの編集は普段使い慣れたローカルマシンのエディタを使いつつ、ソースコードのバージョン管理に IDS を使おう、という考え方です。必ずしも Bluemix アプリケーションではない、普通のウェブアプリケーションやツールのソースコード管理としても IDS が使える、という使い方をイメージしています。

まずは IDS にウェブブラウザでアクセスして IBM Bluemix の ID とパスワードでログインします:
http://hub.jazz.net/


初めて IDS を使う場合はここでユーザー名の別名を聞かれたりするので適当に決めて答えておきましょう。ただ、ここで決めた名前がこの後作成する Git リポジトリの URL の一部になるのでそのつもりで。

ログイン直後の画面です。既にプロジェクトを利用していたりすると、それらが表示されている画面になるので、見た目は人によって多少変わるかもしれません。以下の画面はまだ何も使っていない、まっさらな状態でのプロジェクト一覧画面です:
2016091301


では早速 Git リポジトリとしてのプロジェクトを1つ追加しましょう。"Start coding" と書かれた大きなアイコン部分をクリックします:
2016091301


ここでプロジェクトの名称(以下の例では "my1stApp")を指定します。今回はこの IDS 内に新しいプロジェクトを作成するので、"Create a new repository" を選択します:
2016091302


続いてリポジトリの作成先を指定するので、"Create a Git repo on Bluemix" を選択します:
2016091303


するとアイコンのすぐ下に今から作成する Git のリポジトリ URL が確認できます。後で再確認することもできますが、一度ここでメモしておきましょう。 また作成するリポジトリにサンプルの README を含めるかどうかを選択するチェックボックスが表示されています。ここでは最初に README を含めておくことにします(任意です)ので、チェックボックスを ON にしておきます:
2016091304


続けてオプションが3つ表示されています。上から順に (1)プライベート(非公開)リポジトリにするか、(2) Scrum 管理機能を追加するか、(3) Bluemix アプリケーションプロジェクト機能を追加するか、です。この例では全て OFF にしていますが、いずれも必要に応じて ON/OFF してください。最後に "CREATE" ボタンを押すと、この設定で Git リポジトリが作成されます:
2016091305


Git リポジトリが作成されると、このような画面に切り替わります。指定した名前のプロジェクトが生成され、その中に License.txt と(オプションで指定した)README.md が含まれている状態で生成されています:
2016091306


画面内で Git のブランチ(この図では master)を表示する部分の右側にダウンロードアイコンが表示されています。現在のブランチの状態でソースコードをまとめてダウンロードする場合はこのアイコンをクリックします(今は行わなくて構いません):
2016091307


また、更にその右側に "Git URL" と書かれた箇所があり、そこをクリックすると改めて Git リポジトリの URL を確認することができます。忘れてしまった場合はこの方法で Git URL を確認してください(このすぐ後に使います):
2016091308


では試しにこの Git プロジェクトの中身を別マシンに clone してみましょう。Git が導入されている環境下で以下のように自分の Git URL(以下の例では https://hub.jazz.net/git/teyande/my1stApp)を指定して git clone してみます:
# git clone https://hub.jazz.net/git/teyande/my1stApp

成功するとこのように License.txt と README.md を含む my1stApp というディレクトリが作成され、現在のリポジトリがクローンできたことがわかります:
2016091301


次にこのプロジェクトディレクトリに移動して、ローカルマシンで変更を加えてみます。本当はここでは vim とか Sublime などの普段使い慣れたエディタ等を使ってファイルを編集することを想定していますが、以下の例では echo コマンドを使ってシンプルな phpinfo.php というファイルを1つ追加しています。何か新しいテキストファイルを1つ(以上)同じディレクトリ内に作成してみてください:
# cd my1stApp
# echo '<?php phpinfo(); ?>' > phpinfo.php

この時点でディレクトリにはもともと存在していた2つのファイルに加え、いくつかのファイルが追加されている状態になっています:
2016091302


ではこの変更を Gir リポジトリに反映させましょう。git add して、git commit します:
# git add .
# git commit -m 'phpinfo.php added.'

こんな感じでローカルリポジトリへのコミットが成功するはずです:
2016091303


では最後に、このローカルリポジトリへの変更をリモートリポジトリへも反映させるべく、git push します。途中でユーザー名やパスワードを聞かれるので、IBM Bluemix のIDおよびパスワードをそれぞれ指定して入力します:
# git push
  :
  :

Username for 'https://hub.jazz.net': bluemix@teyan.de
Password for 'https://bluemix@teyan.de@hub.jazz.net':
  :
  :

↓こんな感じになれば成功です:
2016091304


git push が成功すると、IDS 内のファイルにもその変更が反映されているはずです。この例では元のプロジェクトには存在していなかった phpinfo.php ファイルが git push によって送り込まれ、プロジェクトファイルの一部として追加されていることがわかります:
2016091305


とりあえず Git リポジトリとしての機能が使えることがわかりました。ただこれだけなら GitHub と変わりません。GitHub にない機能の1つとしては「(無料で)プライベートリポジトリが持てる」ことが挙げられます。例えば今回は作成時に Private チェックボックスをオフにしていたので、この時点ではリポジトリは公開されており、同じ URL を誰からでも(IBM Bluemix のアカウントを持っていない人からでも)参照することができる状態になっています:
2016091401


公開状態で作成されたリポジトリをプライベートな非公開状態に変更するには、リポジトリ画面右上の歯車アイコンをクリックし、左メニューから "OPTIONS" を選ぶと、"Private" のチェックボックスが現れます。ここにチェックが入っていれば非公開、入っていなければ公開状態となります:
2016091402


非公開状態に切り替えてみましょう。"Private" チェックボックスを ON にして、"SAVE" ボタンをクリックします:
2016091403


この状態で、同じリポジトリ URL にアクセスすると IBM Bluemix アカウントでログインしていない場合はログインが求められるようになります。また自分(リポジトリのオーナー)以外の ID でログインすると、以下の様な「非公開です」という画面だけが表示されて、中身を確認することはできなくなります:
2016091404


Git のリポジトリを非公開状態で管理しようとすると、GitHub では有償アカウントが必要になります。GitHub 以外にオープンソース製品などで独自にプライベートリポジトリを作れないことはないのですが、IBM Bluemix の IDS を使えば、実質的に無料でプライベートリポジトリまで含めて利用することができる、ということになりますね。 IDS は単なる Git のリポジトリ以上の機能がありますが、この無料のプライベートリポジトリ機能だけでも魅力的だと思っています。


IBM Bluemix からは IBM のウェブアプリケーションサーバー製品である WebSphere Application Server(以下、WAS)が提供されており、メニューから選ぶだけでホスティングされた WAS 環境を利用することができます。以前にその内容をブログで紹介させていただいたこともあり、手順についてはこちらを参照ください:
WebSphere Application Server on Bluemix を使う

 ↑当時はまだβ版で、その前提での紹介になっていますが、現在は正式サービスになっています。


上記リンク先を見ていただくとわかりますが、このサービスで提供される WAS 環境を利用するには現状、 VPN 接続が必要です。例えば下図でいうと同じネットワーク内にある青い3台のマシンの中で、1台だけが WAS インスタンス(ピンクのマシン)に VPN 接続しているとします。この場合、VPN 接続した1台のマシンは WAS に繋がりますが、他の2台は WAS に繋がりません。なので、本格的に WAS を利用するにはちと不便な環境ということになります:
2016091201


今回紹介するのはこの不便さをなるべく簡単に解消するために、2つの設定を行うことで、VPN 接続していない2台のマシンからも WAS を使えるようにする、というものです。そしてその2つの設定がこちらです:
 ・VPN 接続したマシンにルーティングと NAT の設定を行う(要はソフトウェアルータにする)
 ・VPN 接続していないマシンにルーティング設定を追加する
2016091202

これによって、VPN 接続していない PC も「ルーティングを1つ追加する」という手順だけで WAS が接続できるようになる、というものです。VPN 接続には専用クライアントの導入なども必要でしたが、ルーティングの追加だけならコマンドを1つ実行するだけでできる(ネットワーク管理者権限などを持っていて、DHCP サーバーの設定を変更できる場合は DHCP の設定だけで、ユーザーは何もしなくてもできる)ので、少しはハードルが下がるかな、と思っています。

以降の説明のため、以下の様な環境であることを想定します:
2016091203


WAS インスタンスの IP アドレス: 169.45.191.94

VPN 接続するマシンの OS: Linux(CentOS 6)
VPN 接続するマシンの IP アドレス: 192.168.0.104
VPN 接続するマシンのネットワークインターフェース: eth0
VPN 接続するマシンの VPN 接続側のネットワークインターフェース: tun0
VPN 接続するマシンの属するネットワーク: 192.168.0.0/24

VPN 接続しないマシンのネットワークインターフェース: eth0


では実際の設定作業を紹介します。まずは Linux マシンから WAS インスタンスに VPN 接続を行うための OpenVPN を導入します:
# rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum install --enablerepo=epel openvpn

そして、この OpenVPN を使って WAS インスタンスに VPN 接続します。VPN 接続に必要な構成ファイルは WAS サービスインスタンスの「管理コンソールにアクセスするには、VPN に接続している必要があります」と書かれた箇所の右側の?マークをクリックした先の画面から「VPN 構成ファイル」と書かれたアイコンをクリックするとダウンロードできます:
2016091501


Bluemix 画面からダウンロードした構成ファイル一式(wasaas-uss.ovpn を含む zip ファイル)を OpenVPN を導入した Linux 機の /root/openvpn/ 以下に展開し、以下のコマンドを実行します(実行したまま終了する必要があるので、SSH 接続で行う場合は screen などを実行してから行い、最後にデタッチする必要があります):
# cd /root/openvpn/
# openvpn /root/openvpn/wasaas-uss.ovpn

次に VPN 接続した Linux マシンをソフトウェアルータ化するための設定を行います。そのためには IP フォワーディング機能を有効にする必要があります。以下のコマンドを実行します:
# echo 1 > /proc/sys/net/ipv4/ip_forward

続いて /etc/sysconfig/network ファイルを書き換えます。具体的には以下の最後の3行を書き足します(GATEWAY に何か記述されていた場合は消去しておいてください):
NETWORKING=yes
HOSTNAME=’localhost.localdomain’
FORWARD_IPV4=yes
GATEWAY=
GATEWAYDEV=

次に IP フォワーディング機能を恒久的に有効にするため、/etc/sysctl.conf ファイルを編集して、net.ipv4.ip_forward = 1 に書き換えます。また sysctl コマンドでこの編集後のファイルを読み込んで有効にします:
# vi /etc/sysctl.conf

  :
  :
net.ipv4.ip_forward = 1
  :
  :

# sysctl -p /etc/sysctl.conf

最後に iptables を使ってルータ化&NATフィルタリングを行います。上記リンク先の手順で Linux PC を VPN 接続した場合、そのネットワークインターフェイスは tun0 になっているはずです。なので、/etc/sysconfig/iptables を書き換えて目的の接続先(今回の例では 169.45.191.94)への接続は tun0 経由で NAT 接続するように変更し、その上で iptables を有効に(または再起動)します:
# vi /etc/sysconfig/iptables

*nat
:PREROUTING ACCEPT [4:180]
:POSTROUTING ACCEPT [2:121]
:OUTPUT ACCEPT [2:121]
-A POSTROUTING -s 192.168.0.0/24 -d 169.45.191.94/32 -j MASQUERADE
COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [215:27937]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -o tun0 -j ACCEPT
-A FORWARD -i tun0 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

# /etc/init.d/iptables start (または restart)


これで Linux 機はソフトウェアルータになっているはずです。あとは VPN 接続していない同一ネットワーク上のマシンに対して、「WAS(169.45.191.94) に接続する時は 192.168.0.104 経由で接続する」ことを教えます。Linux/UNIX 系マシンであれば以下のようなコマンドを実行します:
# route add 169.45.191.94 gw 192.168.0.104 eth0

Windows 機の場合は少しコマンドが異なり、以下の様なコマンドを管理者権限で実行します:
> route add 169.45.191.94 mask 255.255.255.255 192.168.0.104

これでルーティングの設定も完了しています。試しに VPN 接続していない(上記の route コマンドを実行した)マシンから WAS インスタンスに接続してみましょう。ウェブブラウザを開いて https://(WAS マシンの IP アドレス):9043/ibm/console/ にアクセスするか、または Bluemix のサービス画面から「管理コンソールを開く」をクリックします:
2016091201


ルーティング設定前であれば「ホストが見つからない」エラーになるはずですが、ホストが見つかった上で「安全な接続ではない」というエラーになるはずです。これはセキュリティ設定のエラーなので、この状態を回避すれば管理コンソールにアクセスできます。FireFox であれば「エラー内容」を書かれたボタンをクリックします:
2016091202


「例外を追加」します:
2016091203


以下の様な確認画面が表示されたら「セキュリティ例外を承認」をクリックします:
2016091204


これで管理コンソールにアクセスできるようになっているはずです!:
2016091205


正しいユーザー ID とパスワードを入力することで、実際の管理画面にアクセスすることができます。これで VPN 接続しなくても、ルーティング設定だけで Bluemix の WAS インスタンスにアクセスすることができるようになりました。SSH 接続についても同様にできます:
2016091206


なお、設定したルーティングを元に戻すには、上記で実行した route コマンドの add 部分を del や delete に変えて実行します:
# route del 169.45.191.94 gw 192.168.0.104 eth0

> route delete 169.45.191.94 mask 255.255.255.255 192.168.0.104

本当は全て DHCP 設定の中で行えるとユーザーとしては楽なのですが、今回紹介した方法であればネットワーク管理者でなくても(1コマンド実行するだけで)設定できて、比較的簡単に実現できると思っています。


IBM Bluemix からも提供されている NoSQL 型データベースの DBaaS "Cloudant" の開発者向けエディションが Docker イメージでの無料提供が開始されました:
https://hub.docker.com/r/ibmcom/cloudant-developer/

2016091004


1インスタンスでスケーリングなし&サポートもなし、という条件は付きますが、IBM Bluemix などのアプリケーション開発者がローカル環境だけでシングルテナントの Cloudant の環境を使うことができるようになります。以下、その手順を紹介します。

まず利用にあたり、docker 1.9 以上が必要です。RHEL/CentOS の 6.x の場合は docker 1.7 までしかサポートされていないため、バージョン7以上を用意する必要があります。

docker 環境が用意できたら、以下のコマンドで開発者向け Cloudant のイメージを pull します:
# docker pull ibmcom/cloudant-developer

そして以下のコマンドでローカル環境上にコンテナを作り、起動します:
# docker run --privileged --detach --volume cloudant:/srv --name cloudant-developer --publish 8080:80 --hostname cloudant.dev ibmcom/cloudant-developer

初回起動時のみ、ライセンス規約に同意する必要があります。以下のコマンドを実行してライセンス画面を表示します:
# docker exec -ti cloudant-developer cast license --console

すると以下の様なライセンス内容がコンソールに表示されます。同意する場合は "1" を入力してください:

2016091001


また、これも最初の1回だけ利用前にデータベースを初期化する必要があります。初期化は以下のコマンドを実行します:
# docker exec cloudant-developer cast database init -v -y -p pass

これで準備は完了です、簡単ですね。実際にローカル環境の Cloudant を利用するにはウェブブラウザで以下のアドレスにアクセスします:
http://(docker が動いているマシンのIPアドレス):8080/dashboard.html

すると以下の様なログインが画面が現れます。デフォルトでは
 Username = admin
 Password = pass
という ID & パスワードがセットされているので、この値を入力してログインしてください:

2016091002


ログインが成功すると、見慣れた Cloudant のダッシュボード画面が表示されます。後はいつもと一緒です。これでいつでもローカルで手軽に使える Cloudant 環境が用意できました:

2016091003

このページのトップヘ