---
title: Cloud Foundry on AzureにMeta Azure Service Brokerをインストール
tags: ["Azure", "BOSH", "Cloud Foundry", "Azure Storage", "Azure Redis Cache", "Azure DocumentDB", "Azure Service Bus", "Azure SQL Database"]
categories: ["Dev", "PaaS", "CloudFoundry"]
date: 2016-09-15T14:18:10Z
updated: 2016-09-15T14:20:39Z
---
[前の記事](https://blog.ik.am/entries/390)に続いて、Cloud Foundry on Azureにバックエンドサービスを追加する。
今度は[Meta Azure Service Broker](https://github.com/Azure/meta-azure-service-broker)。
これは次のAzureサービス群に対するCloud FoundryのService Brokerである。
* Azure Storage
* Azure Redis Cache
* Azure DocumentDB
* Azure Service Bus
* Azure SQL Database
これも[ドキュメント](https://github.com/Azure/meta-azure-service-broker/blob/master/docs/how-admin-deploy-the-broker.md)通りなのだが、少し気合が必要。まずはソースコード取得。この記事執筆段階では[`3916aac`](https://github.com/Azure/meta-azure-service-broker/tree/3916aacec4e6186d2e59730cf8f808feeda576b4)。
```
git clone https://github.com/Azure/meta-azure-service-broker
cd meta-azure-service-broker
```
### SQL Server準備
Service Brokerのメタ情報保存先としてSQL Serverが必要である。
https://azure.microsoft.com/ja-jp/documentation/articles/sql-database-get-started/
にしたがって作成。次の情報を入力してメモっておく。
* サーバー名
* ユーザー名
* パスワード
`mssql`コマンドインストール。
```
sudo apt-get install npm nodejs-legacy
sudo npm install -g sql-cli
```
接続して、ソースコードに含まれる`scripts/schema.sql`実行。
``` console
$ mssql --server "xxxx.database.windows.net" --database azure-cf-service-broker --user making@azure-cf-service-broker --pass xxxx --encrypt
sql-cli version 0.4.6
Enter ".help" for usage hints.
mssql> .run scripts/schema.sql
```
### Azure Serviceの有効化
`azure provider list`で`Registered`になっていないサービスを有効化。
```
azure provider register Microsoft.DocumentDB
azure provider register Microsoft.Cache
azure provider register Microsoft.ServiceBus
azure provider register Microsoft.Sql
azure provider register Microsoft.Storage
```
### DocumentDBの準備
DocumentDBだけはService BrokerによってDynamic Provisionできないので、事前に作成しておく必要がある(DocumentDBのService Brokerを使いたい時だけ)。
https://azure.microsoft.com/en-us/documentation/articles/documentdb-automation-resource-manager-cli/
にしたがって、CLIで作成。
```
azure resource create -g azure-cf -n azure-cf-documentdb -r "Microsoft.DocumentDB/databaseAccounts" -o 2015-04-08 -l japaneast -p "{\"databaseAccountOfferType\":\"Standard\"}"
```
接続情報をメモる。
### Service Brokerのデプロイ
次の2ファイルを用意。
`manifest.yml `
``` yaml
---
applications:
- name: meta-azure-service-broker
buildpack: https://github.com/cloudfoundry/nodejs-buildpack
instances: 1
env:
ENVIRONMENT: AzureCloud
SUBSCRIPTION_ID: aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
TENANT_ID: bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
CLIENT_ID: cccccccc-cccc-cccc-cccc-cccccccccccc
CLIENT_SECRET: changeme
DOCDB_HOSTENDPOINT: https://azure-cf-documentdb.documents.azure.com:443/
DOCDB_MASTERKEY: xxxxxx
```
`config/default.json`
``` json
{
"apiVersion": "2.8.0",
"authUser": "admin",
"authPassword": "password",
"name": "Meta Azure Service Broker",
"port": 5001,
"database": {
"server": "azure-cf-service-broker.database.windows.net",
"user": "making@azure-cf-service-broker",
"password": "xxxx",
"database": "azure-cf-service-broker"
}
}
```
AzureのService Broker用に`services` Organization、`azure` Spaceを作成し、`cf push`。
``` console
cf create-org services
cf target -o services -s azure
cf push
```
Service Brokerを登録。
```
cf create-service-broker azure-service-broker admin password https://meta-azure-service-broker.azurecf.ik.am
```
5つのサービスが登録され、様々なプランがあることがわかる。
``` console
$ cf service-access
Getting service access as admin...
broker: p-mysql
service plan access orgs
p-mysql 100mb all
p-mysql 1gb all
broker: azure-service-broker
service plan access orgs
azure-documentdb standard none
azure-rediscache basic none
azure-rediscache standard none
azure-rediscache premium none
azure-servicebus standard none
azure-sqldb basic none
azure-sqldb StandardS0 none
azure-sqldb StandardS1 none
azure-sqldb StandardS2 none
azure-sqldb StandardS3 none
azure-sqldb PremiumP1 none
azure-sqldb PremiumP2 none
azure-sqldb PremiumP4 none
azure-sqldb PremiumP6 none
azure-sqldb PremiumP11 none
azure-storageblob standard none
```
全部有効にする。
```
cf enable-service-access azure-documentdb
cf enable-service-access azure-rediscache
cf enable-service-access azure-servicebus
cf enable-service-access azure-sqldb
cf enable-service-access azure-storageblob
```
マーケットプレースに登録された🙌
``` console
$ cf marketplace
Getting services from marketplace in org services / space azure as admin...
OK
service plans description
azure-documentdb standard* Azure DocumentDb Service
azure-rediscache basic*, standard*, premium* Azure Redis Cache Service
azure-servicebus standard* Azure Service Bus Service
azure-sqldb basic*, StandardS0*, StandardS1*, StandardS2*, StandardS3*, PremiumP1*, PremiumP2*, PremiumP4*, PremiumP6*, PremiumP11* Azure SQL Database Service
azure-storageblob standard* Azure Storage Blob Service
p-mysql 100mb, 1gb MySQL databases on demand
* These service plans have an associated cost. Creating a service instance will incur this cost.
TIP: Use 'cf marketplace -s SERVICE' to view descriptions of individual plans of a given service.
```
### サービスインスタンス作成
#### Azure DocumentDB
https://github.com/Azure/meta-azure-service-broker/blob/3916aacec4e6186d2e59730cf8f808feeda576b4/docs/azure-document-db.md
`cf create-service`を実行時に、様々なパラメータJSONで渡す必要がある。次の`azure-documentdb-config.json`を作成。
``` json
{
"resourceGroup": "my-resource-group-name",
"docDbName": "mrs",
"parameters": {
"location": "japaneast"
}
}
```
サービスインタンス作成。
```
cf create-service azure-documentdb standard demo-doc -c azure-documentdb-config.json
```
すでに作成済みのDocumentDBインスタンスを使用するのでサービスインタンスの作成は早い。
``` console
$ cf services
admin として組織 default_organization / スペース demo 内のサービスを取得しています...
OK
名前 サービス プラン バインド済みアプリ 最後の操作
demo-doc azure-documentdb standard create は成功しました
demo-db p-mysql 100mb demo-app create は成功しました
```
アプリにバインド
```
cf bind-service demo-app demo-db
```
環境変数を見ると次のような`credentials`が設定されていることがわかる。
``` console
$ cf env demo-app
admin として組織 default_organization / スペース demo 内のアプリ demo-app の環境変数を取得しています...
OK
システム提供:
{
"VCAP_SERVICES": {
"azure-documentdb": [
{
"credentials": {
"documentdb_database": "demo-app",
"documentdb_host": "https://azure-cf-documentdb.documents.azure.com:443/",
"documentdb_key": "xxxx",
"documentdb_resource_id": "xxxx"
},
"label": "azure-documentdb",
"name": "demo-doc",
"plan": "standard",
"provider": null,
"syslog_drain_url": null,
"tags": [],
"volume_mounts": []
}
],
"p-mysql": [
{
"credentials": {
"hostname": "10.0.50.5",
"jdbcUrl": "jdbc:mysql://10.0.50.5:3306/xxxx,
"name": "xxxx",
"password": "xxxx",
"port": 3306,
"uri": "mysql://xxxx:xxxx@10.0.50.5:3306/xxxx",
"username": "xxxx"
},
"label": "p-mysql",
"name": "demo-db",
"plan": "100mb",
"provider": null,
"syslog_drain_url": null,
"tags": [
"mysql"
],
"volume_mounts": []
}
]
}
}
{
"VCAP_APPLICATION": {
"application_id": "cdbdc286-9173-49cb-8ce4-b7baef81b17b",
"application_name": "demo-app",
"application_uris": [
"demo-app.azurecf.ik.am"
],
"application_version": "b0d2da70-be02-4c94-aac5-c334961fa7a7",
"limits": {
"disk": 1024,
"fds": 16384,
"mem": 512
},
"name": "demo-app",
"space_id": "f7798e39-7ac0-4295-98ee-a66c96e63baf",
"space_name": "demo",
"uris": [
"demo-app.azurecf.ik.am"
],
"users": null,
"version": "b0d2da70-be02-4c94-aac5-c334961fa7a7"
}
}
ユーザー提供:
SPRING_DATASOURCE_INITIALIZE: false
実行環境変数が設定されていません
ステージング中環境変数が設定されていません
```
#### Azure Redis Cache
https://github.com/Azure/meta-azure-service-broker/blob/master/docs/azure-redis-cache.md
`cf create-service`を実行時に、様々なパラメータJSONで渡す必要がある。次の`azure-redis-config.json`を作成。
``` json
{
"resourceGroup": "redisResourceGroup",
"cacheName": "mrs",
"parameters": {
"location": "japaneast",
"enableNonSslPort": true,
"sku": {
"name": "Basic",
"family": "C",
"capacity": 0
}
}
}
```
`enableNonSslPort`にしないとJedisを使ってアクセスできない。
```
cf create-service azure-rediscache basic demo-redis -c azure-redis-config.json
```
このサービスインタンス作成は非同期で行われ、動的にRedisインスタンスが作成される。`cf services`を見ても状態は`create は進行中です`となっている。
```
$ cf services
admin として組織 default_organization / スペース demo 内のサービスを取得しています...
OK
名前 サービス プラン バインド済みアプリ 最後の操作
demo-db p-mysql 100mb demo-app create は成功しました
demo-redis azure-rediscache basic demo-app create は進行中です
```
次の図でも、状態が"作成中..."になっている。
しばらくすると`create は成功しました`になる。
だけど、自分が試した時は20分くらいかかった・・・諦めずに待つと良い。
できたら、アプリにバインド。
```
cf bind-service demo-app demo-redis
```
環境変数を見ると次のような`credentials`が設定されていることがわかる。
``` console
$ cf env demo-app
admin として組織 default_organization / スペース demo 内のアプリ demo-app の環境変数を取得しています...
OK
システム提供:
{
"VCAP_SERVICES": {
"azure-rediscache": [
{
"credentials": {
"hostname": "mrs.redis.cache.windows.net",
"name": "mrs",
"port": 6379,
"primaryKey": "xxxx",
"secondaryKey": "xxxx",
"sslPort": 6380
},
"label": "azure-rediscache",
"name": "demo-redis",
"plan": "basic",
"provider": null,
"syslog_drain_url": null,
"tags": [],
"volume_mounts": []
}
],
"p-mysql": [
{
"credentials": {
"hostname": "10.0.50.5",
"jdbcUrl": "jdbc:mysql://10.0.50.5:3306/xxxx,
"name": "xxxx",
"password": "xxxx",
"port": 3306,
"uri": "mysql://xxxx:xxxx@10.0.50.5:3306/xxxx",
"username": "xxxx"
},
"label": "p-mysql",
"name": "demo-db",
"plan": "100mb",
"provider": null,
"syslog_drain_url": null,
"tags": [
"mysql"
],
"volume_mounts": []
}
]
}
}
{
"VCAP_APPLICATION": {
"application_id": "cdbdc286-9173-49cb-8ce4-b7baef81b17b",
"application_name": "demo-app",
"application_uris": [
"demo-app.azurecf.ik.am"
],
"application_version": "b0d2da70-be02-4c94-aac5-c334961fa7a7",
"limits": {
"disk": 1024,
"fds": 16384,
"mem": 512
},
"name": "demo-app",
"space_id": "f7798e39-7ac0-4295-98ee-a66c96e63baf",
"space_name": "demo",
"uris": [
"demo-app.azurecf.ik.am"
],
"users": null,
"version": "b0d2da70-be02-4c94-aac5-c334961fa7a7"
}
}
```
Spring Bootからアクセスする場合は次のような`RedisProperties`クラスを作っておけば良い。
``` java
@Profile("cloud")
@Bean
public RedisProperties redisProperties(ObjectMapper objectMapper) throws IOException {
JsonNode credentials = objectMapper.readTree(System.getenv("VCAP_SERVICES"))
.get("azure-rediscache").get(0).get("credentials");
RedisProperties prop = new RedisProperties();
prop.setHost(credentials.get("hostname").asText());
prop.setPort(credentials.get("port").asInt());
prop.setPassword(credentials.get("primaryKey").asText());
return prop;
}
```
#### その他
気が向いたら試す。