世界のやまさ

SEKAI NO YAMASA

Cloud Foundry を Azure で動かしてみる

f:id:nnasaki:20151211212212p:plain

先月(11月)の話ですが、 Cloud Foundry on Azure が GA しました。

azure.microsoft.com

で、実際どんなものかなーと試してみました。理由は Azure 上で Managed な PostgreSQL や MySQL サーバーが欲しかったからです。(MySQL は ClearDB があるけども、あまり好きでは無い)

前提

組織アカウント

組織アカウント(*.onmicrosoft.com, o365 business等) が必要です。2つの方法があります

  • 組織アカウントを新規作成する。作り方は No.1 の記事がわかりやすいで、そっちを見ましょう。
  • 新しく組織アカウントを作って既存のサブスクリプションの共同管理者(co-owner)とする

Azure CLI

手順

GA した blog には書いていなくて、プレビューで試せるようになった blog に書いてあります。

azure.microsoft.com

この中に書いてある、次のGithubのページに書いてある手順を実施します。(中々たどり着くまで時間かかった)

github.com

順番に試していきます。

Deploy BOSH using ARM templates (RECOMMENDED) の実施

bosh-azure-cpi-release/deploy-bosh-using-arm-templates.md at master · cloudfoundry-incubator/bosh-azure-cpi-release · GitHub を順番に実施していきます。

Azure CLI で 組織アカウント にログインする

Create a Service Principal - Azure CLI を参照しながら進めます。

基本的に記事通り進めれば問題ありませんが、azure account list --json をした結果、 tenantId が必須となります。 microsoft アカウントですと、これが無いので組織アカウントが必須となっています。次のような結果であれば問題ありません。

  {
    "id": "87654321-1234-5678-1234-678912345678",
    "name": "無料試用版",
    "user": {
      "name": "nnasaki@ncloudfoundry.onmicrosoft.com",
      "type": "user"
    },
    "tenantId": "22222222-1234-5678-1234-678912345678",
    "isDefault": true,
    "registeredProviders": [],
    "environmentName": "AzureCloud"
  }

ここでの出力結果を今後使うのでメモっておきます。

  • SUBSCRIPTION-ID
    • id
    • 87654321-1234-5678-1234-678912345678
  • TENANT-ID
    • tenantId
    • 22222222-1234-5678-1234-678912345678
azure cli のアカウント設定を SUBSCRIPTION-ID に合わせる

azure account set 87654321-1234-5678-1234-678912345678

AD App を作る

azure ad app create --name "Service Principal for BOSH" --password "password" --home-page "http://BOSHAzureCPI" --identifier-uris "http://BOSHAzureCPI"

このとき、 home-pageidentifier-uris は適当でかまいません。次のようなアウトプットがされます。 Application Id は CLIENT-ID として使うのでメモっておきます。

  • CLIENT-ID
    • Application Id
    • 246e4af7-75b5-494a-89b5-363addb9f0fa
info:    Executing command ad app create
+ Creating application Service Principal for BOSH
data:    Application Id:          246e4af7-75b5-494a-89b5-363addb9f0fa
data:    Application Object Id:   a4f0d442-af80-4d98-9cba-6bf1459ad1ea
data:    Application Permissions:
data:                             claimValue:  user_impersonation
data:                             description:  Allow the application to access Service Principal for BOSH on behalf of the signed-in user.
data:                             directAccessGrantTypes:
data:                             displayName:  Access Service Principal for BOSH
data:                             impersonationAccessGrantTypes:  impersonated=User, impersonator=Application
data:                             isDisabled:
data:                             origin:  Application
data:                             permissionId:  1a1eb6d1-26ca-47de-abdb-365f54560e55
data:                             resourceScopeType:  Personal
data:                             userConsentDescription:  Allow the applicationto access Service Principal for BOSH on your behalf.
data:                             userConsentDisplayName:  Access Service Principal for BOSH
data:                             lang:
info:    ad app create command OK
Service Principal を作成する

さきほどメモっておいた CLIENT-ID を使います。

azure ad sp create 246e4af7-75b5-494a-89b5-363addb9f0fa

Role をアサインする

azure role assignment create --spn "http://BOSHAzureCPI" -o "Contributor" --subscription 87654321-1234-5678-1234-678912345678

ログイン出来るか確かめる

メモっておいた CLIENT-ID, CLIENT-SECRET, TENANT-ID を使います。 azure login -u 246e4af7-75b5-494a-89b5-363addb9f0fa -p "password" --service-principal --tenant 22222222-1234-5678-1234-678912345678

ARM で BOSH と Cloud Foundry 環境を作る

環境作りはボタンを押すだけです。

先ほどメモっておいた CLIENT-ID, CLIENT-SECRET, TENANT-ID を設定に記載します。

BOSH のセットアップ

ARM で作った VM に ssh で繋いで、シェルを実行するだけです。

./deploy_bosh.sh

デフォルトの D1 な仮想マシンで1時間近くかかった感じです。外出先で行う場合は nohup *1 でやったほうが良いでしょう。

ログを貼っておきます。

nnasaki@ncloudfoundry:~$ ./deploy_bosh.sh 
Deployment manifest: '/home/nnasaki/bosh.yml'
Deployment state: '/home/nnasaki/bosh-state.json'

Started validating
  Downloading release 'bosh'... Finished (00:07:40)
  Validating release 'bosh'... Finished (00:00:03)
  Downloading release 'bosh-azure-cpi'... Finished (00:02:11)
  Validating release 'bosh-azure-cpi'... Finished (00:00:00)
  Validating cpi release... Finished (00:00:00)
  Validating deployment manifest... Finished (00:00:00)
  Downloading stemcell... Finished (00:25:29)
  Validating stemcell... Finished (00:00:08)
Finished validating (00:35:35)

Started installing CPI
  Compiling package 'ruby_azure_cpi/3db71123fb72f5ec81955710b2e89e2cbbd8aca0'... Finished (00:02:58)
  Compiling package 'bosh_azure_cpi/5985e1e82c78fadb5f2c951f319012403ee04fd8'... Finished (00:01:57)
  Installing packages... Finished (00:00:02)
  Rendering job templates... Finished (00:00:00)
  Installing job 'cpi'... Finished (00:00:00)
Finished installing CPI (00:05:00)

Starting registry... Finished (00:00:00)
Uploading stemcell 'bosh-azure-hyperv-ubuntu-trusty-go_agent/0000'... Finished (00:20:32)

Started deploying
  Creating VM for instance 'bosh/0' from stemcell 'bosh-stemcell-3e37d680-42ae-439a-95a0-afde20eda292'... Finished (00:02:48)
  Waiting for the agent on VM 'ncloudfoundry-3dc3d1d1-327f-4ce5-740e-aee6b5710c75' to be ready... Finished (00:01:56)
  Creating disk... Finished (00:00:05)
  Attaching disk 'bosh-data-ncloudfoundry-a0df5077-c8c2-4427-877f-7b855481c4b7-None' to VM 'ncloudfoundry-3dc3d1d1-327f-4ce5-740e-aee6b5710c75'... Finished (00:01:15)
  Rendering job templates... Finished (00:00:04)
  Compiling package 'mysql/ZTUzMDlhZWQ4OGY1Y2M2NjJiYzc3OTg4YTMxODc0NDYxZjdjNGZiOA=='... Finished (00:00:19)
  Compiling package 'ruby_azure_cpi/3db71123fb72f5ec81955710b2e89e2cbbd8aca0'... Finished (00:02:55)
  Compiling package 'nginx/MWQzNTZiYmQxN2VkOGMzNDlmZDEwNTMwOTMyMjJkNzg1NTk2ODdlYw=='... Finished (00:00:55)
  Compiling package 'libpq/OTJjOTQ0NGIwNzM2ZTQ2ZTM0MjJkZjFkNjM3MzlkOGFkMjNkYmJhZQ=='... Finished (00:00:29)
  Compiling package 'genisoimage/MDA4ZDMzMmJhMTQ3MWJjY2Y5ZDlhZWI2NGMyNThmZGQ0YmY3NjIwMQ=='... Finished (00:00:24)
  Compiling package 'ruby/MDMwZTNkNGVhZmQwMGIxMGJiZmE4NzliY2Y0NGZiYTYyMTM5MjA1ZQ=='... Finished (00:02:31)
  Compiling package 'postgres/YWE3ZjViMTEwZThiMzY4ZWViOGY1ZGQwMzJlMWNhYjY2ZDg2MTRjZQ=='... Finished (00:00:11)
  Compiling package 'redis/MzdlYWU1MzA4ODljYjllZjRlODRmOWMzZDA4MjdiYWI1YWU1Y2I2Ng=='... Finished (00:00:51)
  Compiling package 'nats/NmEzMWM3YmIwZDVmZmEyYTlmNDNjN2ZkNzE5MzE5MzQzOGUyMGU5Mg=='... Finished (00:00:14)
  Compiling package 'bosh_azure_cpi/5985e1e82c78fadb5f2c951f319012403ee04fd8'... Finished (00:01:55)
  Compiling package 'health_monitor/M2JjOTVhNGIwY2E0OTcyZDJlZWNhN2I2NjViYTc4MzFkOTA0MGMzOA=='... Finished (00:01:31)
  Compiling package 'director/MjkzNDMyYmZiNzUxZWFmMThiYjE5YmFhMjBmNDZlMjQwMjcwNTkxMg=='... Finished (00:02:20)
  Compiling package 'registry/YTU1NjMwYmM0MmU2NjNmODc5NTlhMzA1NzdlOGE4ZTM4ODQyMWZkNw=='... Finished (00:01:48)
  Updating instance 'bosh/0'... Finished (00:00:41)
  Waiting for instance 'bosh/0' to be running... Finished (00:00:49)
Finished deploying (00:24:11)

Stopping registry... Finished (00:00:00)
Cleaning up rendered CPI jobs... Finished (00:00:00)

Cloud Foundry のデプロイ

BOSH のセットアップが終わったので、次は Cloud Foundry をデプロイします。

サンプルをダウンロードする

VMのシングルとマルチがありますが、シングルをダウンロードします。このサンプル中のBOSH-DIRECTOR-UUID, VNET-NAME, SUBNET-NAME, RESERVED-IP, SSL-CERT-AND-KEY を置換する必要があります。

single-vm-cf-224.yml

BOSH-DIRECTOR-UUID を置換する

VM上で、 bosh target 10.0.0.4 を実行します。IDとパスワードは admin です。次に bosh status を実行して、 UUID をメモしておきます。

VNET-NAME を置換する

Azure上のVNETと同じ名前を入れておきます。デフォルトは boshvnet-crp です。

SUBNET-NAME を置換する

Azure上のSUBNETと同じ名前を入れておきます。デフォルトは Bosh です。

RESERVED-IP を置換する

~/settingscf-ip に記載されています。

SSL-CERT-AND-KEY を置換する

次のコマンドを実行します。

openssl genrsa -out bosh.key 2048
openssl req -new -x509 -days 365 -key bosh.key -out bosh_cert.pem

その結果の、 bosh_cert.pem, bosh.keyつなげて SSL-CERT-AND-KEY に記載します。こんなかんじです

ha_proxy:
  ssl_pem: |
    -----BEGIN CERTIFICATE-----
    MIIDXTCCAkWgAwIBAgIJAJWo1rwt2B2IMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
    BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
    aWRnaXRzIFB0eSBMdGQwHhcNMTUxMTAxMTAyODA5WhcNMTYxMDMxMTAyODA5WjBF
    MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
    ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
    CgKCAQEAzmgXmtJRjOP3Rj1Btu0TKdez/nymTVb4ecsXV/jlCZLcOQgm/rPtTShM
    Ai0tmRbjRCNxdYteOJIB6RiUe8dhv8r4LQ/GrFQboykeFnh0KNoNwb3FolKqEbvQ
    B+nbgFo7AEnK7yR/+Cu7rjl4lIHwp34/tFoT5ox5f3MYX259Zjxn2Rke2QG480G1
    wfRVg1RxcbQAglsWMQKhmia4Lzo3aA6rI1Y+/dcsej/0WG3KGRz3QP03D6Efyq1L
    LcDrE5+uMxPqTeTIgVuzRedyUWPM/PNnIxQwYyk4ETX+OKJcEjQZbYzJ9cxm/r+b
    acIgV8QAv5bUY2CGC6KMsOsjLMR6/wIDAQABo1AwTjAdBgNVHQ4EFgQUuPydhm2c
    GDtbsQ+i4JBkLSrVcmgwHwYDVR0jBBgwFoAUuPydhm2cGDtbsQ+i4JBkLSrVcmgw
    DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAL3gMHbLJI+znjAUZswR0
    u/+YohEjujYa5Y69Z+xuv3N+CJgYBM38j7yJsica3SzAgRYwl6+04Xox++V82CB/
    yYM7xJsxu5q3fYfnQQB8XY0TNWG7QZdvhOIG1mTjCe04x80XjHDgKsCAdyvvTiTc
    YFyy4VS1MlhPe2e6i/+wXdKj5Qn0COu6Ih536uTyo0TTljMZGuYPw21QE0Qo2y+3
    EJvv+bN+XPrZzELl6p0FymgJV8mFkYOqXD5C5d1vYzmjBSwdjNNXBXRovoEjoJ9R
    LDYGT94+X4UkI3asd6fn4eg9iuaUNC+WxsSnKa9z5qLgyMSF7GsZqKjGcoQjuiDj
    AQ==
    -----END CERTIFICATE-----
    -----BEGIN RSA PRIVATE KEY-----
    MIIEogIBAAKCAQEAzmgXmtJRjOP3Rj1Btu0TKdez/nymTVb4ecsXV/jlCZLcOQgm
    /rPtTShMAi0tmRbjRCNxdYteOJIB6RiUe8dhv8r4LQ/GrFQboykeFnh0KNoNwb3F
    olKqEbvQB+nbgFo7AEnK7yR/+Cu7rjl4lIHwp34/tFoT5ox5f3MYX259Zjxn2Rke
    2QG480G1wfRVg1RxcbQAglsWMQKhmia4Lzo3aA6rI1Y+/dcsej/0WG3KGRz3QP03
    D6Efyq1LLcDrE5+uMxPqTeTIgVuzRedyUWPM/PNnIxQwYyk4ETX+OKJcEjQZbYzJ
    9cxm/r+bacIgV8QAv5bUY2CGC6KMsOsjLMR6/wIDAQABAoIBAGAXGZYb/5clscJj
    ViqA6AD8yHDbOtiaeobIw49S8d2pHxj18KF2xiy7a9c/jRDOFPNtxK5COZUAdB8+
    MDIHujv9k9f2ljk31r34sGcpoHo8OVdOr6lH7qDe3JQyjNuOJhWWRQFb7q9sPK15
    V+dbLtvq7GFb5hPYpd9th5U17O8grWR6yOwhfEIJNSq/bbAhKc4cMRFGCeV+DRAR
    LMzdjRsfYWfMoHeOFeuBcSgV21wfjg0sCViQ2TN/tVp9bcr/bmzbje60jgnNdnzT
    VD7e/m0xNisZ0VMzBGPiKueyM1f0jOCNAu27KxeeSwsQNq5C07sxopp1iwWbmJlP
    Mk8ymCECgYEA92LcQNDcRYtGVd3xbGs3AKmcLgEeXrreVticqsnLJ0zmj7DBVTXw
    rI8MNGI2nnme+dhnr6sozAoKukE3jJaRvl94AwzeLNDHojZh6mhREXDPCSs2Gd3U
    iLeOJmmySW3p8woeyJXbBGOT29II9jSOYQTWxiM2+MCx1AOYHjoX/OkCgYEA1Zfz
    OAXPbRmzhfwavIbMQLWEHpRO7nD07ifE+zRyLzraRU6nCOzy9LQubLJPPVPZzKK/
    ZOKHt7ddM5WRo9NZz2+keNSQSw1d6SKjG4SPH0LG4iLCx/VpKWTG6l6k7xBc1mHe
    tqhnc7u7X+1qT5+Hs6YY/6q0wgKbfK0OuOh/J6cCfy1q+QTtU4NxDni1Rp2hEXgN
    q57GlczOggNvwVOZuLJ+a9X1nYkHXihQGu2DGoP90DIOiPq3ccYEEfQgBRLKkfdh
    j6b/tcqEiiI92bwvarLJAzmrtUMKdvqiuHZU8WaJx2nXcc9hs9QadArnhL2u6HTn
    bobx8CW7OuqxvjvObpkCgYEAnPGAskp6poS7B5k9oAdAL8/wW3PIJ6XyIsgwEhDw
    Ucnhtglb7NAGmU2HyzCdzsc9AwMWtS9KX/Co2A1vrTvQAv7akDpIKA2TUomz5bVa
    YLL1ZhX6n2iws8yr6GxQrqSMQq45Mme9VCm+PXc6pXToBlXmin3JQcEetNaIOdAE
    FoMCgYEAgB+qAAfoX1e7DOkqHHr4SJERzN3MQ7NlnaNf5K7FNzFBdNSrKbe20YQR
    MzSpkc9piBnf9REsmfwh/8GlDoJhZtwETEf2EtUeLPuywnyy2rFRB9yMNo9RdBYa
    EJz7EDFRyM34vKPVktA73suJQ1kzYX1ITUICPbuYObSF8vw5BTk=
    -----END RSA PRIVATE KEY-----
cf_224.yml を保存する

VMの ~ ホームディレクトリに保存します。

stemcell をストレージにアップロードする

VM のカレントにある bosh.yml に stemcell: url: があるので、それを次のコマンドのSTEMCELL-FOR-AZURE-URL に置換する。

bosh upload stemcell STEMCELL-FOR-AZURE-URL
Cloud Foundry release v224 をアップロードする
bosh upload release https://bosh.io/d/github.com/cloudfoundry/cf-release?v=224
Deploy コマンドの実行
bosh deployment cf_224.yml
bosh deploy

これも1時間ぐらい時間かかりますので気長に待ちます。何回か失敗してしまい、トライし直してますが、成功するとこんなログが出ます。

nnasaki@ncloudfoundry:~$ bosh deploy
Acting as user 'admin' on deployment 'cf-azure' on 'bosh'
Getting deployment properties from director...
Please review all changes carefully

Deploying
---------
Are you sure you want to deploy? (type 'yes' to continue): yes

Director task 5
  Started unknown
  Started unknown > Binding deployment. Done (00:00:00)

  Started preparing deployment
  Started preparing deployment > Binding releases. Done (00:00:00)
  Started preparing deployment > Binding existing deployment. Done (00:00:00)
  Started preparing deployment > Binding resource pools. Done (00:00:00)
  Started preparing deployment > Binding stemcells. Done (00:00:00)
  Started preparing deployment > Binding templates. Done (00:00:00)
  Started preparing deployment > Binding properties. Done (00:00:00)
  Started preparing deployment > Binding unallocated VMs. Done (00:00:00)
  Started preparing deployment > Binding instance networks. Done (00:00:00)

  Started preparing package compilation > Finding packages to compile. Done (00:00:00)

  Started preparing dns > Binding DNS. Done (00:00:00)

  Started creating bound missing vms > resource_z1/0. Done (00:03:03)

  Started binding instance vms > cf_z1/0. Done (00:00:01)

  Started preparing configuration > Binding configuration. Done (00:00:01)

  Started updating job cf_z1 > cf_z1/0 (canary). Done (00:40:53)

Task 5 done

Started     2015-12-11 05:13:50 UTC
Finished    2015-12-11 05:57:49 UTC
Duration    00:43:59

Deployed `cf-azure' to `bosh'

VMの数

いろいろビルドとかしているとVMが6個ぐらい立ち上がって、ビルド終わると消えていきます。見てて面白いですが、コア数が足りなくなってDeploy時にエラーになりました。

ARM を使用しており、無料評価版だとリージョン当たりのコア数が4つしかないので、エラーになります。試す場合はサポートに相談してコア数を上げてもらう必要があるのでご注意下さい。

通常はBOSH用、Director用、Cloud Foundry用で3つ起動しているようです。が、なんか2つにも収められるようで、Cloud Foundry力が足りないと感じました。

Azure Portal のリソース一覧を貼っておきます。

f:id:nnasaki:20151211211415p:plain

まとめ

疲れたー。

慣れるとコマンドを実行してからの待ち時間が長いと感じました。手で置換している部分が自動化できると良いんですけどね。

次になにをするべきか?

やりたかったことは、PostgreSQL や MySQL をつくって、Spring Boot な Java アプリケーションをデプロイすることですが、そこまでたどり着けませんでした。Getting Started with the cf CLI | Cloud Foundry Docs を見て、 cf コマンドを実行するも API endpoint ってどこ? って感じです。

圧倒的に Cloud Foundry 力が不足しているのでどなたか教えて欲しいです。。。