

# 関数の目的を決定する
<a name="function-code-choose-purpose"></a>

関数コードを記述する前に、関数の目的を決めます。CloudFront Functions の関数の大半は、次のいずれかを目的としています。

**Topics**
+ [ビューワーリクエストイベントタイプの HTTP リクエストの変更](#function-code-modify-request)
+ [ビューワーリクエストイベントタイプで HTTP レスポンスを生成する](#function-code-generate-response)
+ [ビューワーレスポンスイベントタイプの HTTP レスポンスの変更](#function-code-modify-response)
+ [接続リクエストイベントタイプの mTLS 接続を検証する](#function-code-connection-request)
+ [関連情報](#related-information-cloudfront-functions-purpose)

関数の目的にかかわらず、`handler` はあらゆる関数のエントリポイントです。CloudFront から関数に送られる `event` という単一の引数を使います。`event` は、HTTP リクエスト表記の JSON オブジェクトです (関数が HTTP レスポンスを変更する場合は、レスポンス)。

## ビューワーリクエストイベントタイプの HTTP リクエストの変更
<a name="function-code-modify-request"></a>

関数は、CloudFront がビューワー (クライアント) から受信する HTTP リクエストを変更し、変更されたリクエストを CloudFront に返して処理を続行できます。たとえば、関数コードで[キャッシュキー](understanding-the-cache-key.md)を正規化したり、リクエストヘッダーを変更したりできます。

HTTP リクエストを変更する関数を作成して発行する場合は、必ず*ビューワーリクエスト*イベントタイプの関連付けを追加してください。詳細については、「[関数を作成する](functions-tutorial.md#functions-tutorial-create)」を参照してください。これにより、CloudFront がビューワーからリクエストを受信するたびに、リクエストされたオブジェクトが CloudFront キャッシュにあるかどうかをチェックする前に、関数が実行されます。

**Example 例**  
次の擬似コードは、HTTP リクエストを変更する関数の構造を示しています。  

```
function handler(event) {
    var request = event.request;

    // Modify the request object here.

    return request;
}
```
この関数は、変更された `request` オブジェクトを CloudFront に返します。CloudFront は、CloudFront キャッシュでキャッシュヒットがないかチェックし、必要に応じてリクエストをオリジンに送信することで、返されたリクエストの処理を続行します。

## ビューワーリクエストイベントタイプで HTTP レスポンスを生成する
<a name="function-code-generate-response"></a>

関数は、エッジで HTTP レスポンスを生成し、キャッシュされたレスポンスまたは CloudFront によるそれ以降の処理をチェックすることなく、ビューワー (クライアント) に直接返すことができます。たとえば、関数コードは、リクエストを新しい URL にリダイレクトしたり、承認をチェックして、`401` や `403` レスポンスを非承認リクエストに返す場合があります。

HTTP レスポンスを生成する関数を作成する場合は、必ず*ビューワーリクエスト*イベントタイプを選択してください 。つまりこの関数は、CloudFront がビューワーからリクエストを受信するたびに、CloudFront がリクエストの処理を行う前に実行されます。

**Example 例**  
次の擬似コードは、HTTP 応答を生成する関数の構造を示しています。  

```
function handler(event) {
    var request = event.request;

    var response = ...; // Create the response object here,
                        // using the request properties if needed.

    return response;
}
```
この関数は、CloudFront に `response` オブジェクトを返します。CloudFront はこのオブジェクトを、CloudFront キャッシュをチェックしたり、オリジンにリクエストを送信したりすることなく、すぐにビューワーに戻します。

## ビューワーレスポンスイベントタイプの HTTP レスポンスの変更
<a name="function-code-modify-response"></a>

関数は、レスポンスが CloudFront キャッシュとオリジンのどちらから来たかに関係なく、CloudFront がビューワー (クライアント) に送信する前に HTTP レスポンスを変更できます。例えば、関数コードでレスポンスヘッダー、ステータスコード、本文のコンテンツを追加または変更する場合があります。

HTTP レスポンスを変更する関数を作成する場合は、必ず*ビューワーレスポンス*イベントタイプを選択してください。つまり関数は、レスポンスが CloudFront キャッシュまたはオリジンのどちらから来たかに関係なく、CloudFront がビューワーにレスポンスを返す前に実行されます。

**Example 例**  
次の擬似コードは、HTTP レスポンスを変更する関数の構造を示しています。  

```
function handler(event) {
    var request = event.request;
    var response = event.response;

    // Modify the response object here,
    // using the request properties if needed.

    return response;
}
```
この関数は変更された `response` オブジェクトを CloudFront に返し、CloudFront はこれをすぐにビューワーに返します。

## 接続リクエストイベントタイプの mTLS 接続を検証する
<a name="function-code-connection-request"></a>

接続関数は、カスタム検証および認証ロジックを提供するために TLS 接続中に実行される CloudFront Functions の一種です。接続関数は現在、相互 TLS (mTLS) 接続で使用できます。ここでは、クライアント証明書を検証し、標準証明書の検証を超えてカスタム認証ロジックを実装できます。接続関数は TLS ハンドシェイクプロセス中に実行され、証明書プロパティ、クライアント IP アドレス、または他の条件に基づいて接続を許可または拒否できます。

接続関数を作成して公開した後、mTLS が有効なディストリビューションとの*接続リクエスト*イベントタイプの関連付けを追加してください。これにより、クライアントが CloudFront との mTLS 接続を確立しようとするたびに関数が実行されるようになります。

**Example**  
次の擬似コードは、接続関数の構造を示しています。  

```
function connectionHandler(connection) {
    // Validate certificate and connection properties here.
    
    if (/* validation passes */) {
        connection.allow();
    } else {
        connection.deny();
    }
}
```
関数はヘルパーメソッドを使用して、接続を許可または拒否するかどうかを決定します。ビューワーリクエストおよびビューワーレスポンス関数とは異なり、接続関数は HTTP リクエストまたはレスポンスを変更できません。

## 関連情報
<a name="related-information-cloudfront-functions-purpose"></a>

CloudFront Functions の操作の詳細については、以下のトピックを参照してください。
+ [イベントの構造](functions-event-structure.md)
+ [JavaScript ランタイムの機能](functions-javascript-runtime-features.md)
+ [CloudFront Functions の例 ](service_code_examples_cloudfront_functions_examples.md)
+ [エッジ関数に対する制限](edge-functions-restrictions.md)