G*なクラウド ~雲のかなたに~

Preview:

DESCRIPTION

日本 Java ユーザグループ CCC Fall 2009 でのスライドです。「G*なクラウド ~雲のかなたに~」まわりを見渡せばクラウドの話で持ちきりです。様々なフレームワークがクラウドに対応するなか、もちろんG*なクラウド活用法も存在します。Grails でプラグインを使ってGAE/Jに対応や、Cloud Foundry(EC2)、GroovyでのGAE/J「Gaelyk」など、Grails/Groovyでのクラウドを紹介・解説します。

Citation preview

G*なクラウド─ 雲のかなたに ─

アスタ

2009/10/08 @JJUG CCC

def speaker = new Cast(name:”T.Yamamoto”,version:”G*C-2009-10-08”)

まえがき

 まわりを見渡せば、クラウドの話で持ちきりです。様々なフレームワークがクラウドに対応するなか、もちろんG*なクラウド活用法も存在します。 今回は、Grails/Groovyでのクラウドを紹介・解説します。

名前:山本 剛 (やまもとつよし)

所属:株式会社ニューキャストDTP、組版屋、印刷業界向けWebアプリ開発など。案件は75%Grailsを使ってます。

JGGUG(じぇいがぐ) 名古屋支部長です。「Grails徹底入門」9-11章を書きました。 Grails Acegi Plugin の中の人だった。

http://d.hatena.ne.jp/mottsnite/twitter @tyama

自己紹介

※注意事項

本日ライブコーディングは行いません。まとめサイト的な内容です。EC2やGAE/Jの奥深い内容の質問は後日回答となる場合があります。

本日の議題G*(アスタ)ってなに?Groovy/Grails?Why?G*(アスタ)をクラウドへAWSベースMorph AppSpaceStaxCloud Foundry

GAE/JGrails+AppEngineプラグインGaelyk

まとめ・比較・利点・欠点

G*(アスタリスク)

JGGUGjapan grails/groovy user group

G*(アスタリスク)って何?JGGUGでは、Groovyに関連する技術、Groovyはもちろんのこと、Grails - JEEフレームワークGriffon - デスクトップアプリ用フレームワークGant、Gradle - ビルドツール等のことを、

G*(アスタリスク)とよびます。

JGGUGjapan grails/groovy user group

GroovyGroovyはJVM上で動作する動的スクリプト言語。簡潔で強力な表現力。DSLなどに適した高い柔軟性。Javaとの親和性の良さが特徴。JSR-241として標準化されてる。

何故Groovy?(個人的意見)Javaを楽しく簡潔にコーディングほぼJavaなのでJava開発者には入りやすい。GroovyはJava!(昔そんなことをロンドンで聞いた)わざわざ他の言語を覚えなくて良いよ!

深入りすると大変だよ!ケガするよ!

Grailsとは・・・JavaEEで実績のあるSpringフレームワークやHibernateをベースに、Groovyを活用して効率よくJavaEE開発を行うことのできる、フルスタックフレームワークです。

JVM

開発フレームワーク・DSL

Warファイルをデプロイ

Grails コア (Java+Groovyで実装)

Webコンテナ Testing コード生成

Grails プラグイン

プロダクション

何故Grails?利点DRY、CoC (この辺の話は詳しい人にお願いするとして・・・)

DSLでのわかりやすいコード豊富なプラグインでサクサク開発各種機能、Web開発に必要なパーツ認証、AJAX、Flex、JMS、AppEngine、UI関連等。

プラグイン独自に開発して、モジュラな開発。欠点ダイナミック過ぎて純粋なJEEアプリよりは・・・。IDE・・・・!?個人的には無問題。テキストエディタでOKSpringSourceの人がEclipse対応の開発を開始してるとか!?

Grailsプロジェクトがほぼそのままプラグイン化できるのでCMS

的な感覚も持ち合わせている。

JGGUG、G*にワークショップに参加してね!

詳しくは→ http://www.jggug.orgこんな方はとくに!!!動的だけど静的もほしい。柔軟な開発がしたい。技術の進歩の速度に疲れた方。もっと詳しい事を議論したい方。さみしがりや。変わり者。言語オタク。矛盾の狭間にいて苦しい人。

JGGUGjapan grails/groovy user group

G* と クラウド

G*(アスタ)をクラウドへ基本的にJEEの動くクラウドであれば動作可能。注目のポイントは、大きく分けると3種類AWS(EC2,S3)ベースMorph AppSpaceStaxCloud Foundry Cloud Foundry (EC2)Google App Engine for JavaGrails+app-engineプラグインGAE/Jでライトに開発 Gaelyk

GrailsにやさしいPaaS。

本家運営!

AWSベース

(EC2,S3)

Morph AppSpace概要 サイト http://www.mor.ph/PaaSです。キューブ(Cubes)という単位で管理。Cubes - (Webサーバとアプリケーションサーバを組み込んだ仮想マシン単位)インフラはAWS。(EC2,S3)料金:2 Cubes/ DB:10GB データ転送:30GB ストレージ:20GB $1/日 $31/月料金表 http://www.mor.ph/information_pricing2009年5月から有料契約をしていないと無料な開発版が使えない。

Morph AppSpaceツールなどWebベースのツールで管理がおこなえる。

Grailsをデプロイする公式サポートツールも存在する。現在 Grails-1.0.2 - v1.1.1に対応。

デプロイのサポートをするGrailsプラグイン。 http://grails.org/MorphDeploy+Plugin※たぶん古いのでメンテが必要。

Morph AppSpace新規 AppSpaceサブスクリプション登録画面サブドメイン、DB等を設定2キューブ 1クレジット/日

Morph AppSpaceツールのダウンロード

ツールの使い方ツール設定ダウンロードしたツールを解凍grails-svn-morph-deployerファイルをGRAILS_HOME/binにコピーGRAILS_HOME/libにgrails-morph-deployer.jarをコピーGRAILS_HOME/scriptsにMorphDeploy.groovyをコピーデプロイ管理画面よりダウンロードしたmorph_deploy.propertiesをGrailsプロジェクトの直下にコピーコマンド grails morph-deploy を実行自動的にコンパイルしてwarを作りデプロイしてくれます。

Morph AppSpace管理画面、DB管理 (phpPgAdmin)

Morph AppSpaceクラウドの構成設計ツール (Beta)

Staxhttp://www.stax.net/EC2をインフラにJEEの実行環境を提供。現在はベータ提供中なので無料。デプロイ用のSDKを提供している。Grails用の解説もある。http://wiki.stax.net/w/DBはStax MySQLデータベースを使用する。※MySQL 5.0.x (ローカルからもアクセス可能)

Stax管理コンソール

Staxアプリケーション作成管理画面 ↓

Staxデータベース作成情報入力 →管理画面 ↓

StaxSDKセットアップ公式ドキュメントより。http://wiki.stax.net/w/index.php/SDK

環境変数設定

Stax SDKのツールはgroovyで実装されています。※groovy-1.6.0

# curl -L http://stax-downloads.s3.amazonaws.com/sdk/stax-sdk-0.3.6-dist.zip > stax_sdk.zip

# unzip stax_sdk.zip

# rm stax_sdk.zip

# cd stax-sdk-0.3.6

export STAX_HOME=/opt/stax-sdk-0.3.6export PATH=$PATH:$STAX_HOME

StaxでGrailshttp://wiki.stax.net/w/index.php/GrailsGrailsのプロジェクト作成grails create-app myapp

DataSource.groovy編集

...省略...dataSource {dbCreate = "update"driverClassName = "com.staxnet.jdbc.Driver"url = "jdbc:stax://jggug"username = "tyama"password = "*****"

}

...省略...

StaxでGrailsConfig.groovyにstacktrace.logの無効指定追記

ライブラリをSTAX_HOME/libからコピーstax-appserver-[verson].jar,mysql-connector-java-5.1.6.jar, xstream-1.3.jar

warファイル書きだし # grails warstaxコマンドでデプロイ# stax app:deploy -a アプリID warファイル指定

... log4j = { appenders { null name:'stacktrace'...省略...

Stax動作確認!

Stax その他デプロイ履歴 開発メンバー追加

サーバゾーンの設定

クラスタサイズ

Cloud Foundry

Cloud FoundryとはURL http://www.cloudfoundry.comSpringSourceが提供する。EC2をインフラに使用したJEE用のPaaS。WebコンテナにSS社のtcサーバが使用されている。数クリックで簡単デプロイ+管理。Cloud ToolのWeb版!?

後で、少し歴史でも

Cloud FoundryとはAmazon Web Servicesのアカウント登録が必要AWSの課金がされます。

現在はベータなので、Cloud Foundry自体は無料正式サービスは有料化の予定らしいです。

Cloud Foundry 歴史 ①作者Chris Richardson (POJOs in Actionの著者さん)

2008/1 Cloud Tool の公開 EC2DeployフレームワークEC2にJEEアプリケーションを簡単にデプロイするためのGroovyベースのフレームワーク

Tomcatが動作して、EC2Deployで作業が行われるように設定されたAMIEC2Deployを使用してデプロイを行うMavenプラグイン

Cloud Tool MavenプラグインMaven Goalscloudtools:deploy アプリケーションをEC2にデプロイする。 cloudtools:redeploy 再デプロイ。cloudtools:jmeter jmeterを起動してテストをロードする。cloudtools:stop インスタンスを停止する。 cloudtools:dbsave データベーススナップショットを cloudtools.s3.path に指定したS3に保存する。cloudtools:dbrestore cloudtools.s3.pathに保存したデータベースをリストアする。cloudtools:clone クラスタのコピーを作成する。cloudtools:describe クラスタの情報表示cloudtools:list 使用可能なクラスタのリストを出す。cloudtools:stop クラスタの停止。EBS(Elastic Block Store)も操作可能

Cloud Foundry 歴史 ②2008/4 - 8:Grails用のプラグイン発表→公開 Cloud Tools Grails Plugin v0.1 - v0.4Grails用のコマンドが実装されるcloud-tools-deploy - EC2インスタンスを起動してWebアプリケーションを起動 (MySQLマスタ&スレーブ、Tomcat、Apache)cloud-tools-describe - インスタンスの情報を表示cloud-tools-redeploy - 再デプロイcloud-tools-stop⦆ - EC2インスタンスを停止

0.3、0.4で更にMySQLのバックアップ設定の実装やコマンドが追加

Cloud Tools Grails Pluginコマンド一覧

cloud-tools-deploy cloud-tools-describe cloud-tools-redeploy cloud-tools-stop cloud-tools-add-app-server cloud-tools-clone cloud-tools-create-snapshot cloud-tools-curl cloud-tools-db-recreate cloud-tools-db-restore cloud-tools-db-save cloud-tools-enable-brb cloud-tools-disable-brb

cloud-tools-enable-ebs cloud-tools-enable-master-backups cloud-tools-enable-slave-backups cloud-tools-init-lb-pool cloud-tools-jmeter cloud-tools-list cloud-tools-restart-apache cloud-tools-sql cloud-tools-stop-jmeter cloud-tools-stop-mysql-slave cloud-tools-update-war cloud-tools-verify

Cloud Foundry 歴史 ③2008/9:Elastic Block Store(EBS)対応2008/11:Clould Tools (Web版)のベータテスターをブログで募集2008/11 - 2009/1:Cloud Foundryベータ公開開始この辺りから、Dustin Whitney氏が参加して、多数のGrails用スクリプトを実装。v0.5-v0.7

2009/8/19:SpringSourceがSpring Source Cloud Foundryを発表

Cloud Toolのデモ動画作者のサイトにGrailsでの動画あります。http://tinyurl.com/y9hb2go

Cloud Tool手順grails create-app democd demograils install-plugin cloud-tool.zip

Config.groovy設定importの追加aws.propertiesの指定

デプロイgrails cloud-tools-deploy

インスタンス情報grails cloud-tools-describe

停止grails cloud-tools-stop

こんな手順でした。

Cloud Foundry 歴史 まとめCloud ToolからCloud Foundryへの歴史を見ることで、Cloud Foundryの中がどうなってるか分かったと思います。

中身は、もしかしてGrailsで実装されていたり!?

Cloud Foundry 構成図構成図

Clould FoundryApache HTTP Server

tc Server

MySQL

HypericHQ&SIGAR

Amazon Web Services EC2

Cloud Foundry デプロイ手順ログインすると、こんな画面。

Cloud Foundry デプロイ手順アプリケーションをアップロードする

warファイルをセット

コンテキストルート

DBの設定

アプリケーション名をセット

Cloud Foundry デプロイ手順アップロード完了

再生ボタンをクリック

Cloud Foundry デプロイ手順起動画面で詳細設定

デプロイ名をセット

インスタンス設定

パブリックIP設定

Cloud Foundry デプロイ手順起動画面で詳細設定

コンテナ設定

DB設定EBS設定

Cloud Foundry デプロイ手順設定のテンプレート保存ができるように!

Cloud Foundry デプロイ手順デプロイ!!起動完了!!

 起動!

Cloud Foundry 管理デプロイメント詳細画面

詳細

UPTIME等

アプリケーション

Cloud Foundry 管理デプロイメント詳細画面

詳細へApache

tc Server

MySQL

Cloud Foundry 管理詳細画面。

基本情報

HTTPDサーバ

TCサーバ

Cloud Foundry動作確認。

Cloud Foundry 管理アカウント設定画面

AWSのACCESS KEY ID

KEY PAIRS

AWSで確認動いてます。 SSHでログイン

Cloud Foundry まとめSpringSourceが提供しているので、Grailsを使うのに何かと安心感がある。個人的には、管理画面からも良いのだが、GrailsのコマンドからデプロイするCloud Toolも魅力を感じる。今はCloud Tool更新が止まってるので、今後の対応に期待。利用料金はどうなるのだろ?今後のVMwareとの絡みは?VMware vCloud ?

GAE/J

GAE/J と G*

Grails + GAE/Jサポートプラグイン。または、Gaelyk

GrailsをGAE/Jに対応させるAppEngine プラグインGORM-JPA プラグインドメインクラスの調整 コントローラの調整 起動コマンド 微調整!

AppEngine PluginGrailsをGAE/Jに対応させるプラグイン機能インストール時にGAEに必要なファイル生成デプロイ用のコマンドスカッフォルドテンプレートJDOとJPAに対応認証設定 → Config.groovyに設定

AppEngine Pluginインストール前に必要な設定

Google App Engine SDK設定ダウンロード&解凍http://code.google.com/appengine/

AppEngineSDKの場所を指定。環境変数 APPENGINE_HOME 又は、config/BuildConfig.groovyにgoogle.appengine.sdkで指定

export APPENGINE_HOME=/opt/appengine-java-sdk-1.2.5

google.appengine.sdk='/opt/appengine-java-sdk-1.2.5'

インストールと設定インストール!$ grails install-plugin app-engine

インストール途中で質問に答えます。Do you want to use JPA or JDO for persistence? (jpa, jdo)jpa

インストールされるとgrails-app/conf/以下にそれぞれのファイルが追加されます。datastore-indexes.xmlpersistence.xml

★grails-app/conf/Config.groovyにGAEのアプリケーション名を記述google.appengine.application="jggugv4"

★Grailsプロジェクトのバージョンをセット

GORM-JPA PluginJPAプラグインは3種類ある…

Hibernate JPA Provider PluginJPA PluginGORM-JPA Plugin ← これを使います。

できることGORMと同じsave(),list()等のメソッドが利用できる。(※一部未対応、)

できないことドメインクラスと同じmapping定義ドメインの定義には、JPAアノテーションを利用Criteria (※JPA1.0で未対応なため)

GORM-JPAインストールインストール! $ grails install-plugin gorm-jpa

resources.groovyにentityManagerFactoryとtransactionManagerを追記entityManagerFactory(org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean) { beanClassLoader = ref("classLoader")}

transactionManager(org.springframework.orm.jpa.JpaTransactionManager) { entityManagerFactory = entityManagerFactory }

何故かdatanucleus-enhancer*.jarが入っていないのでコピーcp $APPENGINE_HOME/lib/tools/orm/datanucleus-enhancer-1.1.4.jar lib

ドメインクラスの調整通常のGrailsドメインクラスでは、JPAで使うことはできません。若干の修正が必要です。JPA用のアノテーションを追記import org.datanucleus.jpa.annotations.Extensionimport javax.persistence.*;

@Entityclass Event implements Serializable {

@Id @GeneratedValue (strategy = GenerationType.IDENTITY) @Extension (vendorName = "datanucleus",

key = "gae.encoded-pk", value = "true") String id /** イベントタイトル */ @Column //全てのフィールドに付加 String eventName

コントローラの調整これが正解なのかは検証中ですが。アクションクロージャsaveだけ編集。

def save = { def eventInstance = new Event(params) Event.withTransaction{ if(eventInstance.save(flush:true)) { flash.message = "Event ${eventInstance.id} created" redirect action:"show", id:eventInstance.id } else { render view:'create', model:[eventInstance:eventInstance] } }}

起動コマンドバージョンをセットしてローカルで起動

準備$ grails set-version 1

起動$ grails app-engine run

デプロイコマンドでデプロイ

appcfgコマンドでデプロイ

$ grails set-version 1$ grails app-engine deploy

$ grails app-engine package$ rm target/war/WEB-INF/lib/jul-to-slf4j-1.5.6.jar$ appcfg.sh update ./target/war

動作!

Grails+GAE/J まとめいろいろと記述をGAE/J用に書き直す手間がありますが、プラグインを活用して開発ができる等の利点があります。

現状バグがあり正常に動作しませんが、近々Fixされると思います。※1.2のリリースには安定するはず。

Gaelyk(ゲーリック)

GroovyでGAE/Jを簡単に。

GroovyでGAE/Jを簡単に。

GAE/Jをはじめるにあたって、最初からしっかりしたMVCなフレームワークも良いけど、柔軟なわかりやすい環境で試すことができたら良いなと思います。そんなサックリとGAE/Jを試したい人にはもの凄くお勧め。AppEngineのサービスを試してみるもよし、本気で開発するもよし。Gaelykも一応MVCな対応ができてたりします。ただし、IDEフレンドリーではない気がする。その辺はおいといて・・・・。

Gaelyk(ゲーリック)Gaelykとは、

GAE/J用の軽量Groovy開発ツールキットです。GroovyテンプレートとGroovletで構成されています。

ビューとコントローラGroovletsとTemplateServletを拡張したクラスで実現ビュー:GaelykTemplateServlet拡張子gtplのプレゼンテーション層

コントローラ:GaelykServletGaelykTemplateServletとGaelykServletにGAE/Jで使用するサービスなどがServletBindingにバインドされています。GAE/JのサービスにもCategoryを使用してメソッドが拡張追加されています。

Gaelyk(ゲーリック)

クイックスタート & 概要

セットアップGaelykテンプレートプロジェクトをダウンロードhttp://gaelyk.appspot.com/download/

テンプレートプロジェクトです。そのまま解凍して仕様します。gaelyk-template-project-0.2.zipを解凍。

テンプレートプロジェクト内容 build.groovy & src

AntBuilderで実装されてる簡単なビルド用プログラム。srcフォルダに配置した、GroovyとJavaのソースのコンパイルに使用。

warこのディレクトリがデプロイされます。

warディレクトリこのディレクトリに、ビューの*.gtplと、css、images等のファイルを配置します。WEB-INFappengine-web.xml  GAEの定義ファイルweb.xml/groovy/ここに*.groovy配置

/includes/ - インクルードファイル//lib/ - *.jar/classes/

appengine-web.xml 設定<application>タグの中身を対象のアプリケーション名称に変更<version>を指定<static-files> リソース設定

web.xml 設定拡張子など変更したい場合や、色々追記したい場合は、そのまま追記でOK。

起動には、GAE/Jのツールを使う

Eclipseで起動もOK

http://localhost:8080/をブラウザで表示

ローカルで起動テンプレートプロジェクトのルートで、$ dev_appserver.sh ./war

※Windowsでは、.sh→.cmd

Gaelyk(ゲーリック)

More Quick Start!

More Quick Start!.gtpl(テンプレート) GaelykTemplateServletGroovlets GaelykServletEager、Lazy変数バインドされたGAE/Jのサービス追加/拡張されたメソッドおまけ:簡単に始められるキット

.gtpl(テンプレート) GaelykTemplateServlet

JSPやGSPと同じようなもの。Groovyコードが書けます。<% /* some code */ %>${value}でGString書けます。<%=hoge %>も使えます。printとprintlnもOK。

GaelykTemplateServletソース

Groovlets GaelykServletGroovyServletを拡張したGroovyスクリプト

Viewテンプレートへのデリゲートrequest.setAttribute 'list', [1, 2, 3, 4]request.setAttribute 'date', new Date() forward 'display.gtpl'

GaelykServletソース

Eager変数request : HttpServletRequestresponse : HttpServletResponsecontext : ServletContextapplication : contextと同じsession : HttpSessionを返します。 request.getSession(false) と同じです。params : フォームパラメータのマップheaders : 全てのリクエストヘッダのマップ

Lazy変数out : PrintWriterを返す。   response.getWriter()への速記sout : ServletOutputStreamを返す。 response.getOutputStream() への速記html : MarkupBuilderを返す。   new MarkupBuilder(response.getWriter()) への速記

バインドされたGAE/JのサービスdatastoreService : DatastoreサービスmemcacheService : MemcacheサービスurlFetchService : URLFetchサービスmailService : メールサービスimagesService : ImagesサービスuserService : ユーザサービスuser : ログイン中のユーザ (ログインしていない場合は null )

追加/拡張されたメソッドGAE/Jのサービスやクラスがより便利に使えるように、メソッドが追加されています。(一部を紹介)

詳しくは http://gaelyk.appspot.com/tutorial/MailServiceのsend()を拡張

DatastoreServiceにwithTransactionを追加

low-levelデータストアAPIを使いやすく

mailService.send to: 'foobar@gmail.com', subject: 'Hello World', htmlBody: '<bold>Hello</bold>'

datastoreService.withTransaction { // your code}

low-levelデータストアAPIグルービーにEntityクラスを使ってデータストアimport com.google.appengine.api.datastore.Entity

def person = new Entity("person")

person['name'] = "やまもとつよし"println person['name']

person.age = 31println person.age

//保存person.save()

//削除person.delete()

//リストdef q = new Query('person')def list = datastoreService.prepare(q).asList(

    Builder.withLimit(20).offset(0) )

注意点・ゲーリック*.gtplの文字化け回避

file.encodingのみではだめっぽい。groovy.source.encodingも指定してね。

<system-properties> <property name="file.encoding" value="UTF-8"/> <property name="groovy.source.encoding" value="UTF-8"/></system-properties>

おまけ荒っぽいですが、簡単に始められるキットここに http://grails.jp/sample/ に置いておきます。gaelyk-setup.sh をダウンロードそして実行!要 wget 。※好みな物に置き換えてね。注意:危険だと思ったら中身を見てから使ってね。超ザックリ適当に作ったので、シェルスクリプト詳しい人、拡張よろしくです。

Eclipseでインポート。GAE/JのプラグインとGroovyのプラグインが必要。

$ ./gaelyk-setup.sh myapp001

時間があればデモ

まとめG*なクラウド開発では、どれを選択するべき?ものすごく単純なJEEアプリを作る場合はGAE/J&Gaelyk でサックリ開発

Grailsプラグインを活用して若干高度なJEEアプリを作りたい場合で、GAE/J範囲で可能であれば、Grails/AppEngine がオススメ。

Grailsをそのままクラウドへ!の場合はCloudFoundry他のEC2ベース

まとめ小 Gaelyk

中Grails + GAE/J

大Grails + Cloud Foundry

AWS S3

AWS EC2

Clould FoundryGrails

PluginPluginPlugin

instanceinstanceinstance

ライトな部分Google AppEngine

Gaelyk

GrailsPluginPlugin

クライアントGriffon Adobe Air

連携

連携連携

Thank you.

日本 Grails/Groovy ユーザーグループhttp://www.jggug.org/

Recommended