この記事は「NEXTSCAPE Advent Calendar 2020」15日目の記事です。
みなさま、クリスマスの定番「シュトーレン」を食べたことはありますか?あの白い粉をうまくこぼさずに攻略する方法があれば、そちらを記事にしたい今日このごろです。
現在、ServiceBus キューを拾ってLogicAppsから別システムのSQL Databaseへデータを連携する機能を開発しています。
テスト用にとPostmanからREST APIをたたいてキューにメッセージを追加しようとしたところ、SAS Tokenの付与で意外とハマってしまいました。
その辺のまとめとして、今回はAzure ServiceBus キューにREST APIでメッセージを追加する方法をご紹介したいと思います。
この記事でわかること
- Postmanを利用したAzure ServiceBusキューのSAS Tokenを生成する方法
- Postmanを利用したAzure ServiceBusキュー RestApiへのメッセージ送信方法
前提条件
- ServiceBusについては事前に作成が行われている前提となり、本稿ではキューの作成から記載しています。
- APIリクエストにはPostmanを利用しています。
ServiceBusの設定
キューを作成する
1. ServiceBusへメッセージ送信のためにキューを作成します。
2. 次に作成したキューを選択し、共有アクセスポリシーを追加します。
"send"という名称で送信のみチェックを入れて追加しました。
3. 共有アクセスポリシーを追加すると、キーが発行されます。
これでServiceBus キュー側の準備は完了しました。
SAS Tokenの詳細
送信するSAS Tokenのフォーマットとパラメータは以下となります。
このトークンを生成して、REST APIを呼び出すときにPOSTリクエストのAuthorizationヘッダへ付与します。
SharedAccessSignature sig=<signature-string>&se=<expiry>&skn=<keyName>&sr=<URL-encoded-resourceURI>
パラメータ名 | 詳細 |
---|---|
se | トークンの有効期限。 エポック 1970 年 1 月 1 日 00:00:00 UTC (UNIX エポック) からトークンの期限が切れるまでの秒数を示す整数。 |
skn | 承認規則の名前。 |
sr | アクセスされているリソースの URI。 |
sig | 署名 |
Postmanの設定
PostmanでServiceBusキューへのPOSTリクエストを作成する
Pre-request Scriptを利用してSAS Tokenを生成する
Pre-request ScriptにはJavaScriptを記載することができるので、けっこういろいろなことが出来ます。
では設定方法を確認していきましょう。
1. Pre-request Scriptを開き、SAS Token生成用のコードを入力します。
以下がコードとなります。resourceUri, keyName, keyにはさきほど作成した環境の値をセットしてください。
生成したSAS Tokenは、Postmanの環境変数内に'SASToken'のキー名で追加しました。
// ServiceBusキューのUri
var resourceUri = 'https://********.servicebus.windows.net/sample/';
// 共有アクセスポリシーのポリシー名
var keyName = 'send';
// 共有アクセスポリシーの主キー
var key = '******************************';
// 有効期限の生成
var now = new Date();
var week = 60 * 60 * 24 * 7;
var ttl = Math.round(now.getTime() / 1000) + week;
// signatureの生成
var encodedUri = encodeURIComponent(resourceUri)
var signature = encodedUri + '\n' + ttl;
var sigByte = CryptoJS.HmacSHA256(signature, key);
var sigBase64 = CryptoJS.enc.Base64.stringify(sigByte);
// SAS Tokenの生成
pm.globals.set('SASToken', 'SharedAccessSignature sr=' + encodedUri + '&sig=' + encodeURIComponent(sigBase64) + '&se=' + ttl + '&skn=' + keyName);
2. Headersにパラメータを追加します。
KeyとValueに以下のパラメータを追加します。
{{SASToken}}は、Pre-request Scriptで追加したPostmanの環境変数内にあるSASTokenを取得します。
KEY | VALUE |
---|---|
Authorization | {{SASToken}} |
Content-Type | application/json |
SASトークンを利用したREST APIによるメッセージ送信
送信するメッセージの作成
Bodyを開き、rawを選択してJSON文字列を記載します。
メッセージの送信
Sendボタンをクリックして、ServiceBusキューにメッセージを送信します。
SAS Tokenの生成がうまくいけば、以下のように201 Createdが返ってきます。
キューを確認する
送信したメッセージがキューに送信されていることを確認します。
受信でメッセージを開くとキューから削除されてしまいますので、念のためピークで開きます。
Azureポータルからメッセージを送信したServiceBusを選択し、Service Bus Explorer --> ピークを開きます。
先ほど送信したメッセージが格納されているようです。
ピークをクリックしてメッセージを確認すると、先ほどPOSTで送信したメッセージが表示されました。
参考情報
まとめ
実はこの記事、一度はC#のコンソールアプリでSAS Tokenの発行をするという内容で書き終えました(汗)
ですが、ふと思いついてPre-request Scriptを利用したらPostmanだけで完結できてしまったので、修正して現在の記事となっています。
普段の開発ではSDK経由でキューへメッセージ送信を行うため、あまりREST API経由でメッセージを投げる機会は無いかもしれません。
お役にたつか微妙な記事となってしまいましたが、Postmanでお手軽にテストを行いたい時などにご参考頂ければ幸いです。
余談ですが、現在取り組んでいる機能開発はDynamics365-->ServiceBusキュー-->LogicApps-->SQL Databaseといった流れでデータを連携します。
次回があれば、その辺のお話をご紹介したいなと思っています。
では。