ぴよぴよエンジニアの日記

クラウドベンダーに勤める見習いSEの日記です。発言は私自身の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

Watson Developer Cloud .NET Standard SDK を Xamarin プロジェクトに追加してみた

Watson Developer Cloud .NET Standard SDK ver 1.1.0 が 7月4日にリリースされました.

www.nuget.org


今まで表記上は .NET Standard 1.6 対応だったのですが、実際は Xamarin や .NET Core では使えないという状態でした.

しかしながら、今回のアップデートで名実ともに .NET Standard 1.3 対応となっています.
もちろん Xamarin でも使えます!


docs.microsoft.com

リンク先のバージョン対応表でご確認いただけますが、.NET Standard 1.3 では Xamarin.iOS 10.0, Xamarin.Android 7.0, UWP 10.0 などでお使いいただけます.(UWP で使えるのは嬉しい方もいらっしゃるのではないでしょうか)


今回は Xamarin の Shared Project に Watson Developer Cloud の SDK を追加するまでの流れをやってみます.



ビルド環境



NuGet パッケージの追加

Android / iOS プロジェクトに NuGet パッケージを追加します.

f:id:Santea:20170715143253p:plain

NuGet パッケージの検索で "Watson Developer Cloud" と検索します.

検索結果の一番上にある "IBM.Watson Developer Cloud" はそれぞれの API パッケージが依存するコアパッケージです.
特定の API を使用する場合は、各 API 名のパッケージを追加してください.

今回はコアパッケージのインストールを試してみます.

For adding package 'IBM.WatsonDeveloperCloud.1.1.0' to project 'WatsonSdkSample.Droid' that targets 'monoandroid70'.
Package 'IBM.WatsonDeveloperCloud.1.1.0' already exists in folder '/Users/DaikiKawanuma/Projects/WatsonSdkSample/packages'
Added reference 'IBM.WatsonDeveloperCloud' to project 'WatsonSdkSample.Droid'.
Added package 'IBM.WatsonDeveloperCloud.1.1.0' to 'packages.config'
Added file 'packages.config' to project 'WatsonSdkSample.Droid'.
Successfully installed 'IBM.WatsonDeveloperCloud 1.1.0' to WatsonSdkSample.Droid
Executing nuget actions took 2.96 sec

IBM.WatsonDeveloperCloud successfully added.
For adding package 'IBM.WatsonDeveloperCloud.1.1.0' to project 'WatsonSdkSample.iOS' that targets 'xamarinios10'.
Package 'IBM.WatsonDeveloperCloud.1.1.0' already exists in folder '/Users/DaikiKawanuma/Projects/WatsonSdkSample/packages'
Added reference 'IBM.WatsonDeveloperCloud' to project 'WatsonSdkSample.iOS'.
Added package 'IBM.WatsonDeveloperCloud.1.1.0' to 'packages.config'
Added file 'packages.config' to project 'WatsonSdkSample.iOS'.
Successfully installed 'IBM.WatsonDeveloperCloud 1.1.0' to WatsonSdkSample.iOS
Executing nuget actions took 408.5 ms

IBM.WatsonDeveloperCloud successfully added.

無事追加されました.




以上です.

Bluemix 上に Redmine の Docker イメージをデプロイしてみた

今回は今までのエントリーとは少し違った変わり種です.


最近始めたチームプロジェクトを TiDD 風に進めたく、Redmine を運用することになりました.

Redmine をどこに構築するかいくつか選択肢がありましたが、せっかくなので Bluemix 上に構築することにしました.

今回は Bluemix 上に Redmine の Docker イメージをデプロイし、カスタムドメインhttps 化するまでの流れをやってみます.





前提

今回は以下の環境を使用しています.

  • macOS Sierra 10.12.5
  • Bluemix CLI version 0.5.4+ae22935-2017-05-18T06:24:28+00:00
  • Docker version 17.03.1-ce, build c6d412e



Docker のインストー

最初は Docker のインストールです.
(既に Docker をインストール済みの方は読み飛ばしていただいて構いません)


f:id:Santea:20170617221553j:plain

Install Docker for Mac | Docker Documentation

上記リンクから "Get Docker for Mac [Stable]" を選択し、Docker.dmg をダウンロードし、インストールします.

$ docker -v
Docker version 17.03.1-ce, build c6d412e

上記コマンドを実行し、バージョン情報が表示されていればインストール成功です.



Bluemix CLI とBluemix Container Service plug-in のインストー

IBM Bluemix Container Service

Docker イメージのデプロイ先として、IBM Bluemix Container を用います.


Bluemix Container を利用するためには Bluemix CLI が必要なのでまずはこれをインストールしましょう.

Bluemix CLI Home

上記リンクにアクセスし、CLI をダウンロードします.

f:id:Santea:20170617220734p:plain

Bluemix_CLI_0.5.4.pkg(Macの場合)を起動すると上記画面が表示されますので、手順に従ってインストールします.

$ bx -v
bx version 0.5.4+ae22935-2017-05-18T06:24:28+00:00

ターミナルで上記コマンドを実行してバージョン情報が表示されていればインストール成功です.


続いて Bluemix Container Service Container Service plug-in のインストールを行います.
コマンドラインで以下に続くコマンドを実行してください.

$bx login -a https://api.ng.bluemix.net

Bluemix CLI にログインします.

$bx plugin install IBM-Containers -r Bluemix
$bx plugin list
インストール済みプラグインをリストしています...

プラグイン名     バージョン   
IBM-Containers   1.0.0   

インストール済みプラグインのリストに IBM-Containers が表示されていればインストール成功です.



Redmine の Docker イメージを Bluemix にデプロイする

まずは Docker を起動しましょう.

f:id:Santea:20170617223309j:plain

Launcher で Docker を選択します.


f:id:Santea:20170617223437p:plain:w250

ステータスバーの Docker 項目が Docker is running となっていれば起動成功です.


次に Bluemix にログインします.

$ bx login
API エンドポイント: https://api.ng.bluemix.net

Email> example@mail.com

Password> 
認証中です...
OK

アカウントを選択します (または Enter キーを押してスキップします):
1. Daiki Kawanuma's Account (XXXXXXXXXXXXXXX)
Enter a number> 1
ターゲットのアカウント Daiki Kawanuma's Account (XXXXXXXXXXXXXXX)

ターゲットの組織 BlumixDev

ターゲットのスペース BluemixDev


                         
API エンドポイント:   https://api.ng.bluemix.net (API バージョン: 2.54.0)   
地域:                 us-south   
ユーザー:             example@mail.com   
アカウント:           Daiki Kawanuma's Account (XXXXXXXXXXXXXXX)   
組織:                 BlumixDev   
スペース:             BluemixDev  

コマンドラインで bx login コマンドを実行してください.
メールアドレスとパスワードを要求されます.
正常にログインできれば上記のような結果が返ってくるはずです.


Bluemix Container を初期化します.

$ bx ic init
古い構成ファイルを削除中です...
open /Users/DaikiKawanuma/.cf/config.json: no such file or directory
IBM Containers のクライアント証明書を生成中です...
クライアント証明書を /Users/DaikiKawanuma/.ice/certs/ に格納中です...

クライアント証明書を /Users/DaikiKawanuma/.ice/certs/containers-api.ng.bluemix.net/XXXXXXXXXX に格納中です...

OK
クライアント証明書が取得されました。

ローカルの Docker 構成を確認中です...
OK

ホスト名 registry.ng.bluemix.net のレジストリーで認証中
OK
コンテナーは IBM Containers レジストリーで認証されました。
プライベート Bluemix リポジトリーは URL registry.ng.bluemix.net/XXXXXXXXXX です。

IBM Containers と共に Docker CLI を使用するには、次の 2 つの方法から選択することができます。


オプション 1: このオプションでは、ローカル Docker ホストを管理するために Docker CLI を直接使用しながら、IBM Containers 上のコンテナーを管理するための「bluemix ic」を使用できます。
	この Cloud Foundry IBM Containers プラグインは、ローカル Docker 環境に影響を与えることなく使用してください。


	使用法の例:
	bluemix ic ps
	bluemix ic images

オプション 2: Docker CLI を直接使用します。 このシェルでは、これらの変数を設定することにより、ローカル Docker 環境をオーバーライドして IBM Containers に接続します。 以下のコマンドをコピーして貼り付けてください。
	注: このオプションでサポートされるのは、後ろに (Docker) が付く Docker コマンドのみです。 
 	export DOCKER_HOST=tcp://containers-api.ng.bluemix.net:8443
 	export DOCKER_CERT_PATH=/Users/DaikiKawanuma/.ice/certs/containers-api.ng.bluemix.net/XXXXXXXXXX
 	export DOCKER_TLS_VERIFY=1

	使用法の例:
	docker ps
	docker images

コマンドラインで bx ic init コマンドを実行してください.

プライベート Bluemix リポジトリーは URL registry.ng.bluemix.net/XXXXXXXXXX です。

正常に初期化できた場合、上記のようにリポジトリーの URL が発行されますので、こちらを控えておきましょう.


Redmine の Docker イメージを pull します.

$ docker pull redmine
Using default tag: latest
latest: Pulling from library/redmine
10a267c67f42: Pull complete 
0aaa89427703: Pull complete 
4e4351445696: Pull complete 
72c399ee88ad: Pull complete 
cd4fc9895ed7: Pull complete 
00facae99acf: Pull complete 
39fe42e23efc: Pull complete 
adcb64833163: Pull complete 
605738c68599: Pull complete 
eb8b57703d24: Pull complete 
b0d2fec5a473: Pull complete 
7bd6e321e449: Pull complete 
509199c744bc: Pull complete 
72bc2865edcf: Pull complete 
89bcf430a558: Pull complete 
Digest: sha256:6161e523b5a7d66eaa27c5e16eb62b327ea846f36e5b1f3d955bb333d631cec2
Status: Downloaded newer image for redmine:latest

コマンドラインで docker pull redmine コマンドを実行します.
全ての項目が Pull complete になれば正常に pull できています.


Docker イメージにタグ付けを行います.

docker tag redmine registry.ng.bluemix.net/XXXX/my_redmine

コマンドラインで上記のコマンドを実行します.
"XXXX" の部分には先ほど控えておいたレジストリの URL を指定します.
"my_redmine" の部分は Bluemix 上の Docker イメージ名になりますのでお好きな名前を付けてください.


Bluemix 上に Redmine の Docker イメージをデプロイします.

$ docker push registry.ng.bluemix.net/XXXX/my_redmine
The push refers to a repository [registry.ng.bluemix.net/XXXX/my_redmine]
bbaad5f84f54: Pushed
8a2f78a107d8: Pushed 
77e8840346cc: Pushed
dc33c98e0afc: Pushed
580223b85643: Pushed 
912c9c81592d: Pushed 
daf18abaed19: Pushed 
4166db05041d: Pushed
fb1319c5dbe9: Pushed
f4d4ef112a81: Pushed 
41636605749a: Pushed 
c682b1980b3e: Pushed
8157cc9b225e: Pushed
2a9adabb6623: Pushed
8d4d1ab5ff74: Pushed 
latest: digest: sha256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX size: 3466

コマンドラインで docker push コマンドを実行します.
push 以下の引数には先程タグ付けした値と同様のものを指定します.

なお、デプロイ中は Web 上で Bluemix にログインしないようにしましょう.
途中でログインした場合、認証に失敗し最終的にデプロイが成功しません.

間違ってログインしてしまった場合でも、再度デプロイし直せば正常にデプロイできます.



カスタムドメインの指定と証明書の登録

いよいよ Bluemix 上で Redmine を起動するというところですが、その前にカスタムドメインと証明書の登録を行いましょう.

まずは証明書を作ります.
今回は Redmine の運用が目的なので"オレオレ証明書"で良いことにします.

IBM Bluemix を独自ドメインで使う(SSL編) : まだプログラマーですが何か?
証明書については上記エントリーで解説されていますので、詳しく知りたい方はご覧ください.


証明書を作成します.

$ openssl req -new -key server.key -out server.csr

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Hakozaki
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Project-Respite
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:*.project-respite.com
Email Address []:

***残りは全て Enter***

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

コマンドラインで openssl req -new -key server.key -out server.csr コマンドを実行します.
いくつか回答項目が表示されますので、Email まで回答し、残りは全て Enter します.

openssl x509 -days 3653 -in server.csr -out server.crt -req -signkey server.key

Signature ok
subject=/C=JP/ST=Saitama/L=Urawa/O=Project-Respite/CN=*.project-respite.com
Getting Private key

更に上記のコマンドを実行すると、server.key, server.csr, server.crt が生成されているはずです.

ここまでで鍵生成は完了です.


次にカスタムドメインの登録を行います.

f:id:Santea:20170617231922j:plain:w450

Bluemix にログインし、ページ右上のアカウントの項目で、"組織の管理"を選択します.


f:id:Santea:20170617232402j:plain

移動先のページにて、"組織の編集"を選択します.


f:id:Santea:20170617232749j:plain

タブ上の"ドメイン"の中の、"ドメインの追加"を選択します.
ドメイン名を追加したら、下の保存を選択してください.


f:id:Santea:20170617234528j:plain

保存するとSSL証明書の欄のアイコンが変わると思いますので、こちらを選択します.


f:id:Santea:20170617235340j:plain:w550

ポップアップ上で先程生成した Server.crt と Server.key を参照します.


最後にドメインサービスに Bluemix の CNAME を登録します.

f:id:Santea:20170618000517p:plain

こちらはお名前.comの例ですが、上記のように CNAME に "secure.us-south.bluemix.net" を指定してください.


これで下準備は完了です.



Redmine の起動

いよいよ Bluemix 上で Redmine を起動します.

f:id:Santea:20170617231201j:plain

トップ画面で上端タブの右にある"カタログ"を選択します.

画面左端のすべてのカテゴリーから"アプリ"の中の"コンテナ"を選択します.

コンテナの項目に先程デプロイした "my_redmine" を選択します.


f:id:Santea:20170617235959j:plain

コンテナ方式は"スケーラブル"を選択します(単一だとカスタムドメインを指定できないため).
コンテナ名、サイズ、インスタンスはお好きなものを設定してください(今回は最小構成にしています).


f:id:Santea:20170618001246j:plain

ドメインにカスタムドメインを指定し、作成を選択すれば Redmine が起動されます.


f:id:Santea:20170618001609p:plain

起動画面はこんな感じです.
メモリ使用量 365GBHour/Month までは無料枠で使えます.



まとめ

今回は Bluemix 上に Redmine の Docker イメージをデプロイし、起動してみました.

慣れれば10分!とまではいかないまでも、30分程度あればすぐに Redmine を構築できると思います.


少規模であれば無料枠で運用できると思いますので、ぜひお試しください.


以上です.


参考