2016年4月22日金曜日

【Microsoft Azure】Azure Container Service がGAしたので改めてやってみる

試してみたらすぐにGA(一般供用開始)しましたね、ACS。
https://azure.microsoft.com/ja-jp/services/container-service/

ということで、ARMテンプレートを変更しなくても良くなったので、再度手順を確認しましょう。

ポータルからさくっと作れますので、スクリーンショットを交えて。
まずは「NEW」→「Containers」→「Azure Container Service」と選択。
















文章を下の「Create」をどうぞ。



















Dockerホスト(Ubuntu 14.04.4 LTSです!)のユーザー名、ログインのためのRSA公開鍵、サブスクリプション、リソース、ロケーションを入力して「OK」















オーケストレーションツールを「DC/OS(Mesos)」と「Swarm」から選んで「OK」
※今回はSwarmを選択してみた
















ACSの設定です。
エージェント数(コンテナホストのVM数ですね)、エージェントの仮想マシンのサイズ(デフォルトはStandard_D2)、マスターの数(冗長構成なら3以上)、DNSプレフィックスを入力して「OK」
















内容を確認して「OK」












料金などの注意事項を読んでから「Create」でACS構築開始












とにかく待つ


















できあがる










「Resource Groups」からリソースを選び、デプロイ履歴を確認。
「Outputs」の中に、MASTERFQDN、SSHMASTER0(ssh接続時のコマンド)、AGENTFQDN(実際のWebアプリのURI)があるので確認。

















SSHでつないで、dockerコマンドでプロセスを見る。
$ ssh xxx@xxxmgmt.japaneast.cloudapp.azure.com -A -p 2200
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 3.19.0-58-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Fri Apr 22 04:20:31 UTC 2016

  System load:  0.43              Processes:              138
  Usage of /:   5.7% of 28.80GB   Users logged in:        0
  Memory usage: 3%                IP address for eth0:    172.16.0.5
  Swap usage:   0%                IP address for docker0: 172.17.0.1

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud


$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                                                                NAMES
0d9a7203292a        yeasy/simple-web    "/bin/sh -c 'python i"   26 seconds ago      Up 24 seconds       0.0.0.0:32771->80/tcp                                                                                                                xxx_web_1
822c18291112        swarm:1.1.0         "/swarm manage --repl"   11 minutes ago      Up 9 minutes        0.0.0.0:2375->2375/tcp                                                                                                               containers_swarm_1
618799d9ffee        progrium/consul     "/bin/start -server -"   11 minutes ago      Up 9 minutes        0.0.0.0:8300-8302->8300-8302/tcp, 0.0.0.0:8400->8400/tcp, 53/tcp, 53/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8301-8302->8301-8302/udp   containers_consul_1


以下の内容でdocker-compose.ymlを作成。
$ vi docker-compose.yml 
web:
  image: "yeasy/simple-web"
  ports:
    - "80"
  restart: "always"

docker-composeコマンドでデプロイ。そしてスケール。
$ docker-compose up -d
xxx_web_1 is up-to-date

$ docker-compose scale web=5
Creating and starting 2 ... done
Creating and starting 3 ... done
Creating and starting 4 ... done
Creating and starting 5 ... done

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                                                                NAMES
3e30842b5e74        yeasy/simple-web    "/bin/sh -c 'python i"   6 seconds ago       Up 3 seconds        0.0.0.0:32774->80/tcp                                                                                                                xxx_web_5
96776a5764b5        yeasy/simple-web    "/bin/sh -c 'python i"   6 seconds ago       Up 3 seconds        0.0.0.0:32773->80/tcp                                                                                                                xxx_web_4
f858be340919        yeasy/simple-web    "/bin/sh -c 'python i"   6 seconds ago       Up 3 seconds        0.0.0.0:32775->80/tcp                                                                                                                xxx_web_2
57943899efc4        yeasy/simple-web    "/bin/sh -c 'python i"   6 seconds ago       Up 4 seconds        0.0.0.0:32772->80/tcp                                                                                                                xxx_web_3
0d9a7203292a        yeasy/simple-web    "/bin/sh -c 'python i"   51 seconds ago      Up 49 seconds       0.0.0.0:32771->80/tcp                                                                                                                xxx_web_1
822c18291112        swarm:1.1.0         "/swarm manage --repl"   11 minutes ago      Up 9 minutes        0.0.0.0:2375->2375/tcp                                                                                                               containers_swarm_1
618799d9ffee        progrium/consul     "/bin/start -server -"   11 minutes ago      Up 9 minutes        0.0.0.0:8300-8302->8300-8302/tcp, 0.0.0.0:8400->8400/tcp, 53/tcp, 53/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8301-8302->8301-8302/udp   containers_consul_1

気になる点は、仮想マシンのスケールセットのCapacityに変更がない(でも問題なくdockerでスケールできてる)ことでしょうか?
仮想マシンもスケールしてました。

これで気楽に(お金は気にしてねw)DockerでDevOpsに入門してねー。

追記:Webアプリに繋がらんのでちょっと調べてみなければ...


2016年4月15日金曜日

【Microsoft Azure】Azure Container Service の agent の数を増やしたい

前回の投稿で設定したDockerコンテナですが、そのままではひとつ難点があります。
スケールする場合のエージェントの数が増やせないのです。

仮想マシンのスケールセット(以下VMSS)を利用しているので、本来であればポータルから変更したいところですが、今はまだできません。
VMSSについてはこちら。
https://azure.microsoft.com/ja-jp/documentation/articles/virtual-machine-scale-sets-windows-create/

見てる限りでは、VMSSのcapacityを変更できれば、Docker側から設定した数を上限にスケールできそうです。
今回はこれを変更するために、Azure Resource Explorer を使います。
https://resources.azure.com/

まずAzure Resource Explorerに、ポータルにログインしているブラウザでアクセスします。
このときに、右上の「Read/Write」をクリックして読み書き可能にする必要があります。







次は、左ペインのメニューを、
subscription→ACSのサブスクリプション→resourceGroups→ACSのリソース→Microsoft.Compute→virtualMachineScaleSets→該当するScaleSet
の順に選択します。

ScaleSetのリソースは、こんな感じで表示されます。
















「EDIT」をクリックして、「sku」の中の「capacity」を1から3に変更します。
変更したら「PUT」を押します。
















capacityが3に変更されました。
















ポータルで見てみましょう。
「仮想マシンのスケールセット」を探してみましょう。
こんな風に3に変わっていると思います。










容量(capacity)が3になったので、docker-compose でスケールしてみましょう。
azureuser@xxx:~$  docker-compose scale web=3
Creating and starting 2 ... done
Creating and starting 3 ... done
azureuser@xxx:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                                                                NAMES
242e38975a34        yeasy/simple-web    "/bin/sh -c 'python i"   5 seconds ago       Up 4 seconds        0.0.0.0:32770->80/tcp                                                                                                                azureuser_web_3
e27e1035774c        yeasy/simple-web    "/bin/sh -c 'python i"   5 seconds ago       Up 4 seconds        0.0.0.0:32769->80/tcp                                                                                                                azureuser_web_2
ae8a0ea43b50        yeasy/simple-web    "/bin/sh -c 'python i"   45 minutes ago      Up 45 minutes       0.0.0.0:32768->80/tcp                                                                                                                azureuser_web_1
5a161555c072        swarm:1.1.0         "/swarm manage --repl"   About an hour ago   Up About an hour    0.0.0.0:2375->2375/tcp                                                                                                               containers_swarm_1
058236a13875        progrium/consul     "/bin/start -server -"   About an hour ago   Up About an hour    0.0.0.0:8300-8302->8300-8302/tcp, 0.0.0.0:8400->8400/tcp, 53/tcp, 53/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8301-8302->8301-8302/udp   containers_consul_1

前回の記事が1だったので、無事スケールできています。




















【Microsoft Azure】Azure Container Service で Docker と向き合う

いろいろあってDockerと向き合うことになったので、Azure でやるなら Azure Container Service(以下ACS) を使ってみようと。
https://azure.microsoft.com/ja-jp/services/container-service/

Apache Mesos または Docker Swarm のどちらかのオーケストレーションツールを使ってDockerコンテナを管理するっていうので、今回はDockerSwarmを選択。

構成などについては、こちらのドキュメントをまずは読んでください。
https://github.com/Azure/azure-quickstart-templates/blob/master/101-acs-swarm/docs/SwarmWalkthrough.md

ACSは、ポータルの「テンプレートからデプロイ」でARMテンプレートを使ってデプロイします。












こちらから「テンプレートのデプロイ」を選択します。



















ACSのテンプレートはgithubで公開されています。
https://github.com/Azure/azure-quickstart-templates/tree/master/101-acs-swarm (これはDockerSwarmのもの)

実際に使うARMテンプレートはこちら。これを
https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-acs-swarm/azuredeploy.json

「テンプレートの編集」を選んで















ACSのARMテンプレートを貼り付けて保存します。













次に、パラメーターをセットします。
とりあえず、DNSNAMEPREFIX(FQDNにつける識別用プレフィックス)とSSHRSAPUBLICKEY(SSHでアクセスする際のRSA公開鍵)を入力して「OK」を押します。

















リソースグループを選ぶなり作成するなりして、リージョンを決めます。
最後に、法律条項を確認して作成します。















デプロイが終わると、以下の2つのFQDNが決定します。

masterFQDN:{DNSNAMEPREFIX}mgmt.japaneast.cloudapp.azure.com
agentFQDN:  {DNSNAMEPREFIX}agents.japaneast.cloudapp.azure.com

masterへのssh接続は、以下のようにします。公開鍵が登録されているので、秘密鍵のパスフレーズでログイン出来ます。

$ ssh azureuser@{DNSNAMEPREFIX}mgmt.japaneast.cloudapp.azure.com -A -p 2200

Are you sure you want to continue connecting (yes/no)? yes
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 3.19.0-58-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Fri Apr 15 08:28:32 UTC 2016

  System load: 0.15              Memory usage: 1%   Processes:       98
  Usage of /:  5.7% of 28.80GB   Swap usage:   0%   Users logged in: 0

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

azureuser@xxx:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                                                                NAMES
5a161555c072        swarm:1.1.0         "/swarm manage --repl"   10 minutes ago      Up 8 minutes        0.0.0.0:2375->2375/tcp                                                                                                               containers_swarm_1
058236a13875        progrium/consul     "/bin/start -server -"   10 minutes ago      Up 8 minutes        0.0.0.0:8300-8302->8300-8302/tcp, 0.0.0.0:8400->8400/tcp, 53/tcp, 53/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8301-8302->8301-8302/udp   containers_consul_1

とりあえず動いています。
ここで簡単なWebアプリコンテナを動かしてみます。
以下の内容で、docker-compose.ymlというファイルを作成します。
web:
  image: "yeasy/simple-web"
  ports:
    - "80"
  restart: "always"

それから、docker-composeコマンドでコンテナをUPします。
docker ps コマンドで確認できます。
azureuser@xxx:~$ docker-compose up -d
Pulling web (yeasy/simple-web:latest)...
latest: Pulling from yeasy/simple-web
efd26ecc9548: Pull complete
a3ed95caeb02: Pull complete
d1784d73276e: Pull complete
72e581645fc3: Pull complete
9709ddcc4d24: Pull complete
2d600f0ec235: Pull complete
de1491f1bbd4: Pull complete
4becc568d2ff: Pull complete
6aeb62f4b3fa: Pull complete
77144c15ca8f: Pull complete
811db2e8b100: Pull complete
Digest: sha256:35e52520b8f98a092af6ce10c9fdd3ca6ca77f0b79f9d652c29bdd5d17c1c7aa
Status: Downloaded newer image for yeasy/simple-web:latest
Creating azureuser_web_1
azureuser@xxx:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                                                                NAMES
ae8a0ea43b50        yeasy/simple-web    "/bin/sh -c 'python i"   23 seconds ago      Up 22 seconds       0.0.0.0:32768->80/tcp                                                                                                                azureuser_web_1
5a161555c072        swarm:1.1.0         "/swarm manage --repl"   20 minutes ago      Up 19 minutes       0.0.0.0:2375->2375/tcp                                                                                                               containers_swarm_1
058236a13875        progrium/consul     "/bin/start -server -"   20 minutes ago      Up 19 minutes       0.0.0.0:8300-8302->8300-8302/tcp, 0.0.0.0:8400->8400/tcp, 53/tcp, 53/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8301-8302->8301-8302/udp   containers_consul_1                                                                                                             containers_swarm_1

ブラウザから「{DNSNAMEPREFIX}agents.japaneast.cloudapp.azure.com」へアクセスするとWebアプリの画面が見えます。















2016年4月8日金曜日

Microsoft Azure Web Apps で LINE BOT を動かせ

LINE BOT API のトライアル、みんな申し込んでますよね?
https://business.line.me/ja/products/4/introduction

もちろん、Azure Web Apps と PHP でやりますよ。
と思いましたが、みんなブログ書いてるので、WebApps固有のハマったポイントを。

プログラムを書くために参考にしたのは、このブログ。助かります。
http://qiita.com/srea/items/58ba0f7d870a6ee3da2a

で、まずは Server IP Whitelist に追加するIPアドレス。
Settings -> Properties の「OUTBOUND IP ADDRESSES」にあるIPアドレスを全部登録します。













もう一つは、リクエストに使うcurlの証明書エラー。こんな感じ。

SSL certificate problem: unable to get local issuer certificate

こいつは、以下のように今回は証明書の検証をしないようにします。

curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false);




2016年4月7日木曜日

Ubuntu on Windows を試す

Insider Preview 14316 で、Ubuntu on Windows が動きます。

まずは、Windowsの機能で「Windows Subsystem for Linux (Beta)」を有効にします。

一旦再起動します。

次はPowerShellで、「bash」と入力してEnter。
初回はストアから「Ubuntu on Windows」をダウンロードしてきます。
ダウンロードするとbashが使えます。

uname で見てみると、一応Linux 3.4.0 と表示されてます。



2016年4月1日金曜日

Build2016前後でOSS的に注目するMicrosoftのソリューション2点

サンフランシスコではマイクロソフトのイベント「Build 2016」やってますね。

HoloLends とか興味深いものも多いですが、OSS的な視点でマイクロソフトがここ数日発表したものの中からピックアップ。


1. Windows10でUbuntuが提供するBashが動く

多方面で取り上げられている、Ubuntu on Windows は興味深いですね。
詳しくはこちらで。

まだ動かしていないのですが、VMではない、すなわちLinuxKernelを使わずにELF形式のバイナリを動作させる環境なのでしょうかね。
以前からずっと欲しいと思ってたんですが、やっと、という感じです。
RubyやPythonのLinuxパッケージをそのまま動かすとか、なかなかいいんじゃないかと。

近いうち使ってみて投稿します。


2. DocumentDB Protocol Support for MongoDB (preview)

ポータルからプレビュー申し込みできます。詳しくはこちらで。

今まで.NET、Node.js、Java、PythonしかSDKがない(PHP SDKは私がgithubで公開している)が、これで各言語のMongoDBドライバからAzureDocumentDBに接続できます。

DocumentDBはフルマネージドなので、自前でIaaSでMongoDB立てるよりは現実的な選択肢になり得るんじゃないでしょうか。

MongoDBがもつ関数のすべてが実装されているわけではないようですが、こちらもプレビュー評価したら投稿予定です。

2016年1月4日月曜日

【Microsoft Azure】Azure AD を利用して azure-xplat-cli からログイン

azure-xplat-cli を使う必要に迫られて、ログインでハマったのでざっくりまとめておきます。

コマンドラインからログインする方法は以下の3通りです。

・組織アカウント
・Microsoftアカウント(Version 0.9.10 以降)
・Active Directory Service Principal(Version 0.8.8 以降)

通常はこちらに書かれてる通りでログインは可能です。 https://azure.microsoft.com/ja-jp/documentation/articles/xplat-cli-connect/

今回求められることは、ARM対応であること、コマンドのみで完結することの2点。
非対話形式だと、上のリンクではARMは使えません。

そこで、手間はかかりますが、AD設定してログインできるようにします。
設定した通りに記述していきます。

まず、ADの設定をするために、ARMモードで対話形式かつMicrosoftアカウントでログインします。
コマンド入力後、Webブラウザから表示されたURLへアクセス、Microsoftアカウントでログイン後にコード(ここではXXXXXXXXX)を入力します。
なお、組織アカウントでもかまいません。
ログインすると、アカウントに紐付いたサブスクリプションが表示されます。
$ azure config mode arm
info:    Executing command config mode
info:    New mode is arm

info:    config mode command OK
$ azure login
info:    Executing command login
-info:    To sign in, use a web browser to open the page https://aka.ms/devicelogin. Enter the code XXXXXXXXXX to authenticate. If you're signing in as an Azure AD application, use the --username and --password parameters.
/info:    Added subscription Subscription1 as default
+
info:    login command OK

一旦対象のサブスクリプションをセットして、ADの設定をします。
設定項目は以下のとおりです。
サブスクリプション名:Subscription1
サブスクリプションID:1111-1111-1111-1111
アプリケーション名:authtest
アプリケーションURL(identifier-urisも):https://example.com
パスワード:Password
$ azure account list
info:    Executing command account list
data:    Name                                Id                                    Current  State  
data:    ----------------------------------  ------------------------------------  -------  -------
data:    Subscription1                   1111-1111-1111-1111     true     Enabled
info:    account list command OK
$ azure account set 1111-1111-1111-1111
info:    Executing command account set
info:    Setting subscription to "Subscription1" with id "1111-1111-1111-1111".
info:    Changes saved
info:    account set command OK
$ azure ad app create --name "authtest" --home-page "https://example.com" --identifier-uris "https://example.com" --password "Password"
info:    Executing command ad app create
+ Creating application authtest0                                               
data:    Application Id:          2222-2222-2222-2222
data:    Application Object Id:   3333-3333-3333-3333
data:    Application Permissions:  
data:                             claimValue:  user_impersonation
data:                             description:  Allow the application to access authtest on behalf of the signed-in user.
data:                             directAccessGrantTypes: 
data:                             displayName:  Access authtest
data:                             impersonationAccessGrantTypes:  impersonated=User, impersonator=Application
data:                             isDisabled: 
data:                             origin:  Application
data:                             permissionId:  4444-4444-4444-4444
data:                             resourceScopeType:  Personal
data:                             userConsentDescription:  Allow the application to access authtest on your behalf.
data:                             userConsentDisplayName:  Access authtest
data:                             lang: 
info:    ad app create command OK

前のコマンドの出力結果より、アプリケーションIDを使ってServicePrincipalを作成します。
アプリケーションID: 2222-2222-2222-2222
$ azure ad sp create 2222-2222-2222-2222
info:    Executing command ad sp create
+ Creating service principal for application 2222-2222-2222-2222
data:    Object Id:               5555-5555-5555-5555
data:    Display Name:            authtest
data:    Service Principal Names:
data:                             2222-2222-2222-2222
data:                             https://example.com
info:    ad sp create command OK

アクセス許可を行います。
オブジェクトID: 5555-5555-5555-5555
$ azure role assignment create --objectId 5555-5555-5555-5555 -o Reader -c /subscriptions/1111-1111-1111-1111
info:    Executing command role assignment create
+ Finding role with specified name                                             
/data:    RoleAssignmentId     : /subscriptions/1111-1111-1111-1111/providers/Microsoft.Authorization/roleAssignments/0000-0000-0000-0000
data:    RoleDefinitionName   : Reader
data:    RoleDefinitionId     : 6666-6666-6666-6666
data:    Scope                : /subscriptions/1111-1111-1111-1111
data:    Display Name         : authtest
data:    SignInName           :
data:    ObjectId             : 7777-7777-7777-7777
data:    ObjectType           : ServicePrincipal
data:    
+
info:    role assignment create command OK

最後にテナントIDを確認して、ログイン情報を取得します。
$ azure account list --json
[
  {
    "id": "1111-1111-1111-1111",
    "name": "Subscription1",
    "user": {
      "name": "admin@example.com",
      "type": "user"
    },
    "tenantId": "8888-8888-8888-8888",
    "state": "Enabled",
    "isDefault": true,
    "registeredProviders": [],
    "environmentName": "AzureCloud"
  }
]

やっとログイン情報が出揃いました。
必要な情報は以下のとおり。
・アプリケーションID:2222-2222-2222-2222
・パスワード:Password
・テナントID:8888-8888-8888-8888
$ azure login -u "2222-2222-2222-2222" -p "Password" --service-principal --tenant "8888-8888-8888-8888"
info:    Executing command login
|info:    Added subscription Subscription1                
info:    Setting subscription "Subscription1" as default
+
info:    login command OK

これで、簡単にログインができるようになりました。
Linuxのシェルに組み込む場合などに便利かと思います。