Google CloudスケジューラからのHTTPリクエストを確認するプロセスは何ですか?ドキュメント( https://cloud.google.com/scheduler/docs/creating )では、公開されている任意のHTTPエンドポイントのターゲットを使用してジョブを作成できると記載されていますが、サーバーがcron/schedulerリクエスト。
リクエストを自分で確認する必要があります。
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\"}}"
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)
{
"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によって削除されていることの証明この方法は文書化されていないため、Google SLAおよび減価償却ポリシーではサポートされていない可能性があります。また、リクエストソースがGoogle Cloud内にある場合にヘッダーが偽造できないかどうかはわかりません(たぶん、それらは外側のレイヤーで削除されます)。私はGAEのアプリでテストしましたが、他の導入オプションでは結果が異なる場合があります。つまり、自己責任で使用してください。