

# Lambda@Edge 関数のトリガーを追加する
<a name="lambda-edge-add-triggers"></a>

Lambda@Edge トリガーは、CloudFront ディストリビューション、キャッシュ動作、および関数を実行させるイベントの 1 つの組み合わせです。例えば、ディストリビューション用に設定した特定のキャッシュ動作について、CloudFront がビューワーからリクエストを受け取ったときに関数を実行させるトリガーを作成できます。1 つ以上の CloudFront トリガーを指定できます。

**ヒント**  
CloudFront ディストリビューションを作成するときは、別のリクエストを受け取ったときに応答する方法を CloudFront に指示する設定を指定します。デフォルトの設定は、ディストリビューションの*デフォルトのキャッシュ動作*と呼ばれます。特定のファイルタイプのリクエストを受け取る場合など、特定の状況での CloudFront の応答方法を定義する追加のキャッシュ動作を設定できます。詳細については、「[キャッシュ動作の設定](DownloadDistValuesCacheBehavior.md)」を参照してください。

Lambda 関数を最初に作成するときは、1 つのトリガーのみを指定できます。**Lambda コンソールを使用するか、CloudFront コンソールでディストリビューションを編集するかで、後で同じ関数にさらにトリガーを追加できます。
+ Lambda コンソールは、同じ CloudFront ディストリビューションの関数にトリガーを追加する場合に適しています。
+ 更新するディストリビューションを見つけやすいため、複数のディストリビューションのトリガーを追加する場合は、CloudFront コンソールが適しています。同時に他の CloudFront 設定を更新することもできます。

**Topics**
+ [Lambda@Edge 関数をトリガーできる CloudFront イベント](lambda-cloudfront-trigger-events.md)
+ [イベントを選択して関数をトリガーする](lambda-how-to-choose-event.md)
+ [Lambda@Edge 関数にトリガーを追加する (コンソール)](lambda-edge-add-triggers-console.md)

# Lambda@Edge 関数をトリガーできる CloudFront イベント
<a name="lambda-cloudfront-trigger-events"></a>

Amazon CloudFront ディストリビューションの各キャッシュ動作に、特定の CloudFront イベントの発生時に Lambda 関数を実行させるトリガー (関連付け) を 4 つまで追加できます。CloudFront トリガーは、次の図に示す、4 つの CloudFront イベントのいずれかに基づくことができます。

![\[Lambda 関数の CloudFront トリガーイベントが CloudFront と統合する仕組みを示す概念的なグラフィック。\]](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/images/cloudfront-events-that-trigger-lambda-functions.png)


Lambda@Edge 関数のトリガーに使用できる CloudFront イベントには、以下のものがあります。

**ビューワーリクエスト**  
CloudFront がビューワーからリクエストを受け取ると、リクエストされたオブジェクトが CloudFront キャッシュにあるかどうかを確認する前に関数が実行されます。  
次の場合には関数は実行されません。  
+ カスタムエラーページを取得する場合。
+ CloudFront で HTTP リクエストが自動的に HTTPS にリダイレクトされる場合 ([[ビューワープロトコルポリシー](DownloadDistValuesCacheBehavior.md#DownloadDistValuesViewerProtocolPolicy)] の値が **[Redirect HTTP to HTTPS]** の場合)

**オリジンリクエスト**  
CloudFront がリクエストをオリジンに転送したときに*のみ*、関数が実行されます。リクエストされたオブジェクトが CloudFront キャッシュ内にある場合、関数は実行されません。

**オリジンレスポンス**  
CloudFront がオリジンからのレスポンスを受け取った後、レスポンス内のオブジェクトをキャッシュする前に関数が実行されます。関数は、オリジンからエラーが返された場合でも実行されることに注意してください。  
次の場合には関数は実行されません。  
+ リクエストされたファイルが CloudFront キャッシュ内にあり、その有効期限が切れていない場合。
+ オリジンリクエストイベントによってトリガーされた関数からレスポンスが生成された場合。

**ビューワーレスポンス**  
リクエストされたファイルがビューワーに返される前に関数が実行されます。ファイルが CloudFront キャッシュ内に既に存在するかどうかに関係なく、関数が実行されることに注意してください。  
次の場合には関数は実行されません。  
+ オリジンが HTTP ステータスコードとして 400 以上を返した場合。
+ カスタムエラーページが返された場合。
+ ビューワーリクエストイベントによってトリガーされた関数からレスポンスが生成された場合。
+ CloudFront で HTTP リクエストが自動的に HTTPS にリダイレクトされる場合 ([[ビューワープロトコルポリシー](DownloadDistValuesCacheBehavior.md#DownloadDistValuesViewerProtocolPolicy)] の値が [**Redirect HTTP to HTTPS**] の場合)

同じキャッシュ動作に複数のトリガーを追加する場合、各トリガーに対して同じ関数を実行することも、異なる関数を実行することもできます。また、複数のディストリビューションに同じ関数を関連付けることもできます。

**注記**  
CloudFront イベントが Lambda 関数の実行をトリガーすると、その関数が終了するまで CloudFront は続行できません。**  
例えば、CloudFront ビューワーリクエストイベントによって Lambda 関数がトリガーされると、その Lambda 関数が実行を終了するまで、CloudFront からビューワーにレスポンスは返されず、リクエストはオリジンに転送されません。  
つまり、Lambda 関数をトリガーするリクエストごとにリクエストのレイテンシーが長くなるため、関数をできるだけ速く実行する必要があります。

# イベントを選択して関数をトリガーする
<a name="lambda-how-to-choose-event"></a>

Lambda 関数をトリガーするために使用する CloudFront イベントを決定する際には、次の点を考慮してください。

**Lambda 関数によって変更されたオブジェクトを CloudFront でキャッシュする場合**  
Lambda 関数によって変更されたオブジェクトを CloudFront でキャッシュして、そのオブジェクトが次回にリクエストされたときにエッジロケーションから提供できるようにする場合は、オリジンリクエストイベントまたはオリジンレスポンスイベントを使用します。****  
これにより、オリジンの負荷と以降のリクエストのレイテンシーが軽減され、以降のリクエストで Lambda@Edge を呼び出すコストが削減されます。  
例えば、オリジンから返されたオブジェクトのヘッダーを追加、削除、または変更する場合に、その結果を CloudFront でキャッシュするには、オリジンレスポンスイベントを使用します。

**すべてのリクエストに対して関数を実行する場合**  
CloudFront が受信したディストリビューションのすべてのリクエストに対して関数を実行する場合は、ビューワーリクエストイベントまたはビューワーレスポンスイベントを使用します。****  
オリジンリクエストイベントとオリジンレスポンスイベントは、リクエストされたオブジェクトがエッジロケーションにキャッシュされておらず、CloudFront がリクエストをオリジンに転送する場合にだけ発生します。

**関数でキャッシュキーを変更する場合**  
キャッシュの基準として使用している値を変更する場合は、ビューワーリクエストイベントを使用します。**  
たとえば、関数で URL を変更してパスに言語の省略形を含める場合 (ユーザーがドロップダウンリストから言語を選択した場合など) は、ビューワーリクエストイベントを使用します。  
+ **ビューワーリクエストの URL** - https://example.com/en/index.html
+ **リクエストがドイツの IP アドレスから送られてきた場合の URL** - https://example.com/de/index.html
Cookie またはリクエストヘッダーをキャッシュ条件として使用している場合もビューワーリクエストイベントを使用します。  
関数で Cookie またはヘッダーを変更する場合は、リクエストの該当部分をオリジンに転送するように CloudFront を設定します。詳細については、以下の各トピックを参照してください。  
+ [Cookie に基づいてコンテンツをキャッシュする](Cookies.md)
+ [リクエストヘッダーに基づいてコンテンツをキャッシュする](header-caching.md)

**関数がオリジンからのレスポンスに影響を与える**  
オリジンからのレスポンスに影響を与えるような方法でリクエストを変更するには、オリジンリクエストイベントを使用します。**  
通常、ほとんどのビューワーリクエストイベントはオリジンに転送されません。CloudFront は、エッジキャッシュに既に存在するオブジェクトを使用してリクエストに応答します。オリジンリクエストイベントに基づく関数でリクエストを変更すると、変更されたオリジンリクエストに対するレスポンスが CloudFront でキャッシュされます。

# Lambda@Edge 関数にトリガーを追加する (コンソール)
<a name="lambda-edge-add-triggers-console"></a>

AWS Lambda コンソールまたは Amazon CloudFront コンソールのいずれかを使用して、Lambda@Edge 関数のトリガーを追加できます。

**重要**  
トリガーは、関数の番号付きバージョン (**\$1LATEST** ではなく) に対してのみ作成できます。

------
#### [ Lambda console ]<a name="lambda-edge-add-triggers-procedure"></a>

**CloudFront イベントのトリガーを Lambda@Edge 関数に追加するには**

1. AWS マネジメントコンソール にサインインして AWS Lambda コンソール ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) を開きます。

1. ページの上部にあるリージョンのリストで、[**米国東部 (バージニア北部)**] を選択します。

1. [**Functions**] ページで、トリガーを追加する関数の名前を選択します。

1. **[関数の概要]** ページで、**[バージョン]** タブを選択します。

1. トリガーを追加するバージョンを選択します。

   バージョンを選択すると、ボタンの名前が [**Version: \$1LATEST**] または [**Version:*** バージョン番号*] に変わります。

1. [**Triggers**] タブを選択します。

1. [**Add trigger**] を選択します。

1. **[トリガー設定]** で、**[ソースを選択]** を選択し、**cloudfront** と入力し、**CloudFront** を選択します。
**注記**  
1 つまたは複数のトリガーを作成済みの場合、CloudFront がデフォルトのサービスになります。

1. Lambda 関数をいつ実行するかを示す、次の値を指定します。

   1. **ディストリビューション** – トリガーを追加するディストリビューションを選択します。

   1. **キャッシュ動作** – 関数を実行するオブジェクトを指定するキャッシュ動作を選択します。
**注記**  
キャッシュ動作に `*` を指定すると、Lambda 関数はデフォルトのキャッシュ動作にデプロイされます。

   1. **CloudFront イベント** – 関数を実行させる CloudFront イベントを選択します。

   1. **本文を含める** – 関数のリクエストボディにアクセスするには、このチェックボックスをオンにします。

   1. **Lambda@Edge へのデプロイを確認** – このチェックボックスをオンにして、AWS Lambda が関数を AWS リージョン にグローバルにレプリケートするようにします。

1. **[Add]** (追加) を選択します。

   この関数は、更新された CloudFront ディストリビューションがデプロイされたときに、指定された CloudFront イベントのリクエストの処理を開始します。ディストリビューションがデプロイされているかどうかを確認するには、ナビゲーションペインで [**Distributions**] を選択します。ディストリビューションをデプロイすると、ディストリビューションの **[ステータス]** 列の値が、**[デプロイ中]** からデプロイの日時に変わります。

------
#### [ CloudFront console ]<a name="lambda-create-functions-add-triggers-cloudfront-console-procedure"></a>

**CloudFront イベントのトリガーを Lambda@Edge 関数に追加するには**

1. トリガーを追加する Lambda 関数の ARN を取得します。

   1. AWS マネジメントコンソール にサインインして AWS Lambda コンソール ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) を開きます。

   1. ページの上部にあるリージョンのリストで、[**米国東部 (バージニア北部)**] を選択します。

   1. 関数のリストで、トリガーを追加する関数の名前を選択します。

   1. **[関数の概要]** ページで **[バージョン]** タブを選択し、トリガーを追加する先の番号付きバージョンを選択します。

   1. **[ARN をコピー]** ボタンを選択して、ARN をクリップボードにコピーします。Lambda 関数の ARN は次のようになります。

      `arn:aws:lambda:us-east-1:123456789012:function:TestFunction:2`

      末尾の番号 (この例では **2**) は関数のバージョン番号です。

1.  で CloudFront コンソールを開きます[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)

1. ディストリビューションのリストで、トリガーを追加するディストリビューションの ID を選択します。

1. [**Behaviors**] タブを選択します。

1. トリガーを追加する先のキャッシュ動作を選択し、**[編集]** を選択します。

1. **[関数の関連付け]** で、**[関数タイプ]** リストから **[Lambda@Edge]** を選択し、ビューワーリクエスト、ビューワーレスポンス、オリジンリクエスト、またはオリジンレスポンスに対して関数をいつ実行するかを選択します。

   詳細については、「[イベントを選択して関数をトリガーする](lambda-how-to-choose-event.md)」を参照してください。

1. **[関数 ARN/名前]** テキストボックスに、選択したイベントの発生時に実行する Lambda 関数の ARN を貼り付けます。これは Lambda コンソールからコピーした値です。

1. 関数のリクエスト本文にアクセスする場合は、**[本文を含める]** を選択します。

   リクエスト本文を置き換えるだけの場合は、このオプションを選択する必要はありません。

1. 他のイベントタイプで同じ関数を実行するには、ステップ 6 と 7 を繰り返します。

1. **[Save changes]** (変更の保存) をクリックします。

1. このディストリビューションの他のキャッシュ動作にトリガーを追加するには、ステップ 5～10 を繰り返します。

   この関数は、更新された CloudFront ディストリビューションがデプロイされたときに、指定された CloudFront イベントのリクエストの処理を開始します。ディストリビューションがデプロイされているかどうかを確認するには、ナビゲーションペインで [**Distributions**] を選択します。ディストリビューションをデプロイすると、ディストリビューションの **[ステータス]** 列の値が、**[デプロイ中]** からデプロイの日時に変わります。

------