#はじめ
普段、CloudFrontをあまり使いこなせていません...というより、あまり利用していません。
先日CloudFrontについて、社内利用部門からの問い合わせの対応に少し困っていました。(自分なりに調べて解決できましたが)
またつい最近、CloudFrontの利用時にハマった事例を聞けましたので、
自分の学習メモも兼ねて、下記2点について、Qiitaに書こうと思いました。
- SSLハンドシェイクエラー
- 断続的に通信失敗
SSLハンドシェイクエラー
構成: CloudFront → ELB → オリジン
事象
(CloudFront経由せず)ELB経由の場合は問題なくオリジンにアクセスできましたが、CloudFront経由ですと、ハンドシェイクエラーが発生し、オリジンにアクセスできませんでした。
原因
結論から言いますと、Hostヘッダーが一致していないことです。
今回SSLハンドシェイクエラーが発生したケースにおいて、 CloudFrontのBehaviour設定画面にForward Headers = All というのが設定がされていました。
CloudFrontのデフォルト設定ですと、Hostヘッダーは転送されませんが、
Forward Headers = All を設定してしまうと、CloudFrontが自分のDNS名(例えば abcd.cloudfront.net)をHost Headerとしてオリジンに転送されます。
その後、CloudFrontがオリジンから送付された証明書(例えばexample.com)を検証しますが、CloudFrontのHost header(abcd.cloudfront.net)とオリジンのHost Header(example.com)が一致していないため、SSL通信が確立されず、ハンドシェイクエラーになってしまいます。
解決策
CloudFrontから通過させるヘッダーを一度洗い出し、BehaviourのForward Headersを設定する際に、ALLではなく、Whitelistで通過させるヘッダーを設定することです。
断続的な通信エラー
事象
(つい最近の話)CloudFront経由の通信がある日から通信ができたり、できなかったりとかすることが発生します。
原因
前提として、セキュリティグループでアクセスを制限し、CloudFrontからのアクセスのみ許可していることです。
AWSがCloudFrontのキャッシュサーバが追加したからです。これにより、CloudFrontが利用するIPが増え、元々セキュリティグループに登録されていないCloudFrontのIPからのアクセスですと、当然通信ができません。
解決策
CloudFrontが利用するIPレンジの情報はip-ranges.jsonから取得できますので、
新たに追加されたCloudFrontのIPをセキュリティグループに登録しておくことです。
※"service": "CLOUDFRONT"
で検索すると便利
なお、CloudFrontのIPを追加されたのをどうやって分かるかと言いますと、
下記AWSの記載によると、SNSを設定することにより、更新される度に通知してくれます。(全然知らなかった)
AWS の IP アドレス範囲の通知
AWS の IP アドレス範囲に変更があるたびに、AmazonIpSpaceChanged トピックのサブスクライバー>に通知が送信されます。
補足情報
-
上記のAWS SNSからの通知を受け、Lambdaが起動し、自動的にセキュリティグループを更新してくれるコードがGitHub上にがあります。利用したことがないですが、aws-cloudfront-samplesってものです。
-
セキュリティグループインバウンドルールの上限(デフォルト)は50個ですので、現状ですと、上限を超える前に、AWSサポートに(100まで)上限緩和を申請するか、セキュリティグループにさらに入れ子のセキュリティグループを登録するか2択です。
最後
とりあえず、自分が知っている範囲で書きました。
CloudFrontについて、全然勉強足りていないことが分かっていて、これからもどんどん触っていきたいと思っています。