« 2013年10月 | メイン | 2013年12月 »

2013年11月

2013年11月29日 (金)

ApexからGoogle Calendarを操作する(完結編)

前回の続きです。

前回なんとなく動くCalendar APIを作ることはできたわけですが今回はそれを使うためのセットアップ方法と使い方を解説します。

 

★ インストール

ソースコードはこれです。

https://github.com/shunjikonishi/apex-google-api

Force.com IDEに取り込むなどして、使用する環境に組み込んでください。

 

★ Google Cloud Consoleの設定

Service Account認証を行うためにはGoogle側にアプリケーション登録が必要です。
アプリケーションの設定はGoogle Cloud Consoleで行います。

https://cloud.google.com/console

必要な手順を列挙すると

  •  連携用のプロジェクトを作成する
  •  画面左のメニューから「API & auth > APIs」と展開し、Calendar APIをONにする
  •  「API & auth > Registered apps」の画面で新しい「Web application」を作成する
  •  上で作成したApplicationの画面で新しいCertificateを生成する


という感じになります。
スナップショットが見たい場合はここが比較的新しいかな?

http://d.hatena.ne.jp/shimooka/20130912/1378980591

作業を行うにあたり参考にしたサイトはいくつかありますが、GoogleのUIはころころ変わるためかなり高い確率で「そんな画面ねー!」とか「そんな選択肢ねー!」という説明に遭遇します。
ここに書いた手順も光の速さで陳腐化すると思うので手順よりも枠組みを理解してください。

Certificateを生成するとアプリ用のメールアドレスが発行され、PrivateKeyがp12ファイルとしてダウンロードできます。
PrivateKeyのダウンロードはこの時に一度しか行えず後から再ダウンロードはできないので注意してください。(まぁCertificateの生成をやり直せば良いんですが。)

あとファイルから鍵を取り出すためのパスワードもダウンロードダイアログにさらっと表示されるだけです。固定で毎回同じだと思うので別に良いんですが、最初気がつかなくて結局これも後から検索して調べました。(^^;

手順を鵜呑みにせずに、ちゃんと途中に出てくるメッセージは読みましょう。

 

★ Sign Serverを建てる

前回も書きましたが、現在のApexではSHA256での署名ができません。
そのため外部に電子署名のためのサーバを建てる必要があります。

https://github.com/shunjikonishi/sign-server

これを動かすのはやはりHerokuが一番お手軽でセットアップ方法はREADMEに書いてある通りです。

環境変数「PRIVATE_KEY」には先にダウンロードしたp12ファイルを丸ごとBASE64エンコードした値を設定すればOKで、ファイルのBASE64エンコードには僕はopensslを使用しました。(改行コードは自分で取り除きました。)

 

openssl enc -base64 -in xxxx-privatekey.p12 -out temp.txt

 

セキュリティを高めたい場合はBasic認証とIP制限を設定することができます。このサーバはSalesforce以外からアクセスできる必要はないのでALLOWED_IPにSalesforceのIP範囲を設定しておくことをお勧めします。

HerokuのDynoをスリープさせないためのPOLLING_URLの設定は必ずしも必要ありませんが、Salesforceのコールアウトの設定はかなり短く設定されているのでDynoがお休み中だとそこそこ高い確率でDynoが起きるよりも先にタイムアウトエラーになります。(^^;

もちろん電子署名のために必ずこのSignServerを使用しなければならないとか、Herokuを使わなければならないということはありません。

電子署名のために必要なコードはこの程度なので、適当なサーバがあるのであればそちらに組み込むことも可能です。

 

★コーディング

ここまで来たら後は実際にコードを書くだけです。
まずは認証。

 

SignServer sign = new SignServer('https://YOUR-APPNAME.herokuapp.com/sign');
service = new GoogleCalendarService(sign);
JWT jwt = new JWT('YOUR-APPACOUNT@developer.gserviceaccount.com');
service.authenticate(jwt);

 

SignServerのコンストラクタには作成した署名サーバのPOST URLを渡します。
JWTのコンストラクタ引数はGoogle Cloud Consoleで証明書を生成した時に同時に生成されるメールアドレスです。

JWTではscopeやセッションライフタイム等を自分で設定することもできますが、未設定の場合はサービスクラスがよしなに設定してくれるのでメールアドレスのみの指定で問題ありません。

ちなみに既存ユーザのカレンダーを読み書きする場合は、このメールアドレスに対して共有設定を行います。

あとはGoogle提供のAPIリファレンスを見ながら必要なメソッドを実行してください。(※全部のメソッドを実装している訳ではありません。)

https://developers.google.com/google-apps/calendar/v3/reference

このAPIリファレンスはとても見やすいですし、APIとモデルもこのリファレンスに忠実に作っているので特に使い方で迷うところはないと思います。

ここでは知らないとわからないGoogle Calendar固有のトピックを紹介します。

 

- 時間の設定方法

各イベントの日時の指定はJSON上は以下のようになっています。

 

"start": {
    "date": [date],
    "dateTime": [datetime],
    "timeZone": [string]
},
"end": {
    "date": [date],
    "dateTime": [datetime],
    "timeZone": [string]
},

 

 開始、終了時刻を別々に指定するわけです。
dateとdatetimeの両方がありますが、使用するのはどちらか一方のみです。timeZoneは省略時にはカレンダーのデフォルト設定が使用されます。

終日イベントを作成する場合は以下のようにendにstart + 1のdateを指定します。

 

"start": {
    "date": '2013-11-28',
},
"end": {
    "date": '2013-11-29',
},

 

 ところでGoogleCalendarEventクラスではstart, end, date, dateTimeなどいくつかのプロパティがプロパティ名に「_xx」を付加した形で定義されています。
これは「end」や「date」などいくつかの単語がApex内の予約語や組み込みクラス名とかぶるために使用できなかったために取った迂回処置です。(「start」は予約語ではありませんがバランスを考えて「_xx」を付けました)

なので、日時をプロパティで設定しようとすると「event.start_xx.date_xx = d」のようになるんですが、それもいけてないんでいくつか定義されている日付設定用のメソッドを使うようにしてください。

 

Datetime d1 = Datetime.newInstance(2013, 11, 28, 15, 0, 0);
Datetime d2 = Datetime.newInstance(2013, 11, 28, 16, 30, 0);
//コンストラクタ
GoogleCalendarEvent e1 = new GoogleCalendarEvent('イベント名', d1, d2);

//開始終了日時を別々に指定
e1.setStartDatetime(d1);
e1.setEndDatetime(d2);

//開始日時と期間(分単位)で指定
e1.setDateAndDuration(d1, 90);

//終日
e1.setAllday(d1.date());

 

 - CalendarとCalendarList

CalendarListとはGoogleカレンダーのWeb画面の左端に表示されるカレンダー一覧の一個のインスタンスのことです。名前がまぎらわしいですがカレンダー一覧全体を指すものではありません。

CalendarListは名前やタイムゾーンなどのCalendarの持つすべてのプロパティを内包しますが、色や非表示設定などの一覧表示のために必要なプロパティはCalendarListにのみ存在します。
Calendarにはlistメソッドがないので使用可能なCalendarのリストを取得するためにはCalendarListのlistメソッドを使用します。

この実装ではGoogleCalendarListはGoogleCalendarを継承しているのでGoogleCalendarService#listCalendarListメソッドで取得したGooglCalendarListクラスはそのままGoogleCalendarとして使用できます。

※現在CalendarListの作成、更新、削除メソッドは実装されていません。

 

- updateとpatch

カレンダーやイベントの更新メソッドにはupdateとpatchの二つがあります。

updateメソッドはupdateというよりもむしろreplaceです。Bodyに指定された内容で既存のインスタンスを丸ごと置き換えるイメージ。

一方のpatchメソッドはまさにpatchで既存のインスタンスの上に指定された項目のみを上書きするイメージです。

実際のところはupdateメソッドに渡すインスタンスはIDを含む完全な内容でなければならないので、getで取得したインスタンスを加工したものしか渡すことができません。逆にpatchメソッドの場合はIDを含まない一部の内容を渡すのでgetで取得したインスタンスを渡すことはできません。

ちなみにpatchメソッドにattendees(ゲスト)のようなList項目を設定した場合、既存のリストにアイテムが追加されるのではなく、リスト全体が置き換わります。
このため既存のイベントに対してゲストを追加する場合のコードは以下のようになります。

 

//ゲストを一人招待した状態で新規イベントを追加
GoogleCalendarEvent e1 = new GoogleCalendarEvent('カレンダーテスト', Date.newInstance(2013, 11, 30));
e1.addAttendee('xxxx@flect.co.jp');
e1 = service.insertEvent(cal, e1);
System.debug('Inserted Event: ' + e1);

//ゲストをもう一人追加する
GoogleCalendarEvent e2 = new GoogleCalendarEvent();
e2.attendees = e1.attendees;//元のゲスト一覧をコピー
e2.addAttendee('yyyy@flect.co.jp');
e2 = service.patchEvent(cal, e1.id, e2);
System.debug('Patched Event: ' + e2);

 

 使用されているHTTPメソッドがそれぞれPUTとPATCHであるところがRestfulな感じです。(^^;

 

★今後の予定など

カレンダー関連の現在未実装のメソッドは必要に迫られれば実装しますが、あんまり積極的に実装しようという意気込みはありません。
実際のところこの辺の実装はもはや単なる作業でしかないので、むしろ必要な人が自力で実装してPullReqください。(^^;

認証関連はJWTを使ったService Account認証しかできないのはあんまりなんで、通常のOAuth Server Flowは実装しようかと思ってます。(いつ?)

Spreadsheetなどのその他のGoogle APIについては簡単に実装できそうならやっても良いかなぁと思ったんですが、今見たらSpreadsheetはV3 APIもGDataベースのようなんであんまり関わりたくありません

ていうかApexはもうしばらくいいです。。。(--

-------

2013/11/30 追記
@stomitaさんのご指摘からSignServerにBasic認証とIP制限の設定を追加しました。
@stomitaさん、ありがとうございます。

2013年11月28日 (木)

続・ApexからGoogle Calendarを操作する

どもども。先週の記事「ApexからGoogle Calendarを操作する」の続きです。

といっても厳密には続いてないんですが。。。(^^;

 

★Google Data API Toolkitのお話

さて、先週の記事ではぶつぶつ文句を言いながらも、「Toolkitで一通りカレンダーいじれるんじゃないの?」という結論に達しました。

しかし、今週になってやっぱり使うのを止めました。(--

イベント作成時に使用するオブジェクトが何故かSalesforceのEventオブジェクトでなんかビミョーという話は前回さんざんしましたが、実際のところはタイトル、日時、場所、説明さえ設定できれば良かったのでそれで事足りるはずだったんです。

なのに、実際に試してみると何故か場所が設定されない。。。

あれ、なんでだ?自分のコードではちゃんとEvent#Locationに値を設定してるし。。。

。。。

。。。て、CalendarService#insertEventsで引数に渡したLocationがコピーされてねー

そらあかんわ。。。(--

 

□□□□

さて、どうしたものか?

直接修正するなら1行で直せる程度のものですが、それも気が進まない。

とりあえず元のリポジトリを探してみたところ。。。

https://code.google.com/p/apex-google-data/

うーん、もう3年近くメンテされた形跡が無い。。。

その間にAPIもXMLベースのV2からRESTベースのV3に変わっているわけで、これはもうこの先も放置なんだろうなぁ。。。(--

 

★V3 APIの使用を検討してみる

さてさて、ソースまるごとフォークして自分でメンテすることも考えましたが、それやろうとすると直したいところが多すぎる。(--

それに今は面倒なXMLを使わなくてもお手軽にRESTで実行できるV3 APIがあるんだよ!

ということでとりあえずV3のドキュメントを読んでみることにしました。

https://developers.google.com/google-apps/calendar/

うん、やっぱりReference見ただけでもV2よりもはるかに簡単に使えそう。それにDeprecation Policy見ると旧APIは2015年4月までは使えるけど、そっから先は知らん!と書いてるようにも思えるしこれはやっぱりどうでもV3を使うべきでしょう。

 

★Service Account認証

とりあえずApex用のV3ライブラリを探してみるけど、どうも無いっぽい。まぁ「Salesforce Google API」みたいなワードで検索すると一撃でSalesforce公式(?)っぽいToolkitのページが見つかるからその先に踏み込む人もあんまりいないんだろう。。。2015年4月以降をどうやって乗り切るつもりかは知らないけど。。。(--

V3 APIをざっと眺めるかぎり少なくともAPI本体のREST部分はものすごくシンプルなので自分で作るとしてもそんなにたいしたことはなさそう。

問題は認証部分。

V3 APIではClientLoginは廃止されたので今までのように気軽に個人のユーザーアカウントとパスワードでログインしてAPIをたたくことはできない。

そうはいってもサーバーアプリの場合ユーザーとは無関係の固定のアカウントでAPIを叩きたい場合も多い訳で、そういう場合はService Account認証というのを使うらしい。

https://developers.google.com/accounts/docs/OAuth2ServiceAccount

これは連携用のアプリケーションを登録して、そこで発行されたClientIDとPrivateKeyを使用して認証するという方法らしい。

下に詳細な実行手順が書かれているけど要するに

  • JSONで認証用の文字列(JWTというらしい)を組み立てて、
  • Base64でエンコードして、
  • 電子署名を追加して、
  • Http POSTで投げる

とすれば良いらしい。(どうでもいいんだけどこれもOAuth2の一種なの?一般的なOAuthとまったく類似点が無い気がするんだけど。。。)

ドキュメント読んでると3回位「悪いことは言わないから自分で実装したりせずに既存のライブラリ使っとけ!」と、言われるんだけどApex用のライブラリは無いんだよ。。。(--

ApexにもJSON、EncodingUtil、Crypto、と必要な道具立ては揃ってるっぽいから多分作れるんじゃないかな?

。。。とりあえず作ってみるか!

 

★で、作ってみた

けど無理でした。。。(--

認証文字列を作るところは良いんだけど最後の最後で署名が。。。(--

ここではSHA256withRSAで電子署名する必要があるんだけど、ApexのCrypto#signではSHA1withRSAでしか署名できないという罠。。。(--

マジでかー(--

ここさえ突破すれば終わりなのにこれはどうしようもねーよ。。。

どうしよう。。。

。。。しょうがないから、外に署名だけするサーバー建てるか。。。

 

★まさかのHeroku登場

作りました。

https://github.com/shunjikonishi/sign-server

ホントにPOSTされた文字列に電子署名して返すだけのアプリ。HerokuにpushしてConfigにBase64エンコードした秘密鍵を設定すれば使えます。

。。。(^^;;;

なんたるリソースの無駄遣い!数年前にはここまで単機能のサーバを気軽に作る日が来るとは思いもしなかったよ。

さすがにちょっとやりすぎなんじゃないの?という気がしなくもないけど、このアリサマはSalesforceがSHA256をサポートしていないのが原因なんでまぁいいか。(^^;

ということで、一応動くGoogle Calendar API V3のラッパーを作ることができました。

https://github.com/shunjikonishi/apex-google-api

次回はこいつの使い方を解説します。(^^v

 

□□□□

蛇足

実はSalesforceにもJWTを使った認証があるということを今回調べてて知りました。

SalesforceのAPIはIDとPassword(とSecurityToken)の認証で普通に使えるからこれ使う人いるのか?という疑問はまぁおいとくとしてもそこではSHA256での検証もやってるっぽい。

そこまでやってるなら後はそれをCryptoにもぶちこめば良いだけなんでとっととやって欲しい。。。(--

たったそれだけでGoogle V3 APIが自由に使えるかどうかが変わってくるんだからホント頼むよ。。。m(_ _)m

2013年11月20日 (水)

Dreamforceには行ってない

まさかの3連投。(^^;

DreamforceでのHeroku関連のアナウンスはこれみたいですね。

https://blog.heroku.com/archives/2013/11/19/tools-for-integrating-heroku-apps-with-salesforce

FLECTからは役員2人が行っているので、お土産話に期待したいところです。

Heroku1とはいったい何なのか?サイト見ても人柱募集中!であることしかわからないよ。。。(^^;

★ Force.com CLI

SalesforceのWeb画面にいちいちログインするのがめんどくさいので、とりあえずコマンドラインツールを作ったそうです。
つねづねかねがね思ってたけどHerokuのエンジニアは自分と精神構造が近い気がするよ。。。(^^;

psqlのようなシェルに入ってコマンドを叩くタイプではなく、herokuコマンドのようにログインアカウントを最初に覚えさせて毎回「force xxxx」としてコマンドを実行するタイプのようです。

実装は例によってRubyだろうと思ってたら、なんとGoogle Go。
僕は公開されているソースはとりあえず眺める習慣があるんですが、最近はGoで書かれているツールも多いような気がします。やっぱりexeにできるのが大きいんですかね。そろそろ真面目に学習してみようかな。。。

★ Force.com Client Libraries

RubyとNode.js用のSalesforceクライアントライブラリを作ったそうです。
これって今までなかったんだっけ???

HerokuではRubyとNodeがトッププライオリティの言語と言うのは前にも聞いたことがあったんですが、やっぱりこの2つは特別扱いなんですかね。

ちなみにJavaのクライアントライブラリは自前で書いてます。(^^v

http://oss.flect.co.jp/libs/ja/flectSalesforce.html

★ Introducing Heroku Connect

SalesforceのデータをHeroku Postgresと同期するツールを絶賛開発中だそうです。

。。。

ていうか、これもついこの間自前で書いたよ。。。(--

http://flect-salesforce-sample.herokuapp.com/sobjectsync

元々は案件要請から作ったものなんだけど数行のコードでSELECT結果をRDBに取り込めて間に関数もはさめるので実用性はかなり高いと思います。更新日時を取っておいてスケジューラで起動すればそれだけで同期ツールにもなるし。

もうちょっと内容整理して、アプリの形にしてからブログに書こうと思ってたけどHeroku謹製のモノができるのであればもういらないかな?

やはり人柱に応募すべきなのか。。。(--

★ Come see us at Dreamforce

行けません。(--

2013年11月19日 (火)

ApexからGoogle Calendarを操作する

こんばんは。およそ1年半ぶりにApexコードを書いている小西です。(--

さて今回のお題はSalesforceからGoogleカレンダーのイベントを読んだり書いたりするやり方の調査です。

「apex google calendar」でググると一発でGoogle Data APIのドキュメントが引っ掛かるので楽勝です。

http://wiki.developerforce.com/page/Google_Calendar_API

ただし、、、Apexに詳しい人ならな。。。(--
文法とかDeployの仕方とかもう忘れたよ!!!

★ Google Data APIのセットアップ

さて、文句ばかり言っていても仕方がないのでとっととやっつけてしまいましょう。
まずはGoogle Data APIのセットアップ方法はこちら。

http://wiki.developerforce.com/page/Google_Data_APIs_Toolkit_Setup

詳細な手順は省略しますが、やっている内容は以下です。

  • Force.com IDEのインストール
  • Subclipse(EclipseのSubversion プラグイン)のインストール
  • Googleのリポジトリからgoogle_data_toolkitをチェックアウト
  • 自分のSalesforceアカウントにgoogle_data_toolkitを取り込み
  • Salesforceのリモートサイトの設定に「https://www.google.com」を追加


要するに必要なApexクラスをインポートしているだけです。
僕は今回 Force.com IDEのインストールからやっていて、純正Force.com IDEではプラグイン取得がメニューから消されてるとか、何故か管理者権限で動かさないとForce.com IDEとSalesforceの同期がエラーになるとかに軽くひっかかりましたが、多分これを読んでいる人は皆僕よりもSalesforceに詳しいのでその辺もスルーで良いでしょう。

★ Calendar APIを使ってみる

さて、環境がととのったらあとは実際にAPIを叩くだけです。
最初に示したドキュメントにはコードサンプルもそれなりに載っているので楽勝です。

今回の場合、特定のユーザでいくつかのカレンダーにアクセスできれば良いので単純にID/Passwordでログインしたかったんですが。。。あれ???

ドキュメントにはOAuthで認証する方法しか載っていません。。。(--

□□□□

さらに検索をかけるよりも、もはやソースを見た方が早そうだったのでざっとソースを眺めることにしました。

JavaのGoogle Data APIは単純にXMLの各要素をメソッドに対応させただけのシロモノでメチャメチャ冗長で扱いにくかった記憶があるんですが、Apex版はクラス数も少なくてかなり簡略化されている印象があります。(Java版も今は変わっているかもしれませんが。)

実際、Calendar APIを使用するだけなら読まなければならないクラスは

  • CalendarService
  • GoogleData


の2つだけです。ただし、この2つは必ず上から下までざっとでも眺めた方が良いです。


★ Google Data APIのソースを読むべき理由

まぁ僕もそれほどしっかりと読んだわけではないんですが、それでも2つばかり「なんだかなぁ。。。」と思った部分があるので以下にそれを記載します。


- Eventオブジェクトはカレンダーイベントのラッパーではない

ドキュメント見た時から不思議だったんですが、Calendar APIではInsert時にはEventオブジェクトを引数として渡します。しかし、何故かUpdate時にはEventオブジェクトではなくDOMのElementが引数になります。EventオブジェクトがイベントのラッパーであるならUpdateもそれを使えば良いじゃんと思うんですが、実はEventがあらわすものはGoogleカレンダーのイベントではありません。Salesforceの組み込みオブジェクトのEventです。
よく考えると名前が被るのでEventという名前のApexクラスは作れないんですが、なんとも中途半端な実装をしたものです。。。(--

このおかげでUpdate時には(頑張れば)どのような項目でも設定できますが、Insert時には設定することのできない項目があります。

ちなみにここで言う「頑張る」とは自力でDOMのElementを足したり引いたりすることなので、そんなことする位なら多少パフォーマンス落としても削除してからInsertしなおすよ!と思っちゃいます。。。(--



- ソースの中にちらほらとToDoが残っている

例えばこんなのとか

    // TODO support for recurring events

「繰り返し項目をサポートする」。SalesforceのEventオブジェクトにも繰り返しの設定らしきものはあります。それがGoogleカレンダーの繰り返しときれいに対応する形式なのであればすぐに作れたろうと思うんですが、多分しなかったんでしょうね。。。(--
「ラッパーあるから楽勝!」と思ってタカをくくっていると痛い目にあいかねません。(自力でDOMをどうにかすればできますけど。。。)


これもEventオブジェクトをそのまま流用したことの弊害だと思います。この仕様はSalesforceのEventをGoogleカレンダーに一方向に流すだけの場合は便利なのかもしれませんが、どうにも設計ミスのように思えます。。。(--

ちなみに当初の目的であったID/PasswordでのログインメソッドはCalendarService#useClientLoginです。

★ 今後の方針とか

さてさて、どうしたものでしょう。。。(--
自前で簡単なラッパークラスを作るだけでも格段に使い勝手はよくなりそうな気はします。でも実際のところは素のまま使ってもたいていの要件は間に合うような気がするんですよね。

必要に迫られたら作る、というのが個人的な方針でもあるので今回はスルーでも良いかなぁ。。。

決してApexのコードを書きたくないとかそういうことではないんですが。。。(^^;

★ Googleからのアカウントブロックメールに注意

そういえば、最後にもうひとつ。ApexからのID/Passwordでのログインをテストしてから次のテストコードを書いて、実行すると何故かログインに失敗するようになりました。

最初は自分のコードのバグかと思ったんですが、どうにもさっきは成功していたコードで失敗しているように見える。。。

なんでだろう?と思っていたらメールボックスにGoogleからの「不正なログインがブロ​ックされました」というメールを発見!

ほぅ。。。どうやらGoogleはログインリクエストのUser-AgentやIPをチェックして、こいつは怪しい!と判断したら即座にそのログインをブロックするようです。

ちなみにこの状態でも日常使用しているブラウザやスマホは問題なく使えていました。(多分)

メールに記載された手順でロック解除するとすぐに使えるようになりましたが、これも知らないと結構ビックリしますよね。(^^;

GitHubにリンクするDocletを作ってみた

こんばんは。

今回タイトルにあることがすべてですが。。。(^^;

ふと思いついてGitHubにリンクするDocletを作ってみました。

StandardDocletから改造したのはたった一箇所、クラス名の横にOctocatをおいてGitHub上のソースにリンクするだけ。

Javadoc

結構便利です。(^^v

仕組み的にはGitHub以外でもJavaのソースが階層構造でアクセスできるサイトなら他でも使えるんですが、リンクアイコンをOctocat埋め込みにしたのでGitHub専用です。

その辺パラメータにしようかとも思ったんですが、あんまりパラメータ増やしたくなかったので追加のパラメータはリンク先のGitHubのURLを指定するだけ。

MavenやAntからももちろん使えるのでOSS界隈で広まってくれるとちょっと嬉しいですね。

2013年11月12日 (火)

Heroku Postgres 2.0がリリース

したらしい。。。ってそれは何ぞ?(^^;

アドオンページ見ると料金体系の名前とかも変わってますね~。

https://postgres.heroku.com/blog/past/2013/11/11/heroku_postgres_20

料金は以前の同列と比較すると若干安くなっているような気がしますが、Ikaを使っていた人が
「あなたの新しいプランはStandard Ikaです!」とか言われると「Premium Ikaに上げないといかんのかな。。。」
という強迫観念に襲われるような気がしないでもない。

ていうか、今まさに思ってる。(^^;

機能的にどこが変わったのかという辺りをざっとみると以下のような感じのようです。

★Operational Expertise built-in
運用に便利な機能内蔵してます。

- 使ってないインデックスあったら教えてやんよ!
- データ量が逼迫して来たら教えてやんよ!
- セキュリティパッチなんかは勝手に当てとくよ!
- ハードウェアトラブルもまかしとけ!

どっちかというと限定的でもいいからConfigをいじらせてくれ、と個人的には思うんですがどうやらその辺はこっちでやるから気にすんなよ!というスタンスのようです。
まぁ多分何かしらのトラブルにぶち当たるまではそっちの方が圧倒的に楽です。

★Rollback
heroku release:rollback相当のことがPostgreSQLでもできるようです。
これは。。。便利かも!

deployのタイミングでテーブルの追加やスキーマ変更を同時に行う必要が出てくるというのは良くある話で、deployを元に戻した時にはその変更も元に戻してくれるらしい。

それは凄い!!!

これってどういう仕組みでやるんだろう???と思ったらここに説明されてました。

https://devcenter.heroku.com/articles/heroku-postgres-rollback

ロールバックポイントというのが各プラン毎に一ヵ月、とか一週間とか設定されていてそこから指定の日時までの更新をREDOログを元に再生しているみたいですね。

リリースの為のDDLを流す時にはその時間を覚えとけ!ってことかな。
最初の期待値高かったけど、でもそれだったらpgbackupでも良いような気がしなくもない。。。(^^;

あれば使うけど。

★High Availability
これこそが各プランのStandardとPremiumの格差のようです。
要するに自動でFollow DBも作っておいてくれて障害時には自動で切り替えてくれるってことなんだと思うけど、ちょっと高いかなぁ。。。

Followを作る動機には障害対応の他にも参照専用のレプリカが欲しい、というものもあってそっちには安いプランを使ってたりするのでちょっと考えどころです。
これを使うとその為のFollowは不要になる、という風には読めないですし。

ていうか、ハードウェアトラブルもまかしとけ!ならそれで十分な気も。

★New Tiers and Pricing
Hobby、Standard、Premiumの違いはなんとなくわかったけどEnterpriseってなんでしょうね?
個別契約かな?


★Availability
PostgreSQL9.3がデフォルトになりましたっと。

採用情報

株式会社フレクトでは、事業拡大のため、
Salesforce/Force.comのアプリケーション
開発
HerokuやAWSなどのクラウドプラッ
トフォーム上でのWebアプリケーション開発

エンジニア、マネージャーを募集中です。

未経験でも、これからクラウドをやってみた
い方、是非ご応募下さい。

フレクト採用ページへ

会社紹介

株式会社フレクトは、
認定コンサルタント
認定上級デベロッパー
認定デベロッパー
が在籍している、
セールスフォースパートナーです。
heroku partnersにも登録されています。
herokuパートナー
株式会社フレクトのSalesforce/Force.com
導入支援サービス
弊社の認定プロフェッショナルが支援致します。
・Visualforce/Apexによるアプリ開発
・Salesforceと連携するWebアプリ開発
も承っております。
セールスフォースご検討の際は、
お気軽にお問合せください。
Powered by Six Apart