Cloud Foundry: Open Platform as a Service

2,858 views
2,745 views

Published on

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

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,858
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
73
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Cloud Foundry: Open Platform as a Service

  1. 1. Cloud Foundry:Open Platform as a Service 日本Cloud Foundryグループ 車谷駿介 内容は個人的見解を示したもので,所属先等との関係は一切ありません.
  2. 2. whoami• 日本Cloud Foundryグループ• 普段は研究開発に従事 – Cloud FoundryひいてはPaaS – (勝手に)分散処理する技術 – スマートフォン向けのシンクライアント技術 2
  3. 3. Agenda• Platform as a Serviceの嬉しさ• Open PaaS• 実際にWeb AppをPaaSで動かす 3
  4. 4. Platform as a Service? • より汎用的なSaaS アプリケーション データ ランタイム,フレームワーク サーバOS 仮想化技術SaaS PaaS IaaS ネットワーク,ストレージ,等 4
  5. 5. Why not SaaS? • 制約なくアプリケーションを開発したい アプリケーション データ ランタイム,フレームワーク サーバOS 仮想化技術SaaS PaaS ネットワーク,ストレージ,等 5
  6. 6. Why not IaaS?• “動作環境”はお任せしたい アプリケーション データ ランタイム,フレームワーク サーバOS 仮想化技術 PaaS IaaS ネットワーク,ストレージ,等 6
  7. 7. Proprietary PaaS• Force.com• GAE• Azure• AWS Elastic Beanstalk• DotCloud• MOGOK• etc. 7
  8. 8. Open PaaS!• Cloud Foundry – https://github.com/cloudfoundry• OpenShift – https://github.com/openshift• Cloudify – https://github.com/CloudifySource• Nodester – https://github.com/nodester 8
  9. 9. Why choose “Open” PaaS?• “動作環境”を縛られたくない アプリケーション データ ランタイム,フレームワーク サーバOS 仮想化技術 PaaS ネットワーク,ストレージ,等 9
  10. 10. Open PaaSの言語対応状況 Cloud Foundry OpenShift CloudifyErlang(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
  11. 11. Open PaaSのRDBMS対応状況 Cloud Foundry OpenShift CloudifyHSQLDB ○MySQL ○ ○ ○PostgreSQL ○ ○ ○VoltDB ○ 11
  12. 12. Open PaaSのNoSQL対応状況 Cloud Foundry OpenShift CloudifyKVS Cassandra ○ Memcached ○ドキュメント指向 CouchDB ○ MongoDB ○ ○ ○ Redis ○ ○グラフ Neo4J ○ 12
  13. 13. Open PaaSのその他対応状況 Cloud Foundry OpenShift CloudifyMQ ActiveMQ ○ RabbitMQ ○大規模処理 Hadoop ○全文検索 Elasticsearch ○ Solr ○その他 Worker ○ (standalone) ○ (worker) 任意の拡張 ○ 13
  14. 14. 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
  15. 15. 必要なもの• Cloud Foundryの動作環境 – どこかのサービスにアカウントを用意 – あるいは自前• 弄り回すためのちょっとした知識 – ランタイムやフレームワーク,DB類 – APIs –癖 15
  16. 16. 動作環境を自前で用意• 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
  17. 17. 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 loginAttempting login to [http://api.cloudfoundry.com]Email: krm@example.orgPassword: ********Successfully logged into [http://api.cloudfoundry.com] 17
  18. 18. 適当なアプリケーションを用意$ 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
  19. 19. デプロイ ↓$ 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
  20. 20. 起動完了 ↓Creating Application: OKUploading Application: Checking for available resources: OK Packing application: OK Uploading (5K): OKPush Status: OKStaging Application javawebmeetscf: OKStarting Application javawebmeetscf: OK$ vmc apps+----------------+----+---------+---------------------------------+----------+| Application | # | Health | URLS | Services |+----------------+----+---------+---------------------------------+----------+| javawebmeetscf | 1 | RUNNING | javawebmeetscf.cloudfoundry.com | |+----------------+----+---------+---------------------------------+----------+ 20
  21. 21. インスタンスを増やす$ vmc instances javawebmeetscf 2Scaling Application instances up to 2: OK$ vmc apps+----------------+----+---------+---------------------------------+----------+| Application | # | Health | URLS | Services |+----------------+----+---------+---------------------------------+----------+| javawebmeetscf | 2 | RUNNING | javawebmeetscf.cloudfoundry.com | |+----------------+----+---------+---------------------------------+----------+ 21
  22. 22. 環境変数: 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
  23. 23. 環境変数: VCAP_APPLICATION{ "instance_id": "16進値", "instance_index": 0, "name": "showenvs", "uris": ["showenvs.cloudfoundry.com"], "users": [“krm@example.org"], "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
  24. 24. GUI (Eclipse Extension)• [Help]>[Eclipse Marketplace...] – 但し,対応プロジェクトは Java Web (Servlet Spec 2.5), Spring, Grails, Liftのみ 24
  25. 25. 接続先の設定 (1)1. [Window]>[Show View]>[Servers]2. “new server wizard” ↑ホストはlocalhostのまま 25
  26. 26. 接続先の設定(2) ↑必要に応じて変更 ↓Finish 26
  27. 27. 設定完了 27
  28. 28. 概要設定 28
  29. 29. アプリケーション設定 29
  30. 30. アプリケーションの管理 30
  31. 31. サービスの追加 31
  32. 32. Remote System View• ファイルはインスタンス毎に独立 32
  33. 33. Cloud Foundry Explorer 33
  34. 34. アカウントの追加 34
  35. 35. 画面構成は概ね同じ 35
  36. 36. まず知っておくべき”癖”• ローカルのファイルシステムは非永続的• DB等の接続先は環境変数で与えられる – 環境変数を直接読むように書き換え – Javaは少々事情が異なる(特にSpring/Play!)• Tunnelによるデータベースの直接操作 – 例: dump済みの既存データの流し込み• サーバでビルドが必要な物は要注意 – gemやnpmのパッケージ”は”よしなに取得 36
  37. 37. cloudfoundry-runtime• https://github.com/cloudfoundry/vcap- java/tree/master/cloudfoundry-runtime – プロパティ設定用クラスを提供するライブラリ• たとえばpom.xmlに: <dependency> <groupId>org.cloudfoundry</groupId> <artifactId>cloudfoundry-runtime</artifactId> <version>0.8.1</version> </dependency> 37
  38. 38. 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
  39. 39. Play!の自動設定• 単一のRDBと接続• db.*.driverをよしなに置換 – production||prodで名前が終わる, バインドされた唯一のサービス – 唯一バインドされたサービス 39
  40. 40. 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
  41. 41. サービス一覧を表示$ 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
  42. 42. サービスとの接続$ 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: OKService connection info: username : 3be0e520-11ed-4af1-b005-c078bcec2da2 password : 4de480b9-75e9-4105-9784-6fb50391cd5b name : db ↓ 42
  43. 43. 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 dbconnected to: localhost:10001DATABASE: db to dump/db db.system.users to dump/db/system.users.bson 3 objects db.system.indexes to dump/db/system.indexes.bson 1 objectskrmtn@kcf-workspace:~$ lssystem.indexes.bson system.users.bson 43
  44. 44. 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/dbconnected 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
  45. 45. 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 dbMongoDB shell version: 2.0.4connecting to: localhost:10001/db> 45
  46. 46. 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 displayedinformation.Press Ctrl-C to exit... 46
  47. 47. まとめ• PaaSで実行環境やDB周りの構築から開放• Open PaaSが続々• CUI嫌いでも大丈夫? 47

×