目次


Play を使った Web アプリケーション開発: 第 2 回: クラウドで Play の力を解き放つ

簡単なステップに従って、セキュアな Play Framework アプリケーションを IBM Bluemix にデプロイする

Comments

この全 2 回からなるチュートリアル・シリーズの第 1 回では、ユーザー管理および認証を実装する Play Framework アプリケーションについてひと通り説明しました。このアプリケーションは、e-メール・ベースのサインアップとパスワード・リセットのフロー、ソーシャル・プロバイダー (例えば、Twitter など) を介した認証、そしてアカウントのマージといった機能をゼロから実装しなくても済むように、皆さん独自のプロジェクトのシードとして使用されるよう意図されたものです。

Bluemix に Play のスターター (別名、ボイラープレート) は見当たりませんが、Play アプリケーションは基本的に、ZIP ファイルまたは圧縮 TAR ファイルにパッケージ化された Java バイナリーです。従って、Cloud Foundry の Java ビルドパックを使用すれば、最小限の作業で Play アプリケーションを Bluemix にデプロイすることができます。この認証アプリケーションでは、ストレージに MongoDB by Compose サービスを、メールに SendGrid Bluemix サービスを利用します。今回のチュートリアルでは、このアプリケーションを Bluemix にデプロイする方法をステップバイステップで説明します。

必要となるもの

  • Bluemix アカウントと IBM Bluemix DevOps Services アカウント (両方とも IBM ID に関連付けられていること)
  • Java 8 がインストールされたコンピューター
  • Cloud Foundry コマンド・ライン・インターフェース (cf)
  • Compose アカウント
  • アプリケーション・コード。第 1 回でコードを入手していない場合は、次のコマンドを使って、私の Bluemix DevOps Services プロジェクトからコードを複製することができます。

    git clone https://hub.jazz.net/git/ppedemonte/dwPlayDemo

    あるいは、このセクションの終わりにある「コードを入手する」ボタンをクリックして、コードを表示またはフォークすることもできます。ただし、このチュートリアルのステップでは、ローカル PC にアプリケーション・コードが用意されていることを前提とします。
  • Twitter アカウント

アプリを実行するコードを入手する

ステップ 1. アプリケーションを本番用に構成する

アプリケーションの本番設定は、conf/application.prod.conf で定義されています。このファイルは、開発モード用の元の設定 (conf/application.conf で定義されている設定) をインポートして、本番モードでは異なってくる設定を上書きします。

include "application.conf"

play.crypto.secret=${?PLAY_APP_SECRET}

mongodb.uri = ${?MONGODB_URL}

play.mailer {
  mock = false
  host = ${?SMTP_HOSTNAME}
  user = ${?SMTP_USERNAME}
  password = ${?SMTP_PASSWORD}
}

silhouette {
  authenticator.cookieDomain="dwplaydemo.mybluemix.net"  # Change this
  authenticator.secureCookie=true

  oauth1TokenSecretProvider.cookieDomain="dwplaydemo.mybluemix.net"  # Change this
  oauth1TokenSecretProvider.secureCookie=true

  twitter.callbackURL="https://dwplaydemo.mybluemix.net/auth/social/twitter"  # Change this
  twitter.consumerKey=${?TWITTER_CONSUMER_KEY}
  twitter.consumerSecret=${?TWITTER_CONSUMER_SECRET}
}

application.proxy.httpsOnly=true

play.http.forwarded.trustedProxies=["::1","127.0.0.1","108.168.250.0/24"]

アプリケーションのドメインは、Bluemix 内で一意でなければなりません。dwplaydemo.mybluemix.netdwplaydemo の部分を置き換える一意の名前を選んでください。conf/application.prod.conf 内の Change this コメントでマークされているすべての箇所 (およびアプリケーション・コード内の同様のすべての箇所) を置き換える必要があります。

セキュリティーのための環境変数

本番モードでは、アプリケーション・シークレットは PLAY_APP_SECRET という名前の環境変数から取得されます。アプリケーション・シークレットは重要です。セキュリティーが弱いと、Play セッションを簡単にスプーフィングできてしまいます (ステップ 4 で、十分にセキュアなアプリケーション・シークレットを生成する方法を説明します)。同様に、MongoDB の本番 URI とメーラー・サービスの構成も環境変数から読み取られます。

第 1 回を読んでご存知のとおり、このアプリケーションでは認証に Silhouette を使用します。Silhouette の本番設定は基本的に同じですが、認証子および OAuth1 トークン・シークレットのクッキーについては、Bluemix でアプリケーションに使用するドメインと一致するように変更する必要があります。また、Twitter OAuth1 コールバックもアプリケーションの Bluemix ドメインと一致するように変更してください。アプリケーション・シークレットと同じく、コンシューマー・キーとシークレットも、セキュリティー上の理由により、環境変数から取得されます。

Bluemix、プロキシー、および HTTPS

Bluemix で私が特に気に入っている機能の 1 つは、フロントエンド Web サーバーという手段によって、アプリケーションのプロキシーとしての役割をトランスペアレントに果たすことです。フロントエンド Web サーバーは、HTTP アクセスおよび HTTPS アクセスを標準的なポートを利用して行えるようにします。また、HTTPS アクセスに有効な証明書を定義し、擬似標準の X-Forwarded ヘッダーを受け入れます。ただし、以下の点に注意してください。

  • プロキシー HTTP アクセスを無効にすることはできません。
  • リクエストは (プロキシーへのアクセスが HTTPS で行われたかどうかによらず) 必ず HTTP でアプリケーションに転送されます。

HTTPS だけを許可する必要がある場合 (私はそうしています)、プロキシー HTTP アクセスを無効にできないという点が問題になります。この問題には、アプリケーションの application.prod.conf に、臨時の application.proxy.httpsOnly プロパティー設定を定義するという次善策で対処します。このプロパティーを true に設定すると、X-Forwarded-Proto ヘッダーが https に設定されていないリクエストを拒否するフィルターが有効になります。

リクエストを HTTP で転送すると、サインアップ・フローとパスワード・リセット・フローで、ユーザーがプロセスを続行するためにアクセスしなければならない URL を記載した e-メール・メッセージをアプリケーションが送信する必要が出てきたときに、問題が生じます。アプリケーションが非セキュアなリクエストしか受信しなければ、これらの URL で HTTP プロトコルが誤って使用されることになるためです。幸い、Play にはこのような場合に対処するための備えがあります。それが、play.http.forwarded.trustedProxies です。この設定は、一連の信頼できるプロキシーを CIDR 表記で定義します。この定義により、X-Forwarded-For チェーンのいずれかのホストのアドレスが信頼できるプロキシー・チェーンのアドレス範囲に含まれない場合、Play は X-Forwarded-Proto ヘッダーの値を使用してリクエストのプロトコルを判断します。

ステップ 2. SendGrid サービスと MongoDB by Compose サービスを作成する

このチュートリアルでは、これ以降、cf コマンド・ライン・ツールを使用して Bluemix とインターフェースをとります。ステップ 1 の本番構成に示されているように、このアプリケーションには SMTP サーバーと、MongoDB を利用した永続化が必要です。

  1. 以下のコマンドを実行して、「mailer」という名前の SendGrid e-メール配信サービスのインスタンスを作成し、そのインスタンスを SendGrid の無料プランに登録します。

    cf create-service sendgrid free mailer

  2. Compose にログインし、自分のデプロイメントを選択します。次に右上にある「Add Database (データベースの追加)」ボタンをクリックして新規データベースを作成します。データベース名として「demodb」と入力してから、右下にある「Create database (データベースの作成)」ボタンをクリックします。 Compose で新規 MongoDB データベースを作成する画面のスクリーンショット
    Compose で新規 MongoDB データベースを作成する画面のスクリーンショット
  3. 新規デプロイメントにユーザーを追加します。それには demodb データベースを選択してから、左側パネルの「Users (ユーザー)」リンクをクリックし、右上にある「Add User (ユーザーの追加)」ボタンをクリックします。ユーザー名とパスワードを入力し (後のステップで使用するので、メモしておいてください)、右下にある「Add user (ユーザーの追加)」ボタンをクリックします。 Compose で新規 MongoDB ユーザーを作成する画面のスクリーンショット
    Compose で新規 MongoDB ユーザーを作成する画面のスクリーンショット
  4. 「Admin (管理)」セクションにアクセスして、MongoDB URI のホストとポートをメモします。 Compose で MongoDB URI を見つける方法を説明する画面のスクリーンショット
    Compose で MongoDB URI を見つける方法を説明する画面のスクリーンショット
  5. Bluemix ダッシュボードで、MongoDB by Compose サービスの新規インスタンスを作成します。「Service name (サービス名)」には「demodb」と入力し、「App (アプリケーション)」フィールドには「Leave unbound (アンバインドのまま)」オプションを選択します。「Host (ホスト)」「Port (ポート)」「Username (ユーザー名)」「Password (パスワード)」の各フィールドに、前のステップでメモした値を入力します。 Bluemix 内で MongoDB by Compose サービスのインスタンスを作成する画面のスクリーンショット
    Bluemix 内で MongoDB by Compose サービスのインスタンスを作成する画面のスクリーンショット

    Bluemix ダッシュボードからサービスを作成するために、必要なデータを入力する方法についてのさらなる詳細は、Bluemix の MongoDB by Compose に関する資料を調べてください。

これで、アプリケーションですぐに使用できる MongoDB by Compose サービスのインスタンスが作成されました。

ステップ 3. アプリケーションをパッケージ化してデプロイする (ただし、アプリケーションはまだ起動しません)

以下に示す manifest.yml ファイルで、デプロイ時に必要なアプリケーションのメタデータを定義します。

---
applications:
- name: dwPlayDemo
  host: dwplaydemo  # Change this
  domain: mybluemix.net
  memory: 512M
  instances: 1
  path: target/universal/dwdemo-1.0-SNAPSHOT.zip
  buildpack: https://github.com/cloudfoundry/java-buildpack.git
  services:
  - mailer
  - demodb
  env:
    JAVA_OPTS: -Dconfig.resource=application.prod.conf
  1. host プロパティーと domain プロパティーは、値を連結したときに、application.prod.conf で使用されているドメイン設定と一致しなければなりません。本番の構成で設定した新しい名前と一致するように、host プロパティーに変更を加えます。

    path プロパティーで指定しているのは、パッケージ化されたアプリケーションが置かれている場所の (マニフェストのフォルダーを基準とした) 相対パスです (この場所はまだ存在していませんが、この後すぐに生成します)。このマニフェストは Bluemix に対し、Java ビルドパックを使用すること、そしてステップ 2 で作成した mailer サービスおよび demodb サービスにバインドすることも指示しています。マニフェストは最後に JAVA_OPTS 環境変数を使用して、config.resource プロパティーを実行時に application.prod.conf に設定します。これにより、Play は本番構成を使用することになります。

  2. アプリケーションをパッケージ化する準備が整いました。カレント・ディレクトリーをアプリケーションのルート・フォルダーに変更して、以下のコマンドを実行します。

    ./activator dist

    上記のコマンドによって、target/universal フォルダーの下に dwdemo-1.0-SNAPSHOT.zip ファイルが生成されますが (マニフェストの path プロパティーに反映されています)、application.prod.conf によって参照される環境変数をまだ定義していないので、この時点ではアプリケーションを起動しないでください。
  3. アプリケーションのルート・フォルダーから、アプリケーションを起動せずにプッシュします。

    cf push --no-start

この段階で、アプリケーションは Bluemix にデプロイされて、mailer サービスがアプリケーションにバインドされました。次は、必要な環境変数を定義して、アプリケーションを起動します。

ステップ 4. 環境変数を定義する

本番構成が参照する環境変数を生成および変更します。

  1. アプリケーション・シークレット: activator コマンドを使用して、セキュリティーの強度が高いアプリケーション・シークレットを生成します。

    ./activator playGenerateSecret

    次に、生成されたシークレットを PLAY_APP_SECRET 変数に格納するために、以下の cf コマンドを使用します (このコマンドは、1 行で入力します)。

    cf set-env dwPlayDemo PLAY_APP_SECRET <生成されたシークレット>

  2. Twitter シークレット:Twitter Application Management サイトにアクセスし、新規アプリケーションを作成します。コールバック URL は、本番構成で定義されている twitter.callbackURL プロパティーの値に設定します。コンシューマー・キーおよびシークレットのプロパティーをメモし、これらの値に応じて Bluemix の環境変数を設定します。

    cf set-env dwPlayDemo TWITTER_CONSUMER_KEY <コンシューマー・キー>

    cf set-env dwPlayDemo TWITTER_CONSUMER_SECRET <コンシューマー・シークレット>

  3. MongoDB URI: アプリケーションの MongoDB URI を取得するために、以下の URL を使用します。

    mongodb://user:password@host:port/demodb

    上記の userpasswordhostport の各部分は、Bluemix ダッシュボードで demodb サービスを作成するために使用した値で置き換えます。次に、以下のコマンドを実行します。

    cf set-env dwPlayDemo MONGODB_URL <取得された MongoDB URI>

  4. SMTP 設定: cf env dwPlayDemo を実行して、アプリケーションに定義されているすべての環境変数を出力します。SendGrid サービスの VCAP_SERVICES の各値をメモします。それらの値に従って変数を設定します (各コマンドは 1 行で入力します)。

    cf set-env dwPlayDemo SMTP_HOSTNAME 'VCAP_SERVICES.sendgrid.credentials.hostname'

    cf set-env dwPlayDemo SMTP_USERNAME 'VCAP_SERVICES.sendgrid.credentials.username'

    cf set-env dwPlayDemo SMTP_PASSWORD 'VCAP_SERVICES.sendgrid.credentials.password'

ステップ 5. アプリケーションを起動する

  1. アプリケーションを起動するには、以下のコマンドを実行します。

    cf start dwPlayDemo

  2. アプリケーションの起動プロセス中に、別のターミナルから cf logs dwPlayDemo を実行します。アプリケーションがステージングされている間、何が行われているかを把握し、エラーを早期にキャッチする上では、ログを tail で追跡するのが賢明です。

すべてが正常に運んでいれば、アプリケーションをブラウズすると (HTTPS を使用することをお忘れなく)、ウェルカム画面が表示されます。

アプリケーションのホーム・ページのスクリーンショット
アプリケーションのホーム・ページのスクリーンショット

まとめ

Play Framework とこのフレームワークで支持されているリアクティブ・プログラミング・スタイルは、次第によく使われるようになってきています。この傾向は、今後も長い間続くと思います。このチュートリアルでは、Cloud Foundry の Java ビルドパックを使用して、重要な Play アプリケーションを Bluemix にデプロイし、セキュアにし、実行する方法を説明しました。Bluemix と Play の使用経験に関する皆さんの感想を楽しみにしています。Play でのコーディングをお楽しみください!


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development, Cloud computing
ArticleID=1025639
ArticleTitle=Play を使った Web アプリケーション開発: 第 2 回: クラウドで Play の力を解き放つ
publish-date=01212016