docomo Developer supportの@akatsukahaです
CloudFrontの地域制限を利用して,コンテンツを配信する国を制限することが出来ます.
これによりサービス提供したい国を限定することが出来ます.
今年ですとGDPRが施行され複数のサイトがEUからのアクセスを許可しないブロッキングを実施しました.施行されたばかりでどのようなペナルティが課されるか不透明なところもあり,EUのみをブロッキングするという手段をとったのだと思います.ここで記載した内容を用いることで,サービス提供したい国に限定することも出来ますし,特定の国々に対してのみブロッキングするという事もできます.
1. CloudFrontの事前準備
オリジンをAPI Gatewayにした,CloudFrontを事前に準備しておきます.
API Gatewayへのアクセスし,レスポンス内容を確認
$ curl https://m6f4prq5ac.execute-api.ap-northeast-1.amazonaws.com/v1/aaa/bbb
{"message":"hello world"}
CloudFrontのAPIにアクセスし,レスポンス内容を確認
$ curl https://d3f5bbalyot7v2.cloudfront.net/v1/aaa/bbb
{"message":"hello world"}
2. CloudFrontで地域制限を設定
下記のブログで詳しく設定方法が記載されています.
Amazon CloudFront の地域制限を使用して、ホワイトリストまたはブラックリストを基に、特定の地域にいるユーザーにウェブコンテンツへのアクセスを制限また許可する方法を教えてください。
まずは,日本と米国のみアクセスを許可するという設定にします.
[CloudFrontのコンソールに移動] で,対象となるDistribution(ディストリビューション)を選択
[Restriction(制限)] タブを選択して,[Geo Restriction]にチェックを入れ,[Edit(編集)] を選択
下記の通り選択
- [Enable-Restriction(有効化-制限)] から [Yes(はい)] を選択
- [Restriction Type(制限タイプ)] に対して、[Whitelist(ホワイトリスト)] または [Blacklist(ブラックリスト)] を選択.ここでは,日本と米国のみ許可する例として,[Whitelist(ホワイトリスト)]を選択します.
- [Countries(国)]から[JP(日本)]と[US(米国)]を選択
- [Yes Edit(編集完了)]を選択
これで処理は終了です.あとはCloudFrontに反映されるまで待てば大丈夫です.
3. 動作確認
反映後にcURLを実行して確かめてみます.
先ずは日本からアクセスして,アクセス出来ることを確認します.
$ curl https://d3f5bbalyot7v2.cloudfront.net/v1/aaa/bbb
{"message":"hello world"}
続いてEU(フランクフルトリージョン)で作成したEC2からアクセスし,アクセス出来ないことを確認します.
想定通りエラーになりました.
$ curl https://d3f5bbalyot7v2.cloudfront.net/v1/aaa/bbb
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>403 ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size="1px">
The Amazon CloudFront distribution is configured to block access from your country.
<BR clear="all">
<HR noshade size="1px">
<PRE>
Generated by cloudfront (CloudFront)
Request ID: R0vLQabzkIHILRQSyY3s04t_Dut-2bQkjkk5NyDgwR7Fkxy9hOC9iA==
</PRE>
<ADDRESS>
</ADDRESS>
</BODY></HTML>
上記のエラーメッセージですが,デフォルトのものから変更したいというニーズがあると思います.Blacklist(ブラックリスト)の国のユーザーがコンテンツへのアクセスを試みた場合にソーリーページを作成することもCloudFrontでは容易です.詳しくはカスタムエラーメッセージを作成を参照してください.