

# コンテンツの地理的配分を制限する
<a name="georestrictions"></a>

*地理的制限* (*地理的ブロック*とも呼ばれます) を使用すると、Amazon CloudFront ディストリビューションを通じて配信しているコンテンツに対して特定地域のユーザーがアクセスできないようにすることができます。地理的制限を使用するには、次の 2 つの方法があります。
+ CloudFront の地理的制限機能を使用する。ディストリビューションに関連するすべてのファイルへのアクセスを制限し、国レベルでアクセスを制限する場合は、この方法を使用します。
+ サードパーティーの位置情報サービスを使用する。ディストリビューションに関連するファイルのサブセットへのアクセスを制限する場合や、国レベルより詳細なレベルでアクセスを制限する場合は、この方法を使用します。

**Topics**
+ [CloudFront の地理的制限を使用する](#georestrictions-cloudfront)
+ [サードパーティの位置情報サービスを使用する](#georestrictions-geolocation-service)

## CloudFront の地理的制限を使用する
<a name="georestrictions-cloudfront"></a>

ユーザーがコンテンツをリクエストすると、通常 CloudFront はユーザーがいる場所に関係なくリクエストされたコンテンツを提供します。特定の国のユーザーによるコンテンツへのアクセスを回避する必要がある場合は、CloudFront の地理的制限を使用して、次のいずれかを行うことができます。
+ 承認された国の許可リストに含まれているいずれかの国にユーザーがいる場合のみ、コンテンツへのアクセス許可を付与する。
+ ユーザーが拒否リストにある禁止国にいる場合、コンテンツへのアクセスを禁止する。

例えば、コンテンツの配信が許可されていない国がリクエスト元である場合は、CloudFront の地理的制限を使用してリクエストをブロックできます。

**注記**  
CloudFront は、サードパーティーのデータベースを使用して、ユーザーがいる場所を判別します。IP アドレスと国とのマッピングの正確さは、リージョンによって異なります。最近のテストによれば、全体的な正確性は 99.8% です。CloudFront がユーザーの場所を特定できない場合、ユーザーがリクエストしたコンテンツは CloudFront から供給されます。

地理的制限は次のような仕組みになっています。

1. 仮に、コンテンツをリヒテンシュタインでのみ配信する権限を持っているとしましょう。CloudFront ディストリビューションを更新して、リヒテンシュタインのみを含む許可リストを追加します。(または、リヒテンシュタイン以外のすべての国を含む拒否リストを追加することもできます)。

1. モナコに住むユーザーからコンテンツがリクエストされた場合、DNS はそのリクエストをミラノ (イタリア) にある CloudFront エッジロケーションにルーティングします。

1. ミラノのエッジロケーションはお客さまのディストリビューションを検索し、モナコ王国のユーザーはコンテンツをダウンロードするアクセス許可がないと判断します。

1. CloudFront は HTTP ステータスコード `403 (Forbidden)` をユーザーに返します。

オプションで、ユーザーにカスタムエラーメッセージを返すよう CloudFront を設定することも、リクエストされたファイルに関するエラーレスポンスを CloudFront でキャッシュしておく時間の長さを指定することもできます。デフォルト値は 10 秒です。詳細については、「[HTTP ステータスコード別のカスタムエラーページを作成する](creating-custom-error-pages.md)」を参照してください。

地理的制限はディストリビューション全体に適用されます。コンテンツのある部分に特定の制限を適用し、コンテンツの別の部分に別の制限を適用する (または制限を適用しない) 必要がある場合は、別々の CloudFront ディストリビューションを作成するか、[サードパーティの位置情報サービスを使用する](#georestrictions-geolocation-service)必要があります。

CloudFront の[標準ログ](AccessLogs.md) (アクセスログ) を有効にすると、`sc-status` (HTTP ステータスコード) の値が `403` であるログエントリを検索することによって、CloudFront で拒否されたリクエストを特定できます。ただし、標準ログだけでは、ユーザーのいる場所に基づいて CloudFront が拒否したリクエストと、別の理由でファイルへのアクセス許可がユーザーになかったために CloudFront が拒否したリクエストとを区別することができません。Digital Element や MaxMind などサードパーティーの位置情報サービスを利用している場合は、アクセスログの `c-ip` (クライアント IP) 列にある IP アドレスに基づいてリクエストの場所を識別できます。CloudFront の標準ログの詳細については、[アクセスログ (標準ログ)](AccessLogs.md) を参照してください。

次の手順では、CloudFront コンソールを使用して、地理的制限を既存のディストリビューションに追加する方法を示します。コンソールを使用してディストリビューションを作成する方法の詳細については、「[ディストリビューションを作成する](distribution-web-creating-console.md)」を参照してください。<a name="restrictions-geo-procedure"></a>

**CloudFront ウェブディストリビューションに地理的制限を追加するには (コンソール)**

1. AWS マネジメントコンソールにサインインし、[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) で CloudFront コンソールを開きます。

1. ナビゲーションペインで、**[ディストリビューション]** を選択し、更新するディストリビューションを選択します。

1. **[セキュリティ]** タブを選択し、**[地理的制限]** を選択します。

1. **[編集]** を選択します。

1. 許可した国のリストを作成する場合は、**許可リスト**、またはブロックした国のリストを作成する場合は、**ブロックリスト**を作成します。

1. 目的の国をリストに追加し、**[Save changes]** (変更の保存) を選択します。

## サードパーティの位置情報サービスを使用する
<a name="georestrictions-geolocation-service"></a>

CloudFront の地理的制限機能を使用すると、特定のウェブディストリビューションで配信するすべてのファイルについて、国レベルでコンテンツの配信を制御できます。地理的制限が国境と一致していない場合や、特定のディストリビューションで配信するファイルの一部にのみアクセスを制限する必要がある場合は、CloudFront とサードパーティーの位置情報サービスを組み合わせることができます。これにより、国だけではなく、都市、郵便番号、または緯度/経度に基づいてコンテンツの制御を提供します。

サードパーティーの位置情報サービスを使用する場合は、有効期限の日時を指定できる CloudFront 署名付き URL を使用することをお勧めします。有効期限を経過すると、この URL は無効になります。さらに、オリジンとして Amazon S3 バケットを使用することをお勧めします。CloudFront [オリジンアクセスコントロール](private-content-restricting-access-to-s3.md)を使用することで、オリジンのコンテンツへのユーザーによる直接アクセスを回避できるためです。署名付き URL とオリジンアクセスコントロールの詳細については、「[署名付き URL と署名付き Cookie を使用したプライベートコンテンツを提供する](PrivateContent.md)」を参照してください。

以下のステップは、サードパーティーの位置情報サービスを使用してファイルへのアクセスを制御する方法を説明しています。

**サードパーティーの位置情報サービスを使用して CloudFront ディストリビューション内のファイルへのアクセスを制限するには**

1. 位置情報サービスのアカウントを取得します。

1. コンテンツを Amazon S3 バケットにアップロードします。

1. プライベートコンテンツを供給できるように Amazon CloudFront と Amazon S3 を設定します。詳細については、「[署名付き URL と署名付き Cookie を使用したプライベートコンテンツを提供する](PrivateContent.md)」を参照してください。

1. 以下の処理を行うようにウェブアプリケーションを記述します。
   + 各ユーザーリクエストの IP アドレスを位置情報サービスに送信します。
   + 位置情報サービスからの戻り値を評価し、ユーザーの場所が CloudFront によるコンテンツの配信先に該当するかどうかを判別します。
   + コンテンツをユーザーの場所に配信する場合、CloudFront コンテンツの署名付き URL を生成します。コンテンツをその場所に配信しない場合、HTTP ステータスコード `403 (Forbidden)` をユーザーに返します。または、カスタムエラーメッセージが返されるように CloudFront を設定することもできます。詳細については、「[HTTP ステータスコード別のカスタムエラーページを作成する](creating-custom-error-pages.md)」を参照してください。

   詳細については、使用する位置情報サービスのドキュメントを参照してください。

ウェブサーバー変数を使用すると、ウェブサイトを訪れたユーザーの IP アドレスを取得できます。次の点に注意してください。
+ ウェブサーバーがインターネットにロードバランサー経由で接続されていない場合、ウェブサーバー変数を使用してリモート IP アドレスを取得できます。ただし、この IP アドレスが必ずしもユーザーの IP アドレスであるとは限りません。ユーザーのインターネットへの接続方法によっては、プロキシサーバーの IP アドレスである可能性もあります。
+ ウェブサーバーがインターネットにロードバランサー経由で接続されている場合、ウェブサーバー変数には、ユーザーの IP アドレスではなく、ロードバランサーの IP アドレスが含まれる可能性があります。この構成では、`X-Forwarded-For` HTTP ヘッダーに含まれる最後の IP アドレスを使用することをお勧めします。通常、このヘッダーには複数の IP アドレスが含まれており、そのほとんどはプロキシまたはロードバランサーの IP アドレスです。ユーザーの地理的な場所に関連付けられている可能性が最も高い IP アドレスは、リストの最後にある IP アドレスです。

ウェブサーバーがロードバランサーに接続されていない場合は、IP アドレスのスプーフィングを回避するために、`X-Forwarded-For` ヘッダーではなくウェブサーバー変数を使用することをお勧めします。