cloud foundry: open platform as a service

47
Cloud Foundry: Open Platform as a Service 日本Cloud Foundryグループ 車谷駿介 内容は個人的見解を示したもので,所属先等との関係は一切ありません.

Upload: shunsuke-kurumatani

Post on 28-May-2015

2.573 views

Category:

Documents


7 download

DESCRIPTION

JJUG CCC 2012 Spring (B-4)での発表資料です. cf. http://www.java-users.jp/contents/events/ccc2012spring/index.html

TRANSCRIPT

Page 1: Cloud Foundry: Open Platform as a Service

Cloud Foundry:Open Platform as a Service

日本Cloud Foundryグループ車谷駿介

内容は個人的見解を示したもので,所属先等との関係は一切ありません.

Page 2: Cloud Foundry: Open Platform as a Service

whoami

• 日本Cloud Foundryグループ• 普段は研究開発に従事

– Cloud FoundryひいてはPaaS– (勝手に)分散処理する技術– スマートフォン向けのシンクライアント技術

2

Page 3: Cloud Foundry: Open Platform as a Service

Agenda

• Platform as a Serviceの嬉しさ• Open PaaS• 実際にWeb AppをPaaSで動かす

3

Page 4: Cloud Foundry: Open Platform as a Service

Platform as a Service?

• より汎用的なSaaS

SaaS PaaS IaaS ネットワーク,ストレージ,等

仮想化技術

サーバOS

データ ランタイム,フレームワーク

アプリケーション

4

Page 5: Cloud Foundry: Open Platform as a Service

SaaS

Why not SaaS?

• 制約なくアプリケーションを開発したい

PaaS ネットワーク,ストレージ,等

仮想化技術

サーバOS

データ ランタイム,フレームワーク

アプリケーション

5

Page 6: Cloud Foundry: Open Platform as a Service

Why not IaaS?

• “動作環境”はお任せしたい

PaaS IaaS ネットワーク,ストレージ,等

仮想化技術

サーバOS

データ ランタイム,フレームワーク

アプリケーション

6

Page 7: Cloud Foundry: Open Platform as a Service

Proprietary PaaS

• Force.com• GAE• Azure• AWS Elastic Beanstalk• DotCloud• MOGOK• etc.

7

Page 8: Cloud Foundry: Open Platform as a Service

Open PaaS!

• Cloud Foundry– https://github.com/cloudfoundry

• OpenShift– https://github.com/openshift

• Cloudify– https://github.com/CloudifySource

• Nodester– https://github.com/nodester

8

Page 9: Cloud Foundry: Open Platform as a Service

Why choose “Open” PaaS?

• “動作環境”を縛られたくない

PaaS ネットワーク,ストレージ,等

仮想化技術

サーバOS

データ ランタイム,フレームワーク

アプリケーション

9

Page 10: Cloud Foundry: Open Platform as a Service

Open PaaSの言語対応状況Cloud Foundry OpenShift Cloudify

Erlang(rebar) ○Java 1.6 ○ (Tomcat6) ○ (JBoss 7.1) ○(multiple).NET ○Node.js 0.4.x ○ △Node.js 0.6.x ○ ○ △Perl 5 ○ (mod_perl) △PHP 5 ○ (mod_php) ○ (mod_php) ○(mod_php)Python(WSGI) ○ ○ △Ruby 1.8.x ○ ○ △Ruby 1.9.x ○ △Scala(Lift,Play) ○ △ (自力でlib読込) △任意言語追加 ○ (DIY) ○

10

Page 11: Cloud Foundry: Open Platform as a Service

Open PaaSのRDBMS対応状況

11

Cloud Foundry OpenShift CloudifyHSQLDB ○MySQL ○ ○ ○PostgreSQL ○ ○ ○VoltDB ○

Page 12: Cloud Foundry: Open Platform as a Service

Open PaaSのNoSQL対応状況

12

Cloud Foundry OpenShift CloudifyKVS

Cassandra ○Memcached ○

ドキュメント指向CouchDB ○MongoDB ○ ○ ○Redis ○ ○

グラフNeo4J ○

Page 13: Cloud Foundry: Open Platform as a Service

Open PaaSのその他対応状況

13

Cloud Foundry OpenShift CloudifyMQ

ActiveMQ ○RabbitMQ ○

大規模処理Hadoop ○

全文検索Elasticsearch ○Solr ○

その他Worker ○ (standalone) ○ (worker)任意の拡張 ○

Page 14: Cloud Foundry: Open Platform as a Service

Cloud Foundry based PaaS

• Stackato (ActiveState)– http://www.activestate.com/stackato

• Iron Foundry (Tier 3)– http://www.ironfoundry.org

• AppFog– http://www.appfog.com

• PaaS.io– http://paas.io

14

Page 15: Cloud Foundry: Open Platform as a Service

必要なもの

• Cloud Foundryの動作環境– どこかのサービスにアカウントを用意– あるいは自前

• 弄り回すためのちょっとした知識– ランタイムやフレームワーク,DB類– APIs– 癖

15

Page 16: Cloud Foundry: Open Platform as a Service

動作環境を自前で用意• Micro Cloud Foundry

– 環境構築済みのVMイメージ• vcap/dev_setup

– https://github.com/cloudfoundry/vcap/tree/master/dev_setup

– 依存ツールの状況次第で異常終了する場合も• うまく行かなかったらCoffee break!

• BOSH等によって管理しつつデプロイ– https://github.com/cloudfoundry/bosh

16

Page 17: Cloud Foundry: Open Platform as a Service

CUI

• VMC: The VMware Cloud CLI– https://github.com/cloudfoundry/vmc– `gem install vmc [--pre]` or

`apt-get install cloudfoundry-client̀– `vmc help [command]`

$ vmc target http://api.cloudfoundry.comSuccessfully targeted to [http://api.cloudfoundry.com]

$ vmc login Attempting login to [http://api.cloudfoundry.com]Email: [email protected]: ********Successfully logged into [http://api.cloudfoundry.com] 17

Page 18: Cloud Foundry: Open Platform as a Service

適当なアプリケーションを用意$ git clone git://github.com/cloudfoundry/vcap-test-assets.git$ cd vcap-test-asset/java_web/java_tiny_app$ vi ...

protected void doGet(HttpServletRequest req,HttpServletResponse res)throws ServletException, IOException {

res.setContentType("text/plain");res.setStatus(200);PrintWriter out = res.getWriter();out.println(

System.getenv("VCAP_APP_HOST") +":" + System.getenv("VCAP_APP_PORT"));

out.close(); }

18

Page 19: Cloud Foundry: Open Platform as a Service

デプロイ↓

$ cd YOUR_APPS_DIR$ mvn package$ cd target # Java Webの場合,*.warのあるディレクトリ$ vmc pushWould you like to deploy from the current directory? [Yn]: Application Name: javawebmeetscfDetected a Java Web Application, is this correct? [Yn]: Application Deployed URL [javawebmeetscf.cloudfoundry.com]: Memory reservation (128M, 256M, 512M, 1G, 2G) [512M]: How many instances? [1]: Bind existing services to 'javawebmeetscf'? [yN]: Create services to bind to 'javawebmeetscf'? [yN]: Would you like to save this configuration? [yN]:

19

Page 20: Cloud Foundry: Open Platform as a Service

起動完了↓

Creating Application: OK

Uploading Application:Checking for available resources: OKPacking application: OKUploading (5K): OK

Push Status: OKStaging Application 'javawebmeetscf': OK Starting Application 'javawebmeetscf': OK

$ vmc apps

+----------------+----+---------+---------------------------------+----------+| Application | # | Health | URLS | Services |+----------------+----+---------+---------------------------------+----------+| javawebmeetscf | 1 | RUNNING | javawebmeetscf.cloudfoundry.com | |+----------------+----+---------+---------------------------------+----------+

20

Page 21: Cloud Foundry: Open Platform as a Service

インスタンスを増やす$ vmc instances javawebmeetscf 2Scaling Application instances up to 2: OK

$ vmc apps +----------------+----+---------+---------------------------------+----------+| Application | # | Health | URLS | Services |+----------------+----+---------+---------------------------------+----------+| javawebmeetscf | 2 | RUNNING | javawebmeetscf.cloudfoundry.com | |+----------------+----+---------+---------------------------------+----------+

21

Page 22: Cloud Foundry: Open Platform as a Service

環境変数: VCAP_SERVICES{"mongodb-1.8": [{

"name": "ivanmongo", "label": "mongodb-1.8","plan": "free","tags": ["mongodb", "mongodb-1.8", "nosql"], "credentials": {"hostname": "172.30.48.61", "host": "172.30.48.61","port": 25067,"username": "何らかのUUID", "password": "何らかのUUID","name": "何らかのUUID","db": "db" }}]}

22

Page 23: Cloud Foundry: Open Platform as a Service

環境変数: VCAP_APPLICATION

{"instance_id": "16進値", "instance_index": 0,"name": "showenvs","uris": ["showenvs.cloudfoundry.com"],"users": [“[email protected]"],"version": "bc5c7351500267c234e659b0f978b530bc6fdf28-1","start": "2012-05-24 06:45:19 +0000","runtime": "ruby18","state_timestamp": 1337841919,"port": 6539,"limits": {"fds": 256, "mem": 134217728, "disk": 2147483648},"host": "172.30.50.22"}

23

Page 24: Cloud Foundry: Open Platform as a Service

GUI (Eclipse Extension)

• [Help]>[Eclipse Marketplace...]– 但し,対応プロジェクトは

Java Web (Servlet Spec 2.5),Spring, Grails, Liftのみ

24

Page 25: Cloud Foundry: Open Platform as a Service

接続先の設定 (1)

1. [Window]>[Show View]>[Servers]2. “new server wizard”

↑ホストはlocalhostのまま

25

Page 26: Cloud Foundry: Open Platform as a Service

接続先の設定(2)

↑必要に応じて変更

↓Finish

26

Page 27: Cloud Foundry: Open Platform as a Service

設定完了

27

Page 28: Cloud Foundry: Open Platform as a Service

概要設定

28

Page 29: Cloud Foundry: Open Platform as a Service

アプリケーション設定

29

Page 30: Cloud Foundry: Open Platform as a Service

アプリケーションの管理

30

Page 31: Cloud Foundry: Open Platform as a Service

サービスの追加

31

Page 32: Cloud Foundry: Open Platform as a Service

Remote System View

• ファイルはインスタンス毎に独立

32

Page 33: Cloud Foundry: Open Platform as a Service

Cloud Foundry Explorer

33

Page 34: Cloud Foundry: Open Platform as a Service

アカウントの追加

34

Page 35: Cloud Foundry: Open Platform as a Service

画面構成は概ね同じ

35

Page 36: Cloud Foundry: Open Platform as a Service

まず知っておくべき”癖”

• ローカルのファイルシステムは非永続的• DB等の接続先は環境変数で与えられる

– 環境変数を直接読むように書き換え– Javaは少々事情が異なる(特にSpring/Play!)

• Tunnelによるデータベースの直接操作– 例: dump済みの既存データの流し込み

• サーバでビルドが必要な物は要注意– gemやnpmのパッケージ”は”よしなに取得

36

Page 37: Cloud Foundry: Open Platform as a Service

cloudfoundry-runtime

• https://github.com/cloudfoundry/vcap-java/tree/master/cloudfoundry-runtime– プロパティ設定用クラスを提供するライブラリ

• たとえばpom.xmlに:

37

<dependency><groupId>org.cloudfoundry</groupId><artifactId>cloudfoundry-runtime</artifactId><version>0.8.1</version>

</dependency>

Page 38: Cloud Foundry: Open Platform as a Service

Springの自動設定

• 同じタイプのサービスは1つに限定される– MySQL, Postgres:

javax.sql.DataSource

– MongoDB:org.springframework.data.document.mongodb.MongoDbFactory

– Redis:org.springframework.data.redis.connection.RedisConnectionFactory

– RabbitMQ:org.springframework.amqp.rabbit.connection.ConnectionFactory

38

Page 39: Cloud Foundry: Open Platform as a Service

Play!の自動設定

• 単一のRDBと接続• db.*.driverをよしなに置換

– production||prodで名前が終わる,バインドされた唯一のサービス

– 唯一バインドされたサービス

39

Page 40: Cloud Foundry: Open Platform as a Service

Java系フレームワーク向けCloud Foundryプラグイン

• Cloud Foundry Maven Plugin– `mvn cf:push`

• Grails Cloud Foundry Plugin– `grails install-plugin cloud-foundry`– `grails cf-*`– grails-app/conf/Config.groovyで設定

40

Page 41: Cloud Foundry: Open Platform as a Service

サービス一覧を表示$ vmc services

============== System Services ==============

+------------+---------+---------------------------------------+| Service | Version | Description |+------------+---------+---------------------------------------+| mongodb | 1.8 | MongoDB NoSQL store || mysql | 5.1 | MySQL database service || postgresql | 9.0 | PostgreSQL database service (vFabric) || rabbitmq | 2.4 | RabbitMQ message queue || redis | 2.2 | Redis key-value store service |+------------+---------+---------------------------------------+

=========== Provisioned Services ============

+----------------+---------+| Name | Service |+----------------+---------+| mysql-e8ccf | mysql || tekito-service | mongodb |+----------------+---------+

41

Page 42: Cloud Foundry: Open Platform as a Service

サービスとの接続$ gem install caldecott # ない場合$ vmc tunnel1: mongodb-794fd2: postgresql-454d3: postgresql-611ee4: redis-47609Which service to tunnel to?: 1Deploying tunnel application 'caldecott'. # 初回だけ(snip.)Getting tunnel connection info: OK

Service connection info: username : 3be0e520-11ed-4af1-b005-c078bcec2da2password : 4de480b9-75e9-4105-9784-6fb50391cd5bname : db

42

Page 43: Cloud Foundry: Open Platform as a Service

mongodump↓

Starting tunnel to tekito-service on port 10001.1: none2: mongodump3: mongo4: mongorestoreWhich client would you like to start?: 2Launching 'mongodump --host localhost --port 10001 -u 20f75687-7917-4c3b-b2a7-54d3443342f4 -p 96bdd18e-e125-4f9c-b74a-64130ab65d24 --db db'

connected to: localhost:10001DATABASE: db to dump/db

db.system.users to dump/db/system.users.bson3 objects

db.system.indexes to dump/db/system.indexes.bson1 objects

krmtn@kcf-workspace:~$ lssystem.indexes.bson system.users.bson 43

Page 44: Cloud Foundry: Open Platform as a Service

mongorestoreStarting tunnel to tekito-service on port 10001.1: none2: mongorestore3: mongodump4: mongoWhich client would you like to start?: 2Directory or filename to restore from: dump/dbLaunching 'mongorestore --host localhost --port 10001 -u 20f75687-7917-4c3b-b2a7-54d3443342f4 -p 96bdd18e-e125-4f9c-b74a-64130ab65d24 --db db dump/db'

connected to: localhost:10001Thu May 24 21:11:14 dump/db/system.users.bsonThu May 24 21:11:14 going into namespace [db.system.users]3 objects foundThu May 24 21:11:14 dump/db/system.indexes.bsonThu May 24 21:11:14 going into namespace [db.system.indexes]Thu May 24 21:11:14 { name: "_id_", ns: "db.system.users", key: { _id: 1 } }1 objects found

44

Page 45: Cloud Foundry: Open Platform as a Service

mongoStarting tunnel to tekito-service on port 10001.1: none2: mongorestore3: mongo4: mongodumpWhich client would you like to start?: 3Launching 'mongo --host localhost --port 10001 -u 20f75687-7917-4c3b-b2a7-54d3443342f4 -p 96bdd18e-e125-4f9c-b74a-64130ab65d24 db'

MongoDB shell version: 2.0.4connecting to: localhost:10001/db>

45

Page 46: Cloud Foundry: Open Platform as a Service

None (SSH接続)Starting tunnel to tekito-service on port 10001.1: none2: mongorestore3: mongodump4: mongoWhich client would you like to start?: 1Open another shell to run command-line clients oruse a UI tool to connect using the displayed information.Press Ctrl-C to exit...

46

Page 47: Cloud Foundry: Open Platform as a Service

まとめ

• PaaSで実行環境やDB周りの構築から開放• Open PaaSが続々• CUI嫌いでも大丈夫?

47