リージョン ID
REGION_ID
は、アプリの作成時に選択したリージョンに基づいて Google が割り当てる省略形のコードです。一部のリージョン ID は、一般的に使用されている国や州のコードと類似しているように見える場合がありますが、このコードは国または州に対応するものではありません。既存のアプリでは省略可能ですが、まもなく、新しいアプリのすべてにおいて App Engine の URL に REGION_ID.r
を含めることが必須となる予定です。
移行がスムーズに行われるように、リージョン ID を使用するよう App Engine を徐々に更新しています。Google Cloud プロジェクトがまだ更新されていない場合、アプリにリージョン ID が表示されません。ID は既存のアプリでは省略可能なため、リージョン ID が既存のアプリで使用可能になったときに、URL の更新や他の変更を行う必要はありません。
詳しくは、リージョン ID をご覧ください。
Pub/Sub は、信頼できる多対多の非同期メッセージングをアプリケーション間で行います。パブリッシャー アプリケーションはメッセージをトピックに送信し、その他のアプリケーションはそのトピックにサブスクライブしてメッセージを受信できます。
このドキュメントでは、Cloud クライアント ライブラリを使用して、Ruby アプリで Pub/Sub メッセージを送受信する方法を説明します。
要件
- App Engine の Ruby 用「Hello, World!」の説明に従って環境とプロジェクトをセットアップし、App Engine での Ruby アプリの構造を理解してください。
- このドキュメントで説明しているサンプルアプリを実行する際に必要となるため、プロジェクト ID を書き留めておきます。
サンプルアプリのクローン作成
サンプルアプリをローカルマシンにコピーし、pubsub
ディレクトリに移動します。
git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples
cd ruby-docs-samples/appengine/pubsub
トピックとサブスクリプションの作成
トピックとサブスクリプションを作成します。Pub/Sub サーバーがリクエストを送信するエンドポイントも指定します。
gcloud pubsub topics create YOUR_TOPIC_NAME gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \ --topic YOUR_TOPIC_NAME \ --push-endpoint \ https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/pubsub/push?token=YOUR_TOKEN \ --ack-deadline 10
YOUR_TOKEN
は、ランダムなシークレット トークンで置き換えます。push エンドポイントがこれを使用してリクエストを検証します。
環境変数の設定
app.yaml
を編集して、プロジェクト ID、トピック、検証トークンの各環境変数を設定します。
コードレビュー
サンプルアプリでは、Cloud クライアント ライブラリを使用しています。
このサンプルアプリでは、app.yaml
ファイルに設定された値を使用して環境変数を構成します。push リクエスト ハンドラは、これらの値を使用して、リクエストが Pub/Sub からのものであり、信頼できる送信元から送信されていることを確認します。
このサンプルアプリは、このインスタンスで受信したメッセージをグローバル リストに保存します。
このメソッドは、push されたメッセージを受信し、messages
グローバル リストに追加します。
このメソッドは、App Engine ウェブアプリと連携して新しいメッセージを公開し、受信したメッセージを表示します。
サンプルのローカルでの実行
ローカルで実行する場合、Google Cloud APIs を使用するための認証を行うには、Cloud SDK を利用します。前提条件に記載されているとおりに環境を設定していれば、この認証を行う gcloud init
コマンドはすでに実行されています。
依存関係をインストールします。
bundle install
次に、アプリケーションを起動する前に環境変数を設定します。
export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
bundle exec ruby app.rb -p 8080
プッシュ通知のシミュレート
アプリケーションは、ローカルでメッセージを送信できますが、push メッセージを受信することはできません。push メッセージをシミュレートするには、ローカルのプッシュ通知エンドポイントに HTTP リクエストを送信します。このサンプルには、sample_message.json
というファイルが含まれています。
curl
または httpie
クライアントを使用して、HTTP POST
リクエストを送信できます。
curl -i --data @sample_message.json "localhost:4567/pubsub/push?token=[your-token]"
または
http POST ":4567/pubsub/push?token=[your-token]" < sample_message.json
レスポンス:
HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
Content-Length: 13
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Server: WEBrick/1.3.1 (Ruby/2.3.0/2015-12-25)
Date: Wed, 20 Apr 2016 20:56:23 GMT
Connection: Keep-Alive
Hello, World!
リクエストの完了後、localhost:8080
を更新すると、受信メッセージのリストにメッセージが表示されます。
App Engine 上で実行する
gcloud
コマンドライン ツールを使用してデモアプリを App Engine にデプロイするには、app.yaml
が配置されているディレクトリから次のコマンドを実行します。
gcloud app deploy app.yaml
これで、https://PROJECT_ID.REGION_ID.r.appspot.com
のアプリケーションにアクセスできます。フォームを使用してメッセージを送信できますが、アプリケーションのどのインスタンスが通知を受信するかはわかりません。複数のメッセージを送信してページを更新すると、受信メッセージを確認できます。