web-dev-qa-db-ja.com

CloudFront-Viewer-Countryをレスポンスヘッダーに表示するにはどうすればよいですか?

CloudFrontでAWSのジオトラッキング機能を利用して、UIにユーザーの場所を通知し、問題のあるリージョンで特定のファイルを読み込まないようにしようとしています。

AWSのドキュメントには次のことが記載されていますが、CloudFront-Viewer-CountryヘッダーをOriginに転送するようにCloudFrontを正確に設定する方法について明確な指示はありません。キャッシュされたオブジェクトへのリクエストがCloudFront-Viewer-Country値でレスポンスを生成するように、これが機能する必要があります。

ビューアーの場所に基づいてオブジェクトをキャッシュするようにCloudFrontを設定する

リクエストの送信元の国に基づいてCloudFrontにオブジェクトの異なるバージョンをキャッシュさせたい場合は、CloudFront-Viewer-Countryヘッダーをオリジンに転送するようにCloudFrontを設定します。 CloudFrontは、リクエストの送信元のIPアドレスを2文字の国コードに自動的に変換します。コードおよび国名でソート可能な国コードの使いやすいリストについては、WikipediaのエントリISO 3166-1alpha-2を参照してください。

7
Ben Inada

CloudFrontはデフォルトではこれを行うことができません--CloudFront-Viewer-Countryは、responseヘッダーではなく、オリジンに送信されるrequestヘッダーとして意図されています。ブラウザ。

ただし... Lambda @ Edge Origin Responseトリガーを使用すると、実行しようとしているように見えることを実現できます。このヘッダーとその値を応答にエコーバックします。 Originに転送するOriginリクエストヘッダーのほとんどは、Originの応答処理中にもアクセスできます。

「AWSのドキュメントには次のことが記載されていますが、CloudFront-Viewer-CountryヘッダーをOriginに転送するようにCloudFrontを正確に設定する方法について明確な指示はありません。」

これは、キャッシュ動作設定の 選択したリクエストヘッダーに基づくキャッシュ で、左側のボックスでWhitelistを選択してCloudFront-Viewer-Countryを選択し、ボックスに移動することで実行されます。右側に。

Lambda @ Edgeで使用できるようにするには、Originに転送するためにこのヘッダーをホワイトリストに登録する必要があります。ただし、Originがヘッダーを使用していない、または必要としない場合でも、この関数を機能させるにはヘッダーを転送する必要があります意図したとおり、Origin RequestトリガーはCloudFrontが転送しないものを認識できないため、CloudFrontが挿入できるほとんどのCloudFront-*ヘッダーを含め、ほとんどのヘッダーはホワイトリストに登録しない限り転送されません。

'use strict';

exports.handler = (event, context, callback) => {
   const request = event.Records[0].cf.request;
   const response = event.Records[0].cf.response;
   if(request.headers['cloudfront-viewer-country'])
   {
      response.headers['cloudfront-viewer-country'] = request.headers['cloudfront-viewer-country'];
   }
   return callback(null,response);
};

Lambda @ Edgeでは、実際のヘッダーの大文字と小文字に関係なく、ヘッダーオブジェクトの外部キーは常に小文字である必要があることに注意してください。

10

Cloudfrontリクエストヘッダーを使用して、Nginx構成のadd_headerで同じソリューションを実現しました。

add_header cloudfront-viewer-country $http_cloudfront_viewer_country;

私はこれがより安くてより速い解決策になるだろうと思いました。

3
nidal