[UPDATE] Amazon CloudFrontでクライアントのIPアドレスと接続ポートを確認できるCloudFront-Viewer-Addressヘッダが利用可能になりました

Amazon CloudFrontで接続元のクライアントIPアドレスと使用ポート番号が取得できるCloudFront-Viewer-Addressヘッダが利用可能になりました。Origin request policyで設定する点に注意しましょう。
2021.10.26

はじめに

清水です。本日お届けするアップデート情報はこちら、AWSのCDNサービスであるAmazon CloudFrontでクライアントのIPアドレスと接続ポート情報を確認できるCloudFront-Viewer-Addressヘッダが利用可能になりました。2021/10/25付でポストされたアップデート内容になります。

CloudFront-Viewer-Addressヘッダをオリジンサーバに転送するようCloudFrontを設定することで、オリジンサーバ側でクライアントのIPアドレスならびに接続ポート情報の確認がリアルタイムに行えます。これまでだと接続元IPアドレスの確認はX-Forwarded-Forヘッダの解析が必要、接続ポートまで含めた情報はアクセスログの解析が必要な状況でした。なおCloudFront-Viewer-Addressヘッダは従来のLegacy cache settingsでは利用できず、Origin request poilcyとして設定する必要がある点に注意しましょう。本エントリでは実際にCloudFront-Viewer-AddressヘッダをOrigin request policyに設定して動作を確認してみたのでまとめてみます。

CloudFront-Viewer-Addressヘッダを確認する

それでは実際にCloudFrontにCloudFront-Viewer-Addressヘッダをオリジンに転送するよう設定、このヘッダ内容を確認してみます。

まずはOrigin request policyを作成作成します。マネジメントコンソールの[Create origin request policy]ボタンから進みます。Origin request settingsのHeadersの項目で、All viewer headers and the following CloudFront headersを選択、続くAdd headerの項目ではCloudFront-Viewer-Addressを選択します。

Distribution作成の際、Cache key and origin requestsの項目、 Legacy cache settingsではなくCache policy and origin request policyを選択して Origin request policyで作成したポリシー(今回は「Custom-CloudFrontViewerAddressHeader」という名称)を選択します。今回は動作検証のため、Cache policyは「CachingDisabled」としました。

以上でCloudFront側の設定は完了です。オリジンサーバ側ではApache + PHPの環境を準備、以下のindex.phpのコードを配置してヘッダの内容を出力するようにします。

index.php

<?php

foreach (getallheaders() as $name => $value) {
    echo "<p>";
    echo "$name: $value\n";
    echo "</p>";
}

?>

CloudFront DistributionのDeployが完了したら、実際にCloudFrontドメインにアクセスしてみます。

CloudFront-Viewer-Addressのヘッダとして、202.XXX.XXX.50:5399という情報が取得できていますね。クライアントはIPアドレス202.XXX.XXX.50、ポート5399で接続していることがわかります。

以下はIPv6環境から接続した例です。クライアントのIPアドレスは240b:XXXXXXXXXX:8ef3、ポート6097で接続していることが確認できます。

まとめ

AWSのCDNサービスAmazon CloudFrontで新たに追加されたCloudFront-Viewer-Addressヘッダを確認してみました。これまで確認や利用に一手間二手間かかっていたクライアントのIPアドレスと接続ポートの情報が1つのヘッダでシンプルに取得できます。大変うれしいアップデートだなと思いました。なおCloudFront-Viewer-AddressヘッダはCloudFront Functionsでも利用可能とのことです、こちらでも活用の幅が広がりそうですね。