IK.AM

@making's tech note


オレオレブログAPIサーバーCategoLJ3をデプロイしよう(Cloud Foundry編)

🗃 {Dev/Blog/CategoLJ3}
🏷 CategoLJ3 🏷 Cloud Foundry 🏷 Spring Boot 
🗓 Updated at 2015-12-29T13:16:24Z  🗓 Created at 2015-12-29T13:05:04Z   🌎 English Page

前回はCategoLJ3をHerokuにデプロイする方法を見てきました。次はCloud Foundryにデプロイする方法を紹介します。

まずはElasticsearchのサービスを用意しているPivotal Web Services (PWS)を使用します。 Cloud Foundry及び、PWSの設定方法はこちらの記事を参照してください。

まずは、ElasticsearchのサービスであるSearchlyのサービスをblog-esという名前で作成します。

$ cf create-service searchly starter blog-es
Creating service instance blog-es in org maki-org / space development as ***...
OK

PWSのSearchlyサービスマニュアルを見ると、サービスをアプリにバインドすると環境変数VCAP_SERVICESに次のようなJSONが設定されることがわかります。

{
  searchly: [
    {
      name: "searchly-1",
      label: "searchly",
      tags: [ ],
      plan: "starter",
      credentials: {
        uri: "http://cloudfoundry:f0d15584ef7b5dcd1c5c1794ef3506ec@api.searchbox.io",
        sslUri: "https://cloudfoundry:f0d15584ef7b5dcd1c5c1794ef3506ec@api.searchbox.io"
      }
    }
  ]
}

この中で重要なのはcredentialsに設定されている値です。ここにサービスへの接続情報が設定されています。

Spring BootではVCAP_SERVICESに設定されたcredentials値はvcap.services.(service名).credentialsプロパティでアクセスできます。 上の例では、

  • vcap.services.searchly-1.credentials.uri=http://cloudfoundry:f0d15584ef7b5dcd1c5c1794ef3506ec@api.searchbox.io
  • vcap.services.searchly-1.credentials.sslUri=https://cloudfoundry:f0d15584ef7b5dcd1c5c1794ef3506ec@api.searchbox.io

です。

今回は、cf create-serviceでサービス名blog-esを指定したので、作成したサービスへの接続情報はvcap.services.blog-es.credentials.sslUriプロパティでアクセスできます。

Spring BootアプリではCloud Foundryにデプロイすると自動でcloudプロファイルが適用されます。したがって、Cloud Foundryでのみ有効になるプロパティはapplication-cloud.propertiesに書けば良いです。(Cloud Foundry上の設定を行う方法は他にもいろいろありますが、個人的にはapplication-cloud.propertiesを使う方法がお気に入りです)

CategoLJ3をCloud Foundryにデプロイする場合は、application-cloud.propertiesに以下の設定をしてください。

jest.connection-url=${vcap.services.blog-es.credentials.sslUri}

あとはビルドしてデプロイしましょう。アプリの作り方はこちらを参照してください。 サービスのバインドが必要なので、--no-startをつけて、一旦起動しないようにしておきます。

$ mvn clean package -Dmaven.test.skip=true
$ cf push demo -p target/demo-0.0.1-SNAPSHOT.jar -m 512m --no-start --random-route
Creating app demo in org maki-org / space development as ***...
OK

Creating route demo-untinkered-turnbuckle.cfapps.io...
OK

Binding demo-untinkered-turnbuckle.cfapps.io to demo...
OK

Uploading demo...
Uploading app files from: target/demo-0.0.1-SNAPSHOT.jar
Uploading 667.2K, 95 files
Done uploading               
OK

(補足ですが、--random-routeをつけることで、ホスト名がアプリケーション名-ランダムな文字列になり、重複を避けられます。)

サービスをバインドしましょう。

$ cf bind-service demo blog-es
Binding service blog-es to app demo in org maki-org / space development as ***...
OK
TIP: Use 'cf restage' to ensure your env variable changes take effect

あとは起動すればデプロイ完了です。

$ cf start demo
Starting app demo in org maki-org / space development as ***...
Creating container
(略)
Uploading complete

0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
1 of 1 instances running

App started


OK

App demo was started using this command `CALCULATED_MEMORY=$($PWD/.java-buildpack/open_jdk_jre/bin/java-buildpack-memory-calculator-2.0.1_RELEASE -memorySizes=metaspace:64m.. -memoryWeights=heap:75,metaspace:10,native:10,stack:5 -memoryInitials=heap:100%,metaspace:100% -totMemory=$MEMORY_LIMIT) && SERVER_PORT=$PORT $PWD/.java-buildpack/open_jdk_jre/bin/java -cp $PWD/.:$PWD/.java-buildpack/spring_auto_reconfiguration/spring_auto_reconfiguration-1.10.0_RELEASE.jar -Djava.io.tmpdir=$TMPDIR -XX:OnOutOfMemoryError=$PWD/.java-buildpack/open_jdk_jre/bin/killjava.sh $CALCULATED_MEMORY org.springframework.boot.loader.JarLauncher`

Showing health and status for app demo in org maki-org / space development as ***...
OK

requested state: started
instances: 1/1
usage: 512M x 1 instances
urls: demo-untinkered-turnbuckle.cfapps.io
package uploaded: Tue Dec 29 12:18:34 UTC 2015
stack: cflinuxfs2
buildpack: java-buildpack=v3.3.1-https://github.com/cloudfoundry/java-buildpack.git#063836b java-main open-jdk-like-jre=1.8.0_65 open-jdk-like-memory-calculator=2.0.1_RELEASE spring-auto-reconfiguration=1.10.0_RELEASE

     state     since                    cpu    memory           disk         details   
#0   running   2015-12-29 09:25:32 PM   0.0%   379.4M of 512M   188M of 1G 

あとはHeroku編と同じです。

$ curl https://demo-untinkered-turnbuckle.cfapps.io/api/entries | jq .
{
  "content": [],
  "last": true,
  "totalPages": 0,
  "totalElements": 0,
  "first": true,
  "numberOfElements": 0,
  "sort": null,
  "size": 10,
  "number": 0
}

Elasticesearchへの初回のみre-indexも行いましょう。

$ curl https://demo-untinkered-turnbuckle.cfapps.io/api/jest/reindex

これでGitの記事が反映されました。

$ curl https://demo-untinkered-turnbuckle.cfapps.io/api/entries | jq .
{
  "content": [
    {
      "entryId": 1,
      "content": "This is my first article using CategoLJ3!",
      "created": {
        "name": "Toshiaki Maki",
        "date": "2015-12-28T17:16:23Z"
      },
      "updated": {
        "name": "Toshiaki Maki",
        "date": "2015-12-28T17:16:23Z"
      },
      "frontMatter": {
        "title": "First article",
        "tags": [
          "Demo"
        ],
        "categories": [
          "Demo",
          "Hello"
        ]
      }
    }
  ],
  "last": true,
  "totalPages": 1,
  "totalElements": 1,
  "first": true,
  "numberOfElements": 1,
  "sort": null,
  "size": 10,
  "number": 0
}

ではElasticsearchのサービスがないCloud Foundryはどうでしょうか。 例えば、ローカルで試すためのMicroPCF(インストール記事はこちら)だと、cf create-service searchly starter blog-esを実行してもサービスが見つからず、エラーになります。

これに対する方法はいくつかあるのですが、User-Provided Serviceという仕組みを使うのが一番簡単です。 User-Provider Serviceを使うと、DBやWebアプリなどの外部サービスに対する接続情報(credentials)を、これまで見てきたCloud Foundryのサービスと同じようにVCAP_SERVICESに設定することができます。

cf create-user-provided-servceコマンドの-pVCAP_SERVICES中のcredentialsのJSONを設定できます。ローカルのElasticesearchにアクセスするために次のコマンドを実行します。

$ cf create-user-provided-service blog-es -p '{"uri" : "http://192.168.99.100:9200", "sslUri" : "http://192.168.99.100:9200"}'
Creating user provided service blog-es in org maki-org / space development as admin...
OK

これで、PWSを全く同じようにvcap.services.blog-es.credentials.sslUriプロパティにElasticsearchへの接続情報(この場合、http://192.168.99.100:9200)が設定されます。

あとは上と全く同じく、

$ cf push demo -p target/demo-0.0.1-SNAPSHOT.jar -m 512m --no-start
$ cf bind-service demo blog-es
$ cf start demo

でデプロイできます。jarは同じもので構いません。

この方法であれば、どのCloud Foundryでもデプロイできます。

ちなみにVCAP_SERVICESには以下のようなJSONが設定されます。

{
 "user-provided": [
  {
   "credentials": {
    "sslUri": "http://192.168.99.100:9200",
    "uri": "http://192.168.99.100:9200"
   },
   "label": "user-provided",
   "name": "blog-es",
   "syslog_drain_url": "",
   "tags": []
  }
 ]
}

Cloud Foundry版のソースコードはこちらです。

Cloud Foundry、HerokuとPaaSに簡単にCategoLJ3をデプロイできることを見てきました。 このAPIサーバーを使って、オレオレブログ作ってみませんか?


✒️️ Edit  ⏰ History  🗑 Delete