2017.05.23

Amazon SQSアダプタを使ってみよう!

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

はじめに

桜とともに入社迎えた新入社員のみなさんすこしは会社に慣れてきましたでしょうか?
花見イベントも終わり次のイベントはゴールデンウィークでしょうか。
早いですねー。

みなさん、こんにちは花よりたこ焼きが好きな製品開発部の大澤です。

前回、村田の記事で Amazon SQS を使った新しい連携活用例を紹介いたしました。

今回は実際に Amazon SQSにSalesforceからメッセージを送信し、

そのメッセージをSkyOnDemandのAmazon SQS アダプタでメッセージを取得するところまでをご紹介します。


①Amazon SQSのMessage Queueの作成

まずはAmazon SQSのキューを作成します。
必要なクリック数はたったの3回です!
すぐに作成し、使用することが可能です。


1)AWS マネジメントコンソールから Amazon SQSを選択します。


2)「Create New Queue」からキューを新規に作成します。

3) 「Queue Name」を入力して「Create Queue」で作成完了です。


※今回は東京リージョンで作成します。リージョンはAWS マネジメントコンソールの右上ののリストから変更可能です。

  設定値は「Queue name」以外すべてデフォルト値を設定しています。



Queue Settings :キューの設定

Default Visibility Timeout 他のクライアントから重複して取得されないようにするための期間を設定します。
Message Retention Period メッセージの保存期間を設定します。
Maximam Message Size メッセージの最大サイズを設定します。
Delivery Delay キューに入ったメッセージを取得されるようなるまでの期間を設定します。
Receive Message Wait Time キューからメッセージの取得期間(ロングポーリング)の設定します。


Dead Letter Queue Settings:Dead Letter Queueの設定

 ※Dead Letter Queueとは、何らかの理由で正常に処理できなかったメッセージを
  原因調査などの目的のためDead Letter Queueに送ります。
  Dead Letter Queue用にキューを新たに作成する必要があります。


Use Redrive Policy Dead Letter Queueを使用するかを設定します。
Dead Letter Queue Dead Letter Queue用のキューの名前を設定します。
Maximum Receives メッセージの最大受信数を設定します。

作成したらさきほどの一覧画面で確認してみます。
作成したメッセージキューができていますね!
※AmazonのIAMポリシーやAmazon SQS ポリシーの設定が必要になります。
 本ブログでは省略しますが次のサイトをご参照ください。
・Serverworksさんの IAMの使い方

②SalesforceからAmazon SQSへメッセージを送信

次にSalesforce(Apex)からAmazon SQSにメッセージを送信する方法を紹介します。

Amazon SQSへメッセージを送信するためには
AWS コマンドラインインターフェイス(CLI) AWS SDK
Webサービス HTTP で行なう方法があります。
詳細はAPIリファレンスをご参照ください。

今回はApexからHTTPでSQSにメッセージを送信する方法を紹介します。

以前弊社のTerraSky TECH ブログの戸塚の記事で Amazon DynamoDBのAPIをApexから叩いている記事があり、Amazonの別のサービスにも流用できる実装となってますので
今回はその実装をAmazon SQS用に変更して使用したいと思います。

実行する際に必要で且つつまずきやすいAWS 署名バージョン 4(Signature Version 4 Signing Process)なども
上記の記事でわかりやすく解説していますのでそちらをご参考ください。

Amazon SQS用に変更したSampleの実装をパッケージとしてアップロードしてます。
認証情報や実際にリクエストを送信している部分は継承している[AWSClient]でおこなってますので
今回は割愛させて頂きます。パッケージの中身をご確認ください。

その中のひとつのクラス[AwsSqsClient]を解説します。
メッセージをHTTPリクエストを送信する際に必要な情報を設定しています。

そしてsendMessageメソッドにてメッセージを送信します。
実行する際にはこのメソッドを呼び出します。

public virtual without sharing class AwsSqsClient extends AWSClient {

    public AwsSqsClient() {
        this.aas = new AWSAccessSettings();
        this.aas.accessKeyId = 'XXXXXXXXXXXX';//アクセスキー
        this.aas.secretAccessKey = 'YYYYYYYYYYYY';//シークレットアクセスキー

        this.aas.region = 'ap-northeast-1'; //キューのエンドポイント
        this.aas.endPath = '/123456789/message-queue';//キューのパスを

        this.aas.serviceName = 'sqs';//サービス名
        this.aas.apiVersion = '2012-11-05';//APIバージョン
        this.aas.method = 'GET';//HTTP メソッド 今回はGETで行ないます。
    }

    public AWSAccessResult sendMessage(String message) {
        //2バイトのメッセージにも対応するためURLエンコードを行ないます。
        String encodeMessage = EncodingUtil.urlEncode(message,'UTF-8').replace('+', '%20').replace('*', '%2A').replace('%7E','~');
        //メッセージ送信のため'SendMessage'と指定します。
        return this.send(this.createHttpRequest(encodeMessage,'SendMessage'));
    }

}
SalesforceからAWSにコールアウトしますのでAWSのエンドポイントをSalesforceに登録します。

登録をしないと次のような エラーが発生します。
----------------
System.CalloutException: Unauthorized endpoint, please check Setup->Security->Remote site settings.
endpoint = https://sqs.ap-northeast-1.amazonaws.com/*******/message-queue?AWSAccessKeyId= ******* &Action=SendMessage&MessageBody=YOUR-message&SignatureMethod=HmacSHA256&SignatureVersion=4&Version=2012-11-05
----------------


設定方法は[ユーザ名]→[設定]で設定メニューを開いて[管理]→[セキュリティのコントロール]→[ リモートサイトの設定]の[新規リモートサイト]から登録します。

登録するエンドポイントURLはAmazon SQSのキュー詳細ページにから確認できます。

また AWSのエンドポイント一覧ページもご参考ください。

次は
作成したApexクラスを実行してみましょう。
好きなメッセージを送信してください。

String message = 'Salesforceからのメッセージです!';
AwsSqsClient sqsclient = new AwsSqsClient();
sqsclient.SendMessage(message);
ログにてHTTPのレスポンスが正常に返っていればリクエストは成功です。

実際にAmazon SQSのキューにメッセージが送信されているか確認してみましょう。
キューを選択後[Queue Actions]→[View/Delete Messages]の「Start Polling for Message」を実行します。

送信したメッセージがありますね!


③SkyOnDemandでSalesforceからSQSに送信されたメッセージを取得

いよいよSkyOnDemandでAmazon SQSアダプタを使用してメッセージを取得します。


1)Amazon SQSへ接続するためのグローバルリソースを作成します。





グローバルリソースの設定

Access Key ID アクセスキーを設定します。
Secret Access Key シークレットアクセスキーを設定します。
リージョン リージョンを設定します。
接続タイムアウト(秒) 接続時のタイムアウトを設定します。
ソケットタイムアウト(秒) 接続時のソケットタイムアウトを設定します。

2)AmazonSQS のメッセージを受信するスクリプトを作成

ツールパレットからAmazon SQSアダプタを選択します。

1 メッセージ受信 キューのメッセージを受信します。
2 メッセージ送信 キューにメッセージを送信します。
3 メッセージ削除 キューに入っているメッセージをメッセージIDをキーに削除します。


SQS メッセージ受信 アダプタの設定

タブ[必須設定]

接続先 Amazon SQSのグローバルリソースを選択します。
キュー名 メッセージを受信するキュー名を設定します。

タブ[オプション]

受信メッセージの最大数
一度に受信するメッセージを設定します。
※未入力の場合はキューの設定に準じます。
受信メッセージの可視タイムアウト
他のクライアント から重複して取得されないようにするための
期間を設定します。
※未入力の場合はキューの設定に準じます。

変数代入アイコンの設定

SQS メッセージ受信の[message_body]を変数にマッピングします。

実行!!


結果のログをみてみましょう。

取得したメッセージは削除しないとまた取得されるてしまうので、削除したい場合は 「メッセージ削除」アイコンで受信後に削除してください。


主な注意点

SQSの仕組みとして同じメッセージを2回以上受信する場合があるのでメッセージにユニークキーや日時情報などを含めて重複してもよい作りにしてください。

メッセージを受信する順序は保証されていません。

メッセージの最大サイズは256KBなので大きなメッセージ送受信に向いてません。


まとめ

Amazon SQSアダプタを使って簡単にメッセージを取得できましたね!
今回はSalesforceから直接メッセージを実行しましたが、
例えば取引先にカスタムボタンを作成し、そのボタンを押すと取引先の住所がSQSにメッセージ送信され、SkyOnDemandでそのメッセージからピザ屋に注文されて
ピザが取引先に・・・
そんな使い方はしないですねー(笑)
取引先のボタンを押すとSkyOnDemandで取引先の情報をレポーティングしてExcelファイルをメールにて知らせてくれるシステムが構築できます。

蛇足になりますがForce.comの開発はMavensMateがおすすめです!ご存知の方も多いと存じますが、非常に軽いForce.com IDEです。
次回の記事もご期待ください!!

1 件

関連する記事