IBM Cloud Docs
エッジ機能の操作

エッジ機能の操作

IBM Cloud® Internet Services のエッジ機能を使用すると、インフラストラクチャーの構成や保守を行うことなく、サーバーレス実行環境を使用してアプリケーションを作成したり既存のアプリケーションを変更したりできます。 エッジ機能を定義してクラウド・エッジにアップロードし、発信元に到達する前に要求を処理することができます。 CIS エッジ機能を使用して、HTTP 要求と応答の変更、並列要求の実行、またはクラウド・エッジからの応答の生成を行うことができます。

エッジ機能の働き方

エッジ機能は定義済みのドメインに基づいてアクションを URI と関連付けます。 この関連付けは、 _トリガー_と呼ばれます。 自分のサイトへの着信要求は、クラウドのエッジでインターセプトされ、自分のアカウントまたはドメイン内のトリガーと突き合わされます。 要求の URL がトリガーの URI と一致している場合は、そのトリガーに関連付けられているアクションが実行されます。

エッジ機能は、最新のウェブブラウザで利用可能な サービスワーカーAPIをモデルとしており、可能な限り同じAPIを使用します。

Service Worker API を使用すると、自分のサイトに対する要求をインターセプトできます。 JavaScript で要求を処理した後、自分のサイトや他のサイトに任意の数の 2 次要求を実行してから、最終的に応答を訪問者に返すこともできます。

エッジ機能は、標準的なサービス・ワーカーとは異なり、ユーザーのブラウザーではなく CIS のエッジ・サーバーで実行されます。 つまり、悪意のあるクライアントによって回避されることのない信頼された環境で、コードが実行されることを信頼できるということです。 また、サービス・ワーカーをサポートするモダン・ブラウザーをユーザーが使用する必要もなくなります。ブラウザーでない API クライアントからの要求でさえインターセプトできます。

内部的には、エッジ機能は、Chrome ブラウザーで使用されているのと同じ V8 JavaScript エンジンを使用して、インフラストラクチャーでワーカーを実行します。 V8 は JavaScript コードを動的にコンパイルして超高速のマシン・コードを生成するので、パフォーマンスが高くなります。 コードをマイクロ秒単位で実行できるようになり、エッジ・サーバーで 1 秒あたり数千のスクリプトを実行できるようになります。

エッジ機能は V8を使用しますが、 Node.jsは使用しません。 ワーカー内で使用可能な JavaScript API は、IBM によって直接実装されます。 直接 V8 と連動すると、コードの実行効率が上がり、顧客とインフラストラクチャーを安全に保つのに必要なセキュリティー管理が備えられます。

エッジ機能の要求プロパティーの操作

ここでは、CIS のエッジ機能用の Cloudflare のランタイム API について説明します。 エッジ機能ランタイムは、クラウドのエッジで実行されるスクリプトで使用できるように、以下の Cloudflare API を備えています。

コンストラクターの構文

new Request(input [, init])

コンストラクターのパラメーター

  • input: URL が入った USVString、または既存の Request オブジェクトのいずれかにすることができます。 url プロパティーは変更不可能であるため、要求を変更して URL を変更するには、新しい URL をこのパラメーターで渡す必要があることに注意してください。

  • init (オプション): 要求に適用するカスタム設定が入ったオプションのオブジェクト。 有効なオプション:

    • method: GETPOST などの要求メソッド
    • headers: Headers オブジェクト
      • body: 要求に追加するテキスト。 GET または HEAD の方法でリクエストを行う場合、本文を指定することはできません。

      • redirect: 要求をフェッチするときに使用するモード。 イベント・ハンドラーからの着信 fetchEvent によって生成される要求のデフォルトは、manual です。 新規に構成される要求 (つまり、new Request (url)) のデフォルトは、follow です。 有効なオプションは次のとおりです。

        • follow: リダイレクト応答がフェッチに返された場合は、その応答の Location ヘッダーに基づいてもう一度フェッチが実行されます。リダイレクト以外のコードが返されるまで、この処理が繰り返されます。 例えば、await fetch(..)301 リダイレクトが返されることは決してありません。
        • manual: フェッチから返された応答をリダイレクトします。

プロパティー

着信した Request オブジェクト (event.request) のすべてのプロパティーは、読み取り専用です。 要求を変更するには、Request オブジェクトを作成し、変更するオプションをそのコンストラクターを渡す必要があります。

  • body: コンテンツの ReadableStream を公開する単純な getter。
  • bodyUsed: 応答内で body が使用されたかどうかを宣言するブール値。
  • cf: Cloudflare で IBM のパートナーから提供されたデータが入ったオブジェクト。
  • headers: 要求に関連付けられている Headers オブジェクトが入ります。
  • method: 要求に関連付けられている要求メソッド (GETPOST など)。
  • redirect: 使用するリダイレクト・モード (follow または manual)。
  • url: 要求の URL が入ります。

cf オブジェクト

標準的な Request オブジェクトのプロパティーに加えて、request.cf オブジェクトを使用すると、機能の適用方法や、Cloudflare から提供されるその他のカスタム情報を制御できます。 以下に例を示します。

  if (request.cf.asn == 64512) {
    return new Response('Block the ASN 64512 response')
  }

https://cloudflareworkers.com スクリプトの作成やテストに request.cf を使用している場合、プレビューモードでは のコンテンツは表示されません。 このコンテンツを実行するには、実稼働環境でなければなりません。

これらのプロパティーには、アプリのロジックに利用できる、着信要求に関する特別な情報が入っています。 すべてプランで以下の情報を取得できます。

  • asn: 着信要求の ASN (例: 395747)。
  • colo: 要求がヒットしたデータ・センターの 3 文字の空港コード (例: "DFW")。
  • weight: ブラウザーから要求された HTTP/2 の優先度の重み。
  • exclusive: ブラウザーから要求された HTTP/2 の排他フラグ (Chromium ベースのブラウザーの場合は 1、その他の場合は 0)。
  • group: 要求グループの HTTP/2 のストリーム ID (Firefox の場合はゼロ以外のみ)。
  • group-weight: 要求グループの HTTP/2 の重み (Firefox の場合はゼロ以外のみ)。
  • tlsCipher: CIS への接続のための暗号 (例: "AEAD-AES128-GCM-SHA256")。
  • country: 着信要求の 2 文字の国別コード。 CF-IPCountry ヘッダーにも同じ値が設定されます (例: "US")。
  • tlsClientAuth: mTLS に対応している場合にのみ設定されます。 このオブジェクトには次のプロパティーがあります: certIssuerDNLegacycertIssuerDNcertIssuerDNRFC2253certSubjectDNLegacycertVerifiedcertNotAftercertSubjectDNcertFingerprintSHA1certNotBeforecertSerialcertPresentedcertSubjectDNRFC2253
  • tlsVersion: CIS への接続の TLS バージョン (例: TLSv1.3)。

標準プランとエンタープライズ・プランでは、以下の情報を取得できます。

  • requestPriority: 要求オブジェクトに入っていた、ブラウザーから要求された優先度の情報 (例: “weight=192;exclusive=0;group=3;group-weight=127”)。
  • city: 着信要求の市区町村 (例: "Austin")。
  • continent: 着信要求の大陸 (例: "NA")。
  • httpProtocol: HTTP プロトコル (例: "HTTP/2")。
  • latitude: 着信要求の緯度 (例: "30.27130")。
  • longitude: 着信要求の経度 (例: "-97.74260")。
  • postalCode: 着信要求の郵便番号 (例: "78701")。
  • region: 既知の場合、受信リクエストのIPアドレスに関連する第一レベル地域の ISO 3166-2名。 認識されない場合は、空の文字列になります (例: "Texas")。
  • regionCode: 判明している場合は、受信リクエストのIPアドレスに関連する第一レベル地域の ISO 3166-2コード。 認識されない場合は、空の文字列になります (例: "TX")。
  • timezone: 着信要求のタイム・ゾーン (例: "America/Chicago")。

どのプランでも、アウトバウンド要求で以下の機能を設定できます。

  • cacheEverything: このオプションは、応答のヘッダーが何であろうと、この要求の応答をキャッシュに入れることを CIS に強制します。 これは、「キャッシュ・レベル」というページ・ルールを「すべてをキャッシュ」に設定する操作に相当します (例: true)。

  • scrapeShield: ScrapeShield を切り替えます (例: false)。

  • polish: Cloudflare の Polish モードを設定します。 設定可能な値は、「lossy」、「lossless」、「off」です (例: lossless)。

  • minify: さまざまなファイル・タイプに対して Cloudflare の Autominify を有効/無効に設定する Web サイト最適化。 この値は、javascriptcss、および html についてのブール値フィールドが入ったオブジェクトです (例: { javascript: true, css: true, html: false })。

  • mirage: Cloudflare の Mirage を有効/無効に設定するイメージ最適化。 このオプションを指定する場合は、値を必ず false にする必要があります (例: false)。

  • cacheTtl: このオプションは、応答のヘッダーが何であろうと、この要求の応答をキャッシュに入れることを CIS に強制します。 これは、「エッジ・キャッシュ TTL」および「キャッシュ・レベル」という 2 つのページ・ルールを設定する操作に相当します (「すべてをキャッシュ」と「300」など)。

  • resolveOverride: 要求を別の起点サーバーにリダイレクトします。 これを使用すると、複数の起点に負荷を分散させることができます (例: us-east.example.com)。

    セキュリティー上の理由から、resolveOverride に設定するホスト名は、着信要求と同じ CIS ゾーンでプロキシーする必要があります。 そうしないと、この設定は無視されます。 CNAME ホストを使用できるので、別のドメインまたは DNS 専用ドメインのホストに解決するには、まず、所有するゾーンの DNS で、外部ホスト名にマッピングされる CNAME レコードを宣言し、CIS でプロキシーを設定してから、その CNAME レコードを指すように resolveOverride を設定してください。

エンタープライズのみ

  • cacheKey: 要求のキャッシュ・キーとは、キャッシングのために 2 つの要求が「同じ」であるかどうかを判別するものです。 要求のキャッシュ・キーが過去の要求と同じであれば、どちらにも、キャッシュされた同じ応答を提供できます (例: 'some-key')。
  • cacheTtlByStatus: このオプションは、cacheTtl 機能のバージョンの 1 つであり、応答の状況コードに基づいて TTL を選択します。 この要求に対する応答の状況コードが一致した場合、CIS は、指定された時間にわたってキャッシュし、起点から送信されたキャッシュに関する指示 (例: { "200-299": 86400, 404: 1, "500-599": 0 }) をオーバーライドします。 CIS は変わらず標準的なキャッシュ・レベルに従うので、デフォルトでは、これによってオーバーライドされるのは、静的ファイルのキャッシュの動作です。 静的ではないアセットをキャッシュしたい場合は、ページルールを使用して「すべてをキャッシュ」のキャッシュレベルを設定する必要があります。

エッジ機能のスクリプトは、CIS セキュリティー機能の後に実行されますが、それ以外の機能よりは前に実行されます。 したがって、Edge機能のスクリプトはセキュリティ機能(すでに完了しているため)の動作には影響しませんが、画像サイズの最適化やエッジでの応答のキャッシュ方法など、他の機能には影響します。

cf オブジェクトを更新することは、要求を変更することに似ています。 cf オブジェクトを Request に追加するには、カスタム・オブジェクトを fetch に渡します。

// Disable ScrapeShield for this request.
fetch(event.request, { cf: { scrapeShield: false } })

cf オブジェクトに無効な設定や誤った名前の設定があると、何の応答もなく無視されます。 必要な動作になっていることを注意深くテストしてください。

エッジ機能のユース・ケース

以下の例はデモンストレーション専用で、実動での使用は想定していません。