--- title: Cloud Foundry on Azureにcf-mysqlをインストール tags: ["Azure", "BOSH", "Cloud Foundry", "MySQL", "MariaDB"] categories: ["Dev", "PaaS", "CloudFoundry"] date: 2016-09-15T03:52:33Z updated: 2016-09-15T13:16:30Z --- [前の記事](https://blog.ik.am/entries/374)でAzureにCloud Foundryをインストールしたが、バックエンドサービスが一つもないので、[cf-mysql](https://github.com/cloudfoundry/cf-mysql-release)を用意してみる。 CF on AzureにMySQLを用意する方法は[BOSH Azure CPIのドキュメント](https://github.com/cloudfoundry-incubator/bosh-azure-cpi-release/tree/master/docs/advanced/deploy-mysql)に載っているので、基本その通りにやればできる。 ただ、このcf-mysqlはHA対応しており、次のような構成になっている。 ![p-mysql](https://blog.pivotal.io/wp-content/uploads/2015/02/MySQL-HA.png) [BOSH Azure CPIのドキュメント](https://github.com/cloudfoundry-incubator/bosh-azure-cpi-release/tree/master/docs/advanced/deploy-mysql)の通りにインストールすると、Proxy 2台、Maria DB Server 3台、Service Broker 2台の構成になって、試用には少し大きい。まずはドキュメント通りインストールして後から縮退する。 最初にMariaDB 3台をそれぞれ別のネットワークに置きたいので、azure cliでsubnetを作る(コンパイル用のsubnetも作るとして、全部で4つのsubnet) ``` azure network vnet subnet create --resource-group "azure-cf" --vnet-name "boshvnet-crp" --name "mysql1" --address-prefix "10.0.50.0/24" azure network vnet subnet create --resource-group "azure-cf" --vnet-name "boshvnet-crp" --name "mysql2" --address-prefix "10.0.51.0/24" azure network vnet subnet create --resource-group "azure-cf" --vnet-name "boshvnet-crp" --name "mysql3" --address-prefix "10.0.52.0/24" azure network vnet subnet create --resource-group "azure-cf" --vnet-name "boshvnet-crp" --name "compilation" --address-prefix "10.0.53.0/24" ``` Azureのダッシュボードでサブネットを見ると次のようになっているはず。 次にmanifestファイルを作成する。[ここ](https://github.com/cloudfoundry-incubator/bosh-azure-cpi-release/tree/master/docs/advanced/deploy-mysql)から次の3ファイルをダウンロードする。 * `cf-infrastructure-azure.yml` * `cf-mysql-template.yml` * `sample_azure_stub.yml` このうち、`sample_azure_stub.yml`を`cf-mysql-azure-stub.yml`にコピーして、`REPLACE_XXXX`の部分を自分の環境に合わせて埋める。 [前記事](https://blog.ik.am/entries/374)の例で言うとdiffは次のような感じになるはず。 ``` diff 1c1 < director_uuid: REPLACE_WITH_YOUR_DIRECTOR_UUID --- > director_uuid: cf2c3591-2374-456c-bcb3-7901355cd084 # bosh status --uuidで確認 7c7 < environment: REPLACE_WITH_YOUR_ENVIRONMENT_NAME --- > environment: cf-azure 16c16 < - range: 10.0.32.0/24 --- > - range: 10.0.50.0/24 18c18 < - 10.0.32.2 - 10.0.32.3 --- > - 10.0.50.2 - 10.0.50.3 20,21c20,21 < - 10.0.32.4 - 10.0.32.8 < gateway: 10.0.32.1 --- > - 10.0.50.4 - 10.0.50.8 > gateway: 10.0.50.1 30c30 < - range: 10.0.33.0/24 --- > - range: 10.0.51.0/24 32c32 < - 10.0.33.2 - 10.0.33.3 --- > - 10.0.51.2 - 10.0.51.3 34,35c34,35 < - 10.0.33.4 - 10.0.33.8 < gateway: 10.0.33.1 --- > - 10.0.51.4 - 10.0.51.8 > gateway: 10.0.51.1 44c44 < - range: 10.0.34.0/24 --- > - range: 10.0.52.0/24 46c46 < - 10.0.34.2 - 10.0.34.3 --- > - 10.0.52.2 - 10.0.52.3 48,49c48,49 < - 10.0.34.4 - 10.0.34.8 < gateway: 10.0.34.1 --- > - 10.0.52.4 - 10.0.52.8 > gateway: 10.0.52.1 58c58 < - range: 10.0.35.0/24 --- > - range: 10.0.53.0/24 61c61 < - 10.0.35.2 - 10.0.35.3 --- > - 10.0.53.2 - 10.0.53.3 63,64c63,64 < - 10.0.35.4 - 10.0.35.8 < gateway: 10.0.35.1 --- > - 10.0.53.4 - 10.0.53.8 > gateway: 10.0.53.1 74,76c74,76 < admin_username: REPLACE_WITH_YOUR_CF_ADMIN_USERNAME < admin_password: REPLACE_WITH_YOUR_CF_ADMIN_PASSWORD < skip_ssl_validation: REPLACE_WITH_TRUE_OR_FALSE # True if you don't have a trusted SSL certificate, false if you do --- > admin_username: admin > admin_password: c1oudc0w > skip_ssl_validation: true # True if you don't have a trusted SSL certificate, false if you do 78c78 < domain: REPLACE_WITH_YOUR_CF_SYSTEM_DOMAIN # The broker registers a route at p-msyql.external_domain. --- > domain: azurecf.ik.am # The broker registers a route at p-msyql.external_domain. 80c80 < - REPLACE_WITH_YOUR_CF_APPS_DOMAIN --- > - azurecf.ik.am 83c83 < password: REPLACE_WITH_NATS_PASSWORD_FROM_CF_RELEASE --- > password: c1oudc0w 85c85 < - REPLACE_WITH_NATS_IP_ADDRESS_FROM_CF_RELEASE --- > - 10.0.16.13 90c90 < virtual_network_name: REPLACE_WITH_YOUR_VIRTUAL_NETWORK_NAME --- > virtual_network_name: boshvnet-crp 92,95c92,95 < mysql1: REPLACE_WITH_YOUR_SUBNET_NAME_1 < mysql2: REPLACE_WITH_YOUR_SUBNET_NAME_2 < mysql3: REPLACE_WITH_YOUR_SUBNET_NAME_3 < compilation: REPLACE_WITH_YOUR_COMPILATION_SUBNET --- > mysql1: mysql1 > mysql2: mysql2 > mysql3: mysql3 > compilation: compilation 102c102 < admin_password: REPLACE_WITH_A_PASSWORD_YOU_MAKE_UP #The admin password for the MySQL server process --- > admin_password: mysqlpassword #The admin password for the MySQL server process 104,105c104,105 < username: REPLACE_WITH_A_USERNAME_YOU_MAKE_UP < password: REPLACE_WITH_A_PASSWORD_YOU_MAKE_UP --- > username: mysqluser > password: mysqlpassword 113,115c113,115 < auth_username: REPLACE_WITH_A_USERNAME_YOU_MAKE_UP # eg. cc < auth_password: REPLACE_WITH_A_PASSWORD_YOU_MAKE_UP < cookie_secret: REPLACE_WITH_A_PASSWORD_YOU_MAKE_UP --- > auth_username: mysqluser # eg. cc > auth_password: mysqlpassword > cookie_secret: mysqlpassword 119c119 < secret: REPLACE_WITH_A_PASSWORD_YOU_MAKE_UP #Secret used by MySQL dashboard to fetch an OAuth token from UAA --- > secret: mysqlpassword #Secret used by MySQL dashboard to fetch an OAuth token from UAA 156,157c156,157 < api_username: REPLACE_WITH_A_USERNAME_YOU_MAKE_UP < api_password: REPLACE_WITH_A_PASSWORD_YOU_MAKE_UP --- > api_username: mysqluser > api_password: mysqlpassword ``` 3つのyamlをマージするために`spiff`をダウンロード。 ``` sudo apt-get install unzip wget https://github.com/cloudfoundry-incubator/spiff/releases/download/v1.0.7/spiff_linux_amd64.zip unzip spiff_linux_amd64.zip sudo mv spiff /usr/bin/ ``` マージして`cf-mysql-azure.yml`というBOSHのマニフェストファイルを作成。 ``` console spiff merge cf-mysql-template.yml cf-infrastructure-azure.yml cf-mysql-azure-stub.yml > cf-mysql-azure.yml ``` マニフェストファイルをBOSH Directorに配置して、`bosh deploy` ``` console $ bosh deployment cf-mysql-azure.yml && bosh -n deploy Deployment set to `/home/making/bosh-azure-cpi-release/docs/advanced/deploy-mysql/cf-mysql-azure.yml' Acting as user 'admin' on deployment 'cf-azure-mysql' on 'bosh' Getting deployment properties from director... Unable to get properties list from director, trying without it... Cannot get current deployment information from director, possibly a new deployment Deploying --------- Director task 23 Deprecation: Ignoring cloud config. Manifest contains 'networks' section. Started preparing deployment > Preparing deployment. Done (00:00:01) Started preparing package compilation > Finding packages to compile. Done (00:00:00) Started compiling packages Started compiling packages > cli/24305e50a638ece2cace4ef4803746c0c9fe4bb0 Started compiling packages > mysqlclient/ce95f8ac566f76b650992987d5282ee473356e43 Started compiling packages > ruby/1e7b91e63e8d3a6f55aef4b47b54e334f3a2130b Started compiling packages > syslog_aggregator/078da6dcb999c1e6f5398a6eb739182ccb4aba25 Done compiling packages > cli/24305e50a638ece2cace4ef4803746c0c9fe4bb0 (00:02:36) Started compiling packages > common/ba480a46c4b2aa9484fb24ed01a8649453573e6f. Done (00:00:13) Started compiling packages > golang/9f7c66f922b86570bc366ba071f35fdecde17e8e Done compiling packages > syslog_aggregator/078da6dcb999c1e6f5398a6eb739182ccb4aba25 (00:02:55) Started compiling packages > python/4e255efa754d91b825476b57e111345f200944e1 Done compiling packages > golang/9f7c66f922b86570bc366ba071f35fdecde17e8e (00:00:36) Started compiling packages > check/d6811f25e9d56428a9b942631c27c9b24f5064dc Done compiling packages > mysqlclient/ce95f8ac566f76b650992987d5282ee473356e43 (00:03:54) Started compiling packages > boost/3eb8bdb1abb7eff5b63c4c5bdb41c0a778925c31 Done compiling packages > check/d6811f25e9d56428a9b942631c27c9b24f5064dc (00:00:31) Started compiling packages > bootstrap/97d308ebffa4f8da0c8c93eb1e3310d53461bbf6. Done (00:00:19) Started compiling packages > acceptance-tests/efb3ddcf58277fc01b0993c91fc831f5a88d4cc8. Done (00:00:43) Started compiling packages > quota-enforcer/e2c4c9e7d7bbbe4bfdc0866962461b00e654cca3. Done (00:00:18) Started compiling packages > route-registrar/e2293d2a59214e8840e2c6ca3aa32e5a8faf8558. Done (00:00:19) Started compiling packages > switchboard/934ee6b7e7ce6a14531bd84aa5d4265e131efb38. Done (00:00:20) Started compiling packages > gra-log-purger/f02fa5774ab54dbb1b1c3702d03cb929b85d60e6. Done (00:00:16) Started compiling packages > galera-healthcheck/b59fe51d570da4cff95baab323946f794068f2cf Done compiling packages > python/4e255efa754d91b825476b57e111345f200944e1 (00:03:25) Started compiling packages > mariadb_ctrl/3732b3c0c6ab24017104b72bfd3dde609b800566 Done compiling packages > boost/3eb8bdb1abb7eff5b63c4c5bdb41c0a778925c31 (00:02:36) Started compiling packages > scons/11e7ad3b28b43a96de3df7aa41afddde582fcc38 Done compiling packages > galera-healthcheck/b59fe51d570da4cff95baab323946f794068f2cf (00:00:22) Done compiling packages > mariadb_ctrl/3732b3c0c6ab24017104b72bfd3dde609b800566 (00:00:23) Done compiling packages > scons/11e7ad3b28b43a96de3df7aa41afddde582fcc38 (00:00:14) Started compiling packages > galera/d15a1d2d15e5e7417278d4aa1b908566022b9623 Done compiling packages > ruby/1e7b91e63e8d3a6f55aef4b47b54e334f3a2130b (00:07:48) Started compiling packages > cf-mysql-broker/47cdbff74dadd949abd599bbd259fe7a53bbd68f. Done (00:01:11) Done compiling packages > galera/d15a1d2d15e5e7417278d4aa1b908566022b9623 (00:13:39) Started compiling packages > mariadb/73a290c83b875ab4972465ff8458e745f4d02cf5. Done (00:24:42) Started compiling packages > xtrabackup/2e701e7a9e4241b28052d984733de36aae152275. Done (00:16:43) Done compiling packages (01:01:48) Started creating missing vms Started creating missing vms > mysql_z1/0 (58f6f463-6ecb-4a8b-a915-00ae4ac2960d) Started creating missing vms > mysql_z2/0 (b9ce4c91-c332-4ce7-a99d-957eedb257d2) Started creating missing vms > mysql_z3/0 (2a17bc3a-0b81-410f-8fd0-92ac3ae9f00b) Started creating missing vms > proxy_z1/0 (1861bda0-e3a2-4a09-9a91-9bca95128bc3) Started creating missing vms > proxy_z2/0 (25e271ff-f916-421d-bcac-6149bc95b376) Started creating missing vms > cf-mysql-broker_z1/0 (b213d50b-54a2-403e-a520-9ed5207d9a90) Started creating missing vms > cf-mysql-broker_z2/0 (0e3bc3a3-2a11-4ecb-b30c-5d59253055b4) Done creating missing vms > proxy_z1/0 (1861bda0-e3a2-4a09-9a91-9bca95128bc3) (00:02:07) Done creating missing vms > cf-mysql-broker_z2/0 (0e3bc3a3-2a11-4ecb-b30c-5d59253055b4) (00:02:18) Done creating missing vms > mysql_z1/0 (58f6f463-6ecb-4a8b-a915-00ae4ac2960d) (00:02:20) Done creating missing vms > mysql_z3/0 (2a17bc3a-0b81-410f-8fd0-92ac3ae9f00b) (00:02:21) Done creating missing vms > cf-mysql-broker_z1/0 (b213d50b-54a2-403e-a520-9ed5207d9a90) (00:02:30) Done creating missing vms > proxy_z2/0 (25e271ff-f916-421d-bcac-6149bc95b376) (00:02:33) Done creating missing vms > mysql_z2/0 (b9ce4c91-c332-4ce7-a99d-957eedb257d2) (00:03:05) Done creating missing vms (00:03:05) Started updating job mysql_z1 > mysql_z1/0 (58f6f463-6ecb-4a8b-a915-00ae4ac2960d) (canary). Done (00:02:50) Started updating job mysql_z2 > mysql_z2/0 (b9ce4c91-c332-4ce7-a99d-957eedb257d2) (canary). Done (00:03:47) Started updating job mysql_z3 > mysql_z3/0 (2a17bc3a-0b81-410f-8fd0-92ac3ae9f00b) (canary). Done (00:03:15) Started updating job proxy_z1 > proxy_z1/0 (1861bda0-e3a2-4a09-9a91-9bca95128bc3) (canary). Done (00:00:53) Started updating job proxy_z2 > proxy_z2/0 (25e271ff-f916-421d-bcac-6149bc95b376) (canary). Done (00:00:52) Started updating job cf-mysql-broker_z1 > cf-mysql-broker_z1/0 (b213d50b-54a2-403e-a520-9ed5207d9a90) (canary). Done (00:01:17) Started updating job cf-mysql-broker_z2 > cf-mysql-broker_z2/0 (0e3bc3a3-2a11-4ecb-b30c-5d59253055b4) (canary). Done (00:01:16) Task 23 done Started 2016-09-14 17:17:28 UTC Finished 2016-09-14 18:39:35 UTC Duration 01:22:07 Deployed `cf-azure-mysql' to `bosh' ``` mariadbなどのコンパイルに結構時間かかり、デプロイは1時間20分ほど要する。 ``` $ bosh vms Acting as user 'admin' on 'bosh' Deployment `cf-azure-mysql' Director task 45 Task 45 done +-------------------------------------------------------------+---------+-----+--------------------+-----------+ | VM | State | AZ | VM Type | IPs | +-------------------------------------------------------------+---------+-----+--------------------+-----------+ | cf-mysql-broker_z1/0 (b213d50b-54a2-403e-a520-9ed5207d9a90) | running | n/a | cf-mysql-broker_z1 | 10.0.50.9 | | cf-mysql-broker_z2/0 (0e3bc3a3-2a11-4ecb-b30c-5d59253055b4) | running | n/a | cf-mysql-broker_z2 | 10.0.51.9 | | mysql_z1/0 (58f6f463-6ecb-4a8b-a915-00ae4ac2960d) | running | n/a | mysql_z1 | 10.0.50.4 | | mysql_z2/0 (b9ce4c91-c332-4ce7-a99d-957eedb257d2) | running | n/a | mysql_z2 | 10.0.51.4 | | mysql_z3/0 (2a17bc3a-0b81-410f-8fd0-92ac3ae9f00b) | running | n/a | mysql_z3 | 10.0.52.4 | | proxy_z1/0 (1861bda0-e3a2-4a09-9a91-9bca95128bc3) | running | n/a | proxy_z1 | 10.0.50.5 | | proxy_z2/0 (25e271ff-f916-421d-bcac-6149bc95b376) | running | n/a | proxy_z2 | 10.0.51.5 | +-------------------------------------------------------------+---------+-----+--------------------+-----------+ VMs total: 7 Deployment `multiple-cf-on-azure' Director task 46 Task 46 done +---------------------------------------------------------------------------+---------+-----+-------------+---------------+ | VM | State | AZ | VM Type | IPs | +---------------------------------------------------------------------------+---------+-----+-------------+---------------+ | access_z1/0 (74a1ab9d-32c9-46aa-9903-1430ed474249) | running | n/a | resource_z1 | 10.0.16.109 | | api_z1/0 (47cffc4f-e68f-450f-ad55-e016b3ec7e01) | running | n/a | resource_z1 | 10.0.16.102 | | brain_z1/0 (6a0ed991-b9ad-4743-b5c6-60eef37c1a51) | running | n/a | resource_z1 | 10.0.16.106 | | cc_bridge_z1/0 (7001782d-97d4-48e0-a288-b49fe99e907e) | running | n/a | resource_z1 | 10.0.16.108 | | cell_z1/0 (46f83357-a890-463d-9f34-ff6e37082a32) | running | n/a | resource_z1 | 10.0.16.107 | | consul_z1/0 (eb86b16c-aee0-4711-8a4d-c1046e666d43) | running | n/a | resource_z1 | 10.0.16.16 | | database_z1/0 (e42d51b8-2509-4aa6-a5de-c26ff161746c) | running | n/a | resource_z1 | 10.0.16.105 | | doppler_z1/0 (facd13de-9e7e-4919-a21f-f8c25dcb76e0) | running | n/a | resource_z1 | 10.0.16.103 | | etcd_z1/0 (0b0d0610-35e9-4a18-8861-3e5bd6c2bbb8) | running | n/a | resource_z1 | 10.0.16.14 | | ha_proxy_z1/0 (b0e54bf1-20e8-4861-8ec6-3897a5e04177) | running | n/a | resource_z1 | 10.0.16.4 | | | | | | 13.78.121.100 | | loggregator_trafficcontroller_z1/0 (89e9789a-cf8d-481c-b4bd-e71de58947a3) | running | n/a | resource_z1 | 10.0.16.104 | | nats_z1/0 (f7bfc395-4168-41ac-b40c-61810927baff) | running | n/a | resource_z1 | 10.0.16.13 | | nfs_z1/0 (ab811af8-9e12-4f03-bede-cb6488ab13be) | running | n/a | resource_z1 | 10.0.16.15 | | postgres_z1/0 (e0da4072-bff1-42a5-b6db-2d4e6876810a) | running | n/a | resource_z1 | 10.0.16.11 | | route_emitter_z1/0 (dff8bc35-5020-4c62-a3b9-387d719e2546) | running | n/a | resource_z1 | 10.0.16.110 | | router_z1/0 (50ec2d18-6971-49d2-bd14-d2b6946b18f0) | running | n/a | resource_z1 | 10.0.16.12 | | uaa_z1/0 (f04a9a3d-3b70-4fbc-b52d-979f9064d905) | running | n/a | resource_z1 | 10.0.16.101 | +---------------------------------------------------------------------------+---------+-----+-------------+---------------+ VMs total: 17 ``` Proxyにアクセス(`https://proxy-0-p-mysql.`)すると3ノード認識されていることがわかる。 ![proxy](https://qiita-image-store.s3.amazonaws.com/0/1852/4b6273e3-359f-e311-7de7-9f5581f29dd3.png) 次にService BrokerをCloud Foundryに登録して、`cf marketplace`からこのMySQLを使えるようにする。 ``` $ bosh run errand broker-registrar Acting as user 'admin' on deployment 'cf-azure-mysql' on 'bosh' Director task 47 Started preparing deployment > Preparing deployment. Done (00:00:00) Started preparing package compilation > Finding packages to compile. Done (00:00:00) Started creating missing vms > broker-registrar/0 (f878d368-eafa-4c16-9891-12581b66caa4). Done (00:02:38) Started updating job broker-registrar > broker-registrar/0 (f878d368-eafa-4c16-9891-12581b66caa4) (canary). Done (00:00:44) Started running errand > broker-registrar/0. Done (00:00:03) Started fetching logs for broker-registrar/f878d368-eafa-4c16-9891-12581b66caa4 (0) > Finding and packing log files. Done (00:00:01) Started deleting errand instances broker-registrar > broker-registrar/0 (f878d368-eafa-4c16-9891-12581b66caa4). Done (00:02:40) Task 47 done Started 2016-09-15 00:02:42 UTC Finished 2016-09-15 00:08:49 UTC Duration 00:06:07 [stdout] CF_API_URL=https://api.azurecf.ik.am CF_SKIP_SSL_VALIDATION=true CF_ADMIN_USERNAME=admin BROKER_NAME=p-mysql BROKER_URL=https://p-mysql.azurecf.ik.am:443 BROKER_USERNAME=mysqluser Setting api endpoint to https://api.azurecf.ik.am... OK API endpoint: https://api.azurecf.ik.am (API version: 2.57.0) Not logged in. Use 'cf login' to log in. API endpoint: https://api.azurecf.ik.am Authenticating... OK Use 'cf target' to view or set your target org and space Service broker does not exist - creating broker Creating service broker p-mysql as admin... OK Enabling access of plan 100mb for service p-mysql as admin... OK Enabling access of plan 1gb for service p-mysql as admin... OK [stderr] None Errand `broker-registrar' completed successfully (exit code 0) ``` 念の為、Service Brokerの`/v2/catalog` APIにアクセス。 ``` $ curl -u mysqluser:mysqlpassword -k https://p-mysql.azurecf.ik.am/v2/catalog | jq . % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 14529 0 14529 0 0 261k 0 --:--:-- --:--:-- --:--:-- 262k { "services": [ { "dashboard_client": { "redirect_uri": "https://p-mysql.azurecf.ik.am/", "secret": "mysqlpassword", "id": "p-mysql" }, "id": "44b26033-1f54-4087-b7bc-da9652c2a539", "name": "p-mysql", "description": "MySQL databases on demand", "tags": [ "mysql" ], "metadata": { "supportUrl": "https://support.pivotal.io", "documentationUrl": "https://github.com/cloudfoundry/cf-mysql-release/blob/master/README.md", "providerDisplayName": "Pivotal Software", "longDescription": "Creating a service instance provisions a database. Binding applications provisions unique credentials for each application to access the database.", "imageUrl": "data:image/png;base64,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", "displayName": "MySQL for Pivotal Cloud Foundry" }, "plan_updateable": true, "plans": [ { "metadata": { "displayName": "100 MB", "bullets": [ "Shared MySQL server", "100 MB storage", "20 concurrent connections" ], "costs": [ { "unit": "MONTH", "amount": { "usd": 0 } } ] }, "description": "Shared MySQL Server", "name": "100mb", "id": "ab08f1bc-e6fc-4b56-a767-ee0fea6e3f20" }, { "metadata": { "displayName": "1 GB", "bullets": [ "Shared MySQL server", "1000 MB storage", "40 concurrent connections" ], "costs": [ { "unit": "MONTH", "amount": { "usd": 0 } } ] }, "description": "Shared MySQL Server", "name": "1gb", "id": "11d0aa36-dcec-4021-85f5-ea4d9a5c8342" } ], "bindable": true } ] } ``` 問題なし。マーケットプレースにも登録されている🙌 ``` $ cf marketplace Getting services from marketplace in org default_organization / space demo as admin... OK service plans description p-mysql 100mb, 1gb MySQL databases on demand TIP: Use 'cf marketplace -s SERVICE' to view descriptions of individual plans of a given service. ``` このままでも使えるが、今回はHA不要として、1ノードに縮退する。マニフェストファイルのうち、2台目以降の`instances`を0にして、`10.0.51.x`と`10.0.52.x`のIPをコメントアウトする。 ``` diff 27,28c27,28 < - 10.0.51.4 < - 10.0.52.4 --- > # - 10.0.51.4 > # - 10.0.52.4 41c41 < - instances: 1 --- > - instances: 0 45,46c45,46 < static_ips: < - 10.0.51.4 --- > # static_ips: > # - 10.0.51.4 69c69 < - instances: 1 --- > - instances: 0 73,74c73,74 < static_ips: < - 10.0.52.4 --- > # static_ips: > # - 10.0.52.4 106,107c106,107 < - 10.0.51.4 < - 10.0.52.4 --- > # - 10.0.51.4 > # - 10.0.52.4 123c123 < - 10.0.51.5 --- > # - 10.0.51.5 129c129 < - instances: 1 --- > - instances: 0 133,134c133,134 < static_ips: < - 10.0.51.5 --- > # static_ips: > # - 10.0.51.5 244c244 < - instances: 1 --- > - instances: 0 487,488c487,488 < - 10.0.51.4 < - 10.0.52.4 --- > #- 10.0.51.4 > #- 10.0.52.4 567,568c567,568 < - 10.0.51.4 < - 10.0.52.4 --- > # - 10.0.51.4 > # - 10.0.52.4 571c571 < - 10.0.51.5 --- > # - 10.0.51.5 ``` 変更後のマニフェスト例は[こちら](https://gist.github.com/making/d10dea07f217a76169580aeebac9e56a)。 変更したら再度`bosh deploy`。 ``` console $ bosh -n deploy Acting as user 'admin' on deployment 'cf-azure-mysql' on 'bosh' Getting deployment properties from director... Detecting deployment changes ---------------------------- Releases cf-mysql version type changed: String -> Fixnum - 25 + 25 Compilation No changes Update No changes Resource pools No changes Disk pools No changes Networks No changes Jobs mysql_z1 properties ± cluster_ips: - 10.0.51.4 - 10.0.52.4 mysql_z2 ± instances: - 1 + 0 ± networks: - {"name"=>"mysql2", "static_ips"=>["10.0.51.4"]} + {"name"=>"mysql2"} mysql_z3 ± instances: - 1 + 0 ± networks: - {"name"=>"mysql3", "static_ips"=>["10.0.52.4"]} + {"name"=>"mysql3"} proxy_z1 properties ± cluster_ips: - 10.0.51.4 - 10.0.52.4 proxy ± proxy_ips: - 10.0.51.5 proxy_z2 ± instances: - 1 + 0 ± networks: - {"name"=>"mysql2", "static_ips"=>["10.0.51.5"]} + {"name"=>"mysql2"} cf-mysql-broker_z2 ± instances: - 1 + 0 bootstrap properties ± cluster_ips: - 10.0.51.4 - 10.0.52.4 Properties ± default_mysql_cluster_ips: - 10.0.51.4 - 10.0.52.4 ± default_proxy_ips: - 10.0.51.5 Meta No changes Deploying --------- Director task 60 Deprecation: Ignoring cloud config. Manifest contains 'networks' section. Started preparing deployment > Preparing deployment. Done (00:00:00) Started preparing package compilation > Finding packages to compile. Done (00:00:00) Started updating job mysql_z1 > mysql_z1/0 (58f6f463-6ecb-4a8b-a915-00ae4ac2960d) (canary). Done (00:00:59) Started deleting unneeded instances mysql_z2 > mysql_z2/0 (b9ce4c91-c332-4ce7-a99d-957eedb257d2). Done (00:02:01) Started deleting unneeded instances mysql_z3 > mysql_z3/0 (2a17bc3a-0b81-410f-8fd0-92ac3ae9f00b). Done (00:02:49) Started updating job proxy_z1 > proxy_z1/0 (1861bda0-e3a2-4a09-9a91-9bca95128bc3) (canary). Done (00:00:44) Started deleting unneeded instances proxy_z2 > proxy_z2/0 (25e271ff-f916-421d-bcac-6149bc95b376). Done (00:02:41) Started deleting unneeded instances cf-mysql-broker_z2 > cf-mysql-broker_z2/0 (0e3bc3a3-2a11-4ecb-b30c-5d59253055b4). Done (00:02:51) Task 60 done Started 2016-09-15 02:46:45 UTC Finished 2016-09-15 02:58:51 UTC Duration 00:12:06 Deployed `cf-azure-mysql' to `bosh' ``` Proxy、 MariaDB Server、Service Brokerがそれぞれ1台(`10.0.50.x`)になっていることがわかる。 ``` console $ bosh vms Acting as user 'admin' on 'bosh' Deployment `cf-azure-mysql' Director task 67 Task 67 done +-------------------------------------------------------------+---------+-----+--------------------+-----------+ | VM | State | AZ | VM Type | IPs | +-------------------------------------------------------------+---------+-----+--------------------+-----------+ | cf-mysql-broker_z1/0 (b213d50b-54a2-403e-a520-9ed5207d9a90) | running | n/a | cf-mysql-broker_z1 | 10.0.50.9 | | mysql_z1/0 (58f6f463-6ecb-4a8b-a915-00ae4ac2960d) | running | n/a | mysql_z1 | 10.0.50.4 | | proxy_z1/0 (1861bda0-e3a2-4a09-9a91-9bca95128bc3) | running | n/a | proxy_z1 | 10.0.50.5 | +-------------------------------------------------------------+---------+-----+--------------------+-----------+ VMs total: 3 Deployment `multiple-cf-on-azure' Director task 68 Task 68 done +---------------------------------------------------------------------------+---------+-----+-------------+---------------+ | VM | State | AZ | VM Type | IPs | +---------------------------------------------------------------------------+---------+-----+-------------+---------------+ | access_z1/0 (74a1ab9d-32c9-46aa-9903-1430ed474249) | running | n/a | resource_z1 | 10.0.16.109 | | api_z1/0 (47cffc4f-e68f-450f-ad55-e016b3ec7e01) | running | n/a | resource_z1 | 10.0.16.102 | | brain_z1/0 (6a0ed991-b9ad-4743-b5c6-60eef37c1a51) | running | n/a | resource_z1 | 10.0.16.106 | | cc_bridge_z1/0 (7001782d-97d4-48e0-a288-b49fe99e907e) | running | n/a | resource_z1 | 10.0.16.108 | | cell_z1/0 (46f83357-a890-463d-9f34-ff6e37082a32) | running | n/a | resource_z1 | 10.0.16.107 | | consul_z1/0 (eb86b16c-aee0-4711-8a4d-c1046e666d43) | running | n/a | resource_z1 | 10.0.16.16 | | database_z1/0 (e42d51b8-2509-4aa6-a5de-c26ff161746c) | running | n/a | resource_z1 | 10.0.16.105 | | doppler_z1/0 (facd13de-9e7e-4919-a21f-f8c25dcb76e0) | running | n/a | resource_z1 | 10.0.16.103 | | etcd_z1/0 (0b0d0610-35e9-4a18-8861-3e5bd6c2bbb8) | running | n/a | resource_z1 | 10.0.16.14 | | ha_proxy_z1/0 (b0e54bf1-20e8-4861-8ec6-3897a5e04177) | running | n/a | resource_z1 | 10.0.16.4 | | | | | | 13.78.121.100 | | loggregator_trafficcontroller_z1/0 (89e9789a-cf8d-481c-b4bd-e71de58947a3) | running | n/a | resource_z1 | 10.0.16.104 | | nats_z1/0 (f7bfc395-4168-41ac-b40c-61810927baff) | running | n/a | resource_z1 | 10.0.16.13 | | nfs_z1/0 (ab811af8-9e12-4f03-bede-cb6488ab13be) | running | n/a | resource_z1 | 10.0.16.15 | | postgres_z1/0 (e0da4072-bff1-42a5-b6db-2d4e6876810a) | running | n/a | resource_z1 | 10.0.16.11 | | route_emitter_z1/0 (dff8bc35-5020-4c62-a3b9-387d719e2546) | running | n/a | resource_z1 | 10.0.16.110 | | router_z1/0 (50ec2d18-6971-49d2-bd14-d2b6946b18f0) | running | n/a | resource_z1 | 10.0.16.12 | | uaa_z1/0 (f04a9a3d-3b70-4fbc-b52d-979f9064d905) | running | n/a | resource_z1 | 10.0.16.101 | +---------------------------------------------------------------------------+---------+-----+-------------+---------------+ VMs total: 17 ``` Proxyを見ても1ノードだけになっている。 ![p-mysql.png](https://qiita-image-store.s3.amazonaws.com/0/1852/47db9edd-548d-c7e3-17d5-cb4fd04613d4.png) あとは普通に使えばOK👍 ``` console $ cf create-service p-mysql 100mb demo-db Creating service instance demo-db in org default_organization / space demo as admin... OK $ cf services Getting services in org default_organization / space demo as admin... OK name service plan bound apps last operation demo-db p-mysql 100mb create succeeded $ cf bind-service demo-app demo-db Binding service demo-db to app demo-app in org default_organization / space demo as admin... OK TIP: Use 'cf restage demo-app' to ensure your env variable changes take effect $ cf env demo-app Getting env variables for app demo-app in org default_organization / space demo as admin... OK System-Provided: { "VCAP_SERVICES": { "p-mysql": [ { "credentials": { "hostname": "10.0.50.5", "jdbcUrl": "jdbc:mysql://10.0.50.5:3306/cf_a8a8ca5b_f3b2_46c7_90c8_81d659ba4530?user=taed8moNPw0pNACn\u0026password=zZnXpiPG8hRGV3yV", "name": "cf_a8a8ca5b_f3b2_46c7_90c8_81d659ba4530", "password": "zZnXpiPG8hRGV3yV", "port": 3306, "uri": "mysql://taed8moNPw0pNACn:zZnXpiPG8hRGV3yV@10.0.50.5:3306/cf_a8a8ca5b_f3b2_46c7_90c8_81d659ba4530?reconnect=true", "username": "taed8moNPw0pNACn" }, "label": "p-mysql", "name": "demo-db", "plan": "100mb", "provider": null, "syslog_drain_url": null, "tags": [ "mysql" ], "volume_mounts": [] } ] } } { "VCAP_APPLICATION": { "application_id": "92d6f5b8-01f9-4504-baff-59475cf7e2e0", "application_name": "demo-app", "application_uris": [ "demo-app.azurecf.ik.am" ], "application_version": "90527843-c56d-4d1b-88c1-bfb94ccb5ff8", "limits": { "disk": 1024, "fds": 16384, "mem": 8 }, "name": "demo-app", "space_id": "f7798e39-7ac0-4295-98ee-a66c96e63baf", "space_name": "demo", "uris": [ "demo-app.azurecf.ik.am" ], "users": null, "version": "90527843-c56d-4d1b-88c1-bfb94ccb5ff8" } } User-Provided: No running env variables have been set No staging env variables have been set ``` MySQLができたので、次は[AzureサービスのService Broker](https://github.com/Azure/meta-azure-service-broker)に行きたい。