

# 関数をディストリビューションに関連付ける
<a name="associate-function"></a>

ディストリビューションで関数を使用するには、関数をディストリビューションの 1 つ以上のキャッシュ動作に関連付けます。関数を複数のディストリビューションの複数のキャッシュ動作に関連付けることができます。

関数は以下のいずれかに関連付けることができます。
+ 既存のキャッシュ動作
+ 既存のディストリビューションの新しいキャッシュ動作
+ 新しいディストリビューションの新しいキャッシュ動作

関数をキャッシュ動作に関連付ける場合は、*イベントタイプ*を選択する必要があります。CloudFront がいつ関数を実行するかは、イベントタイプで決まります。

次のイベントタイプを選択できます。
+ **ビューワーリクエスト** - CloudFront がビューワーからリクエストを受信するとこの関数が実行されます。
+ **ビューワーレスポンス** - CloudFront がビューワーにレスポンスを返す前にこの関数が実行されます。

CloudFront Functions では、オリジン向けのイベントタイプ (オリジンリクエストとオリジンレスポンス) を使用することはできません。****代わりに Lambda@Edge を使用できます。詳細については、「[Lambda@Edge 関数をトリガーできる CloudFront イベント](lambda-cloudfront-trigger-events.md)」を参照してください。

**注記**  
関数を関連付ける前に、[その関数をステージ `LIVE` に公開](publish-function.md)する必要があります。

関数をディストリビューションに関連付けるには、CloudFront コンソールまたは AWS Command Line Interface (AWS CLI) を使用できます。次の手順は、関数を既存のキャッシュ動作に関連付ける方法を示しています。

------
#### [ Console ]

**関数を既存のキャッシュ動作に関連付けるには**

1. CloudFront コンソール ([https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions)) にサインインし、**[関数]** ページを選択します。

1. 関連付ける関数を選択します。

1. **[関数]** ページで、**[発行]** タブを選択します。

1. **[関数を発行]** を選択します。

1. [**Add association**] を選択します。表示されるダイアログで、ディストリビューション、イベントタイプ、および/またはキャッシュ動作を選択します。

   イベントタイプでは、この関数を実行するタイミングを選択します。
   + **ビューワーリクエスト** – CloudFront がリクエストを受信するたびに関数を実行します。
   + **ビューワーレスポンス** – CloudFront がレスポンスを返すたびに関数を実行します。

1. 設定を保存するには、**[関連付けを追加]** を選択します。

CloudFront は関数に ディストリビューションを関連付けます。関連付けられたディストリビューションのデプロイが完了するまで数分待ちます。関数の詳細ページで **[ディストリビューションを表示]** を選択すると、進行状況を確認できます。

------
#### [ CLI ]

**関数を既存のキャッシュ動作に関連付けるには**

1. コマンドラインウィンドウを開きます。

1. 次のコードを使用して、関数に関連付けるキャッシュ動作を持つディストリビューションのディストリビューション設定を保存します。このコマンドは、ディストリビューション設定を `dist-config.yaml` という名前のファイルに保存します。このコマンドを使用するには、次の操作を行います。
   + *`DistributionID`* をディストリビューションの ID に置き換えます。
   + コマンドを 1 行で実行します。この例では、例を読みやすくするために改行されています。

   ```
   aws cloudfront get-distribution-config \
       --id DistributionID \
       --output yaml > dist-config.yaml
   ```

   コマンドが正常に完了した場合、AWS CLI は出力を返しません。

1. 作成した `dist-config.yaml` という名前のファイルを開きます。ファイルを編集して以下の変更を加えます。

   1. `ETag` フィールドの名前を `IfMatch` に変更しますが、フィールドの値は変更しないでください。

   1. キャッシュ動作で、`FunctionAssociations` という名前のオブジェクトを見つけます。このオブジェクトを更新して、関数の関連付けを追加します。関数を関連付ける YAML 構文は、次の例のようになります。
      + 次の例は、ビューワーリクエストイベントタイプ (トリガー) を示しています。ビューアレスポンスイベントタイプを使用するには、`viewer-request` を `viewer-response` に置き換えます。
      + *`arn:aws:cloudfront::111122223333:function/ExampleFunction`* は、このキャッシュ動作に関連付ける関数の Amazon リソースネーム (ARN) に置き換えます。関数 ARN を取得するには、**aws cloudfront list-functions** コマンドを使用します。

      ```
      FunctionAssociations:
        Items:
          - EventType: viewer-request
            FunctionARN: arn:aws:cloudfront::111122223333:function/ExampleFunction
        Quantity: 1
      ```

   1. 変更が完了したら、ファイルを保存します。

1. 関数の関連付けを追加してディストリビューションを更新するには、次のコマンドを使用します。このコマンドを使用するには、次の操作を行います。
   + *`DistributionID`* をディストリビューションの ID に置き換えます。
   + コマンドを 1 行で実行します。この例では、例を読みやすくするために改行されています。

   ```
   aws cloudfront update-distribution \
       --id DistributionID \
       --cli-input-yaml file://dist-config.yaml
   ```

   コマンドが正常に完了すると、関数の関連付けで更新されたばかりのディストリビューションを説明する次のような出力が表示されます。次の出力例は、読みやすくするために切り詰めています。

   ```
   Distribution:
     ARN: arn:aws:cloudfront::111122223333:distribution/EBEDLT3BGRBBW
     ... truncated ...
     DistributionConfig:
       ... truncated ...
       DefaultCacheBehavior:
         ... truncated ...
         FunctionAssociations:
           Items:
           - EventType: viewer-request
             FunctionARN: arn:aws:cloudfront::111122223333:function/ExampleFunction
           Quantity: 1
         ... truncated ...
     DomainName: d111111abcdef8.cloudfront.net
     Id: EDFDVBD6EXAMPLE
     LastModifiedTime: '2021-04-19T22:39:09.158000+00:00'
     Status: InProgress
   ETag: E2VJGGQEG1JT8S
   ```

------

ディストリビューションが再デプロイされる間に、ディストリビューションの `Status` は `InProgress` に変更されます。新しいディストリビューション設定が CloudFront エッジロケーションに到達すると、エッジロケーションは関連する関数の使用を開始します。ディストリビューションのデプロイが完了すると、`Status` は `Deployed` に戻ります。これは、関連する CloudFront 関数が世界中のすべての CloudFront エッジロケーションで稼働していることを示します。これには通常数分かかります。