HTTPタスクの作成
プランの実行中に、HTTPリクエストをサードパーティのアプリケーションエンドポイントに送信するタスクを作成できます。たとえば、先行するタスクが正常に実行された場合、そのタスクからの情報を含むHTTPメッセージを指定されたエンドポイントに送信できます。
HTTPタスク とは、 Alteryx Analytics Cloud (AAC)と別のアプリケーションの間のリクエストです。このリクエストはHTTPを使用して配信され、受信側のアプリケーションが解釈して処理を実行します。
注記
受信側のアプリケーションでは、プラットフォームのホストとポート番号またはIPアドレスをホワイトリストに登録することが必要な場合があります。アプリケーションのドキュメントを参照してください。
HTTPタスクは、プランで使用できるタスクタイプの1つです。詳細については、 Planビューページ を参照してください。
制限事項
カスタムセキュリティ証明書は使用できません。
HTTPベースのリクエストには、30秒のタイムアウト制限があります。
必要条件
受信側のアプリケーションの要件
HTTPリクエストをターゲットアプリケーションに送信するためには、リクエストを受信するようにそのアプリケーションを設定する必要があります。
アプリケーションドメイン外からのリクエストを有効にする必要があります。
注記
受信側のアプリケーションでは、プラットフォームのホストとポート番号またはIPアドレスをホワイトリストに登録することが必要な場合があります。アプリケーションのドキュメントを参照してください。
HTTPリクエストを送信する先のエンドポイントのURLを取得する必要があります。
各HTTPリクエストに挿入すべきHTTPヘッダーを取得する必要があります。
リクエストに署名する必要がある場合は、追加の設定が必要です。詳細は以下の通りです。
タスクの作成
HTTPタスクを左ペインからプランキャンバスにドラッグアンドドロップします。
右側のパネルで、 HTTPタスク を選択します。HTTPタスクパネルが表示されます。
タスクの設定
必要なパラメーターを設定します。詳細については、 HTTPタスクのPlanビュー を参照してください。
リクエストのヘッダー値とリクエスト本文で、プランのメタデータ情報を指定できます。詳細については、 Planメタデータの参照 を参照してください。
接続をテストするには、[ テスト ]をクリックします。成功メッセージが表示されます。
ヒント
ステータスコード
200
は、テストが成功したことを示します。ヒント
GETメソッドをテスト目的で使用できます。GETリクエストは、ターゲットプラットフォーム上のデータを変更しませんが、リクエスト本文内の要素を指定できる場合があります。
タスクを追加するには、[ 保存 ]をクリックします。
タスク名の変更
タスクの名前を変更するには、右側のパネルで [More]メニュー > [編集] をクリックします。
ヒント
適切な命名としては、ターゲットプラットフォームのエンドポイントとメソッド、およびプランでのタスクの目的を含めることができます。
タスクを削除する
タスクを削除するには、 [More]メニュー > [削除] をクリックします。タスクの削除を確認します。
警告
この手順を元に戻すことはできません。
Planメタデータの参照
他のタスクのメッセージ内で、プラン、そのタスク、およびその実行に関するメタデータを参照できます。詳細については、 Planメタデータの参照 を参照してください。
例
Slackチャンネルメッセージ
ヒント
Slackタスクが製品機能としてサポートされました。詳細については、 Slackタスクの作成 を参照してください。
HTTPタスクを作成して、選択したSlackチャンネルにテキストメッセージを配信できます。
HTTPメッセージを受信するようにSlackのインストールを以下のように設定します。
必要に応じて、メッセージを受信するSlackチャンネルを作成します。
アプリを作成します。
アプリの受信HTTPメッセージを有効にします。
受信メッセージを受け付けるチャンネルを指定します。
cURLステートメントから受信HTTPリクエストのURLをコピーします。
パラメーター | 説明 |
---|---|
名前 | この名前は AACにのみ表示されます。 |
メソッド |
|
URL | SlackからコピーしたURLを貼り付けます。 |
ヘッダー | SlackのcURLコマンドからコンテンツヘッダーをコピーします。 key: Content-Type value: application/json |
本文 | {"text":"Your job has completed."} |
[ テスト ]をクリックして、このタスクが機能することを確認します。
ジョブを実行し、Slackチャンネルでメッセージを確認します。
プランメタデータの例
プラン定義および現在のプラン実行から、HTTPタスクのリクエストの一部としてメタデータ情報を参照できます。
注:
HTTPタスクの開始前にプラン実行ですでに発生しているタスクについてのみ、メタデータ参照を挿入できます。
現在実行中の各タスクは、2文字のコードを使用して参照されます。例:
{{$http_xx.name}}
Planメタデータの参照は、次の構文を使用して構成されます。適切なテキストボックスに、次のいずれかの値を入力します。
ヒント
まず、「
$
」と入力します。これにより、各メタデータ参照タイプのメタデータ参照のメニューツリーにアクセスできます。最終的な構文は上で説明したとおりです。
プラン:
プラン定義または現在のプラン実行からのメタデータ情報は、次のようになります。
{{$plan
次のリクエスト本文には、プラン名、プラン実行識別子、実行されたフローへの参照が含まれています。
{"text":"Plan: {{$plan.name}} RunId: {{$plan.runId}} Flow: {{$flow_7p.name}} Success."}
次のリクエスト本文には、タイムスタンプを使用したプラン実行情報が含まれています。
{"text":"Plan: {{$plan.name}} RunId: {{$plan.runId}} - plan start: {{$plan.startTime}} Running time: {{$plan.duration}} Times: - last task start: {{$flow_7p.startTime}} - last task end: {{$flow_7p.endTime}} "}
すでに発生しているHTTPタスクの情報を参照できます。
{"text":"{{$http_qg.name}} returned {{$http_qg.statusCode}}."}
詳細については、 プランメタデータの参照 を参照してください。
メタデータ入力のクラウド機能へのフィード
この例では、HTTPタスクを使用してプランメタデータをAWS Lambda関数に配信する方法を示します。Google Cloud Functionsでも同様のアプローチを使用できます。
この場合、フロータスク実行からの
rowCount
値が、HTTPタスクを介してAWS Lambda関数に配信されます。
一般的な手順:
プランを定義します。
フロータスク: フローを実行して、Lambda関数に必要な出力を生成します。
HTTPタスク: rowCountメタデータ変数への参照を本文に含むHTTPリクエストを生成します。リクエスト本文:
{ "rowCount": "{{$flow_7p['My Flow Name'].output['My output name'].rowCount}}" }
AWS Lambda関数: 以下はLambdaの擬似コードです。
import json def lambda_handler(event, context): httpTaskBody = json.loads(event["body"]) rowCount = httpTaskBody["rowCount"] return { 'statusCode': 200, 'body': json.dumps(rowCount) }
Google Cloud Functions: 以下はGoogle Cloud Functionsの擬似コードです。
def get_row_count(request): request_json = request.get_json() if request_json and 'rowCount' in request_json: rowCount = request_json['rowCount'] return rowCount return 'No rowCount attribute provided'
署名の検証
警告
ターゲットアプリケーションによっては、署名検証の実装に開発者のスキルが必要になる場合があります。
必要に応じて、HTTPリクエストに署名するようにプラットフォームを設定できます。リクエストの署名により、リクエストが第三者ではなくプラットフォームから送信されていることが保証されます。
以下では、署名がどのように作成されるかを確認できます。これにより、受信側アプリケーションが署名と関連リクエストを適切に処理するように設定できます。
署名ヘッダー
HTTPリクエストは、
X-Webhook-Signature
ヘッダーをリクエストに挿入することによって署名されています。この署名の形式は次のとおりです。
X-Webhook-Signature: t=<timestamp>,sha256=<signature>
各名前について:
<timestamp>
- 署名が送信されたときのタイムスタンプ。値はUNIX時間です。<signature>
- SHA256署名。プラットフォームは、SHA-256を使用したハッシュベースのメッセージ認証コード(HMAC)を使用してこの署名を生成します。
これらの値の詳細については、以下を参照してください。
例:
X-Webhook-Signature: t=1568818215724,sha256=55fa71b2e391cd3ccba8413fb51ad16984a38edb3cccfe81f381c4b8197ee07a
アプリケーションツールの確認
アプリケーションによっては、タスク署名を検証するために、次のタスクセットのいずれかを完了する必要があります。
注記
アプリケーションでプラットフォームをホワイトリストに登録することが必要な場合があります。詳細については、アプリケーションのドキュメントを参照してください。
アプリケーション用にカスタムコーディングの作成が必要な場合があります。以下では、JavaScriptの例を含め、その方法の詳細を確認できます。
署名付きリクエストの処理
タイムスタンプ値(
t=<timestamp>
)は、リプレイアタックを防ぐためにヘッダー値の先頭に置かれます。リプレイアタックとは、攻撃者が有効なペイロードとその署名を傍受して再送信するものです。
このような攻撃を回避するために、タイムスタンプが署名ヘッダーに含まれるとともに、署名付きペイロードの一部として埋め込まれます。
タイムスタンプは署名付きペイロードの一部であるため、攻撃者は署名を有効に保ったままでタイムスタンプの値を変更することはできません。
署名が有効でもタイムスタンプが古すぎる場合は、要求を拒否できます。
たとえば、1時間前の日付に対応するタイムスタンプを持つリクエストを受け取った場合は、リクエストを拒否するべきでしょう。
リプレイアタックの詳細については、 https://en.wikipedia.org/wiki/Replay_attack を参照してください。
タスク署名には、ハッシュ値の一部として次が含まれます。
秘密キー(上記で入力)
タイムスタンプ値
リクエストデータ:
(POST/PUT/PATCH) - リクエストの本文
(GET/DELETE) - リクエストのURL
X-Webhook-Signature
ヘッダーを次のように分割します。
区切り文字に「,」を使用して値を分割します。
各部分を「=」文字を使用して分割します。
タイムスタンプと署名の値を抽出します。上記の例では次のようになります。
タイムスタンプ:
1568818215724
署名:
55fa71b2e391cd3ccba8413fb51ad16984a38edb3cccfe81f381c4b8197ee07a
受信側アプリケーションでは、署名を再計算することによって、リクエストがプラットフォームから送信されたことを確認できます。
タイムスタンプ、ドット文字「 . 」、 リクエストの本文(POST/PUT/PATCHメソッド)またはURL (GET/DELETEメソッド)を連結します。
上記の例が
POST
リクエストの署名で、リクエスト本文が「test
」であるとします。連結された値は次のようになります。1568818215724.test
これで、受信アプリケーションでHMAC認証コードを計算できます。次のJavaScriptの例では、シークレットキーの値は
mySecret
です。const crypto = require('crypto'); const message = '1568818215724.test'; // as defined above const hmac = crypto.createHmac('sha256', 'mySecret'); hmac.update(message) const expectedSignature = hmac.digest('hex');
コードから返った値と、
X-Webhook-Signature
ヘッダーに署名として含まれている値を次のように比較します。
値が一致しない場合は、リクエストを拒否します。
値が一致する場合は、現在のタイムスタンプとヘッダー内のタイムスタンプの差を計算します。その差が許可されている限度を超えている場合は、リクエストを却下します。
限度内であれば、アプリケーション内で通常どおりにリクエストを処理します。