web-dev-qa-db-ja.com

Google Cloud SchedulerからのHTTPリクエストを確認する

Google CloudスケジューラからのHTTPリクエストを確認するプロセスは何ですか?ドキュメント( https://cloud.google.com/scheduler/docs/creating )では、公開されている任意のHTTPエンドポイントのターゲットを使用してジョブを作成できると記載されていますが、サーバーがcron/schedulerリクエスト。

6
jrmerz

リクエストを自分で確認する必要があります。

Google Cloud Schedulerには、User-Agent: Google-Cloud-SchedulerなどのGoogle固有のヘッダーがいくつか含まれています。以下のドキュメントリンクを参照してください。

ただし、誰でもHTTPヘッダーを偽造することができます。検証方法がわかっているHTTPヘッダーまたはHTTP本文に含めるカスタムsomethingを作成する必要があります。署名付きのJWTを使用すると、安全で簡単に作成および検証できます。

Google Cloud Schedulerジョブを作成すると、headersおよびbodyフィールドをある程度制御できます。どちらにもカスタムsomethingを埋め込むことができます。

スケジューラジョブ

[更新]

以下は、gcloudを使用してHTTPヘッダーと本文を設定できる例(Windowsコマンドライン)です。この例では、APIKEYを含める方法を示す各トリガーでCloud Functionsを呼び出します。 Googleコンソールはまだこのレベルのサポートを提供していません。

gcloud beta scheduler ^
--project production ^
jobs create http myfunction ^
--time-zone "America/Los_Angeles" ^
--schedule="0 0 * * 0" ^
--uri="https://us-central1-production.cloudfunctions.net/myfunction" ^
--description="Job Description" ^
--headers="{ \"Authorization\": \"APIKEY=AUTHKEY\", \"Content-Type\": \"application/json\" }" ^
--http-method="POST" ^
--message-body="{\"to\":\"/topics/allDevices\",\"priority\":\"low\",\"data\":{\"success\":\"ok\"}}"
3
John Hanley

短い答え

Google Cloudでアプリをホストする場合は、ヘッダーX-Appengine-Queuename__schedulerと等しいかどうかを確認してください。ただし、これは文書化されていない動作です。詳細については、以下を参照してください。

さらに、Pub/Subは内部的に送信されるため(暗黙的に検証されたOriginであるため)、可能であればHTTPリクエストの代わりにPub/Subを使用します。


実験

私が見つけたように here 、Googleは特定のヘッダーのリクエストを取り除きます1、 すべてではありません2。 Cloud Schedulerにそのようなヘッダーがあるかどうかを確認しましょう。

1 例えば。 X-Google-*ヘッダーを送信することはできません(実験的に見つかりましたが、 これに関する情報はここにあります

2 例えば。 X-Appengine-*ヘッダーを送信できます(実験的に見つかりました)

実験で使用したフラスコアプリ:

@app.route('/echo_headers')
def echo_headers():
    headers = {h[0]: h[1] for h in request.headers}
    print(headers)
    return jsonify(headers)

Cloud Schedulerによって送信されたリクエストヘッダー

{
  "Host": []
  "X-Forwarded-For": "0.1.0.2, 169.254.1.1",
  "X-Forwarded-Proto": "http",
  "User-Agent": "AppEngine-Google; (+http://code.google.com/appengine)",
  "X-Appengine-Queuename": "__scheduler",
  "X-Appengine-Taskname": [private]
  "X-Appengine-Taskretrycount": "1",
  "X-Appengine-Taskexecutioncount": "0",
  "X-Appengine-Tasketa": [private]
  "X-Appengine-Taskpreviousresponse": "0",
  "X-Appengine-Taskretryreason": "",
  "X-Appengine-Country": "ZZ",
  "X-Cloud-Trace-Context": [private]
  "X-Appengine-Https": "off",
  "X-Appengine-User-Ip": [private]
  "X-Appengine-Api-Ticket": [private]
  "X-Appengine-Request-Log-Id": [private]
  "X-Appengine-Default-Version-Hostname": [private]
}

ヘッダーX-Appengine-QueuenameがGAEによって削除されていることの証明

enter image description here

制限事項

この方法は文書化されていないため、Google SLAおよび減価償却ポリシーではサポートされていない可能性があります。また、リクエストソースがGoogle Cloud内にある場合にヘッダーが偽造できないかどうかはわかりません(たぶん、それらは外側のレイヤーで削除されます)。私はGAEのアプリでテストしましたが、他の導入オプションでは結果が異なる場合があります。つまり、自己責任で使用してください。

0
Prometheus