
Amazon CluodFrontとS3でOrigin Access Control (OAC)を設定する
今回の記事では、Amazon S3とAmazon CloudFrontを使用する際に出てくる「OAI (Origin Access Identity)」と「OAC (Origin Access Control)」について説明します。
S3バケットとCloudFrontとは?
まず、S3バケットとCloudFrontについて簡単に説明します。
S3
AWSが提供するストレージサービスです。ウェブサイトのコンテンツやデータを保存するのに使われます。
CloudFront
AWSのコンテンツ配信ネットワーク(CDN)サービスで、ユーザーがウェブサイトのコンテンツにより高速にアクセスできるようにするためのものです。ユーザーがコンテンツにアクセスする際には、最も近いエッジロケーションからデータを取得するため、レイテンシー(遅延)が低く、高速な配信が可能となります。その結果、ウェブサイトのパフォーマンスが向上します。
上記のS3とCloudFrontを組み合わせて使用すると、S3のデータへの直接のアクセスを遮断し、CloudFront経由でのみアクセスできるように設定することで、例えばS3にアップロードしたWebアプリをCloudFront経由で配信すると、セキュリティを強化することができます。
OAIとOACとは?
OAIとOACは、CloudFrontからS3にアクセスする際のアクセス制限を行う方法のことです。
Origin Access Identity (OAI)
OAIは、CloudFrontがオリジンサーバー(この場合はS3バケット)にアクセスする方法を提供します。
OAIを設定することで、CloudFrontからの要求をS3バケットが認識し、それ以外からの直接アクセスをブロックします。これにより、S3バケット内のコンテンツはパブリックアクセスをブロックし、CloudFront経由でしか公開されないようになります。
Origin Access Control (OAC)
OACは、オリジンサーバー(S3バケット)のリソースへのアクセスを制御するポリシーです。
CloudFrontのOACは2022年から新しく導入された機能であり、OAIと比べてより詳細なポリシー設定が行えるようになっています。
AWS公式ドキュメントにおいても、OAIよりもOACを使用することが推奨されています。
CloudFront には、認証済みリクエストを Amazon S3 オリジンに送信するために、オリジンアクセスコントロール (OAC) とオリジンアクセスアイデンティティ (OAI) という 2 つの方法が用意されています。OAC は以下をサポートしているため、OAC の使用をお勧めします。
・すべての AWS リージョンのすべての Amazon S3 バケット (2022 年 12 月以降に開始されたオプトインリージョンを含む)
・AWS KMS による Amazon S3 サーバー側の暗号化 (SSE-KMS)
・Amazon S3 に対する動的なリクエスト (PUT と DELETE)
OAI は上記のリストのシナリオでは機能しないか、それらのシナリオでは追加の回避策が必要です。
OACを用いたS3へのアクセス制限
S3の設定
まずはAmazon S3 > バケット >バケットを作成に進み、バケット名を命名します。

ACL無効(推奨)、パブリックブロックアクセスをすべてブロック、を選択します。

上記以外の項目は変更せずそのまま進みます。

CloudFrontとOACの設定
CloudFront > ディストリビューションを作成を選択し、オリジンドメインを、先程作成したS3バケットに設定します。
ここでオリジンアクセスを、Origin access control settingsに設定すると、「S3 バケットポリシーを更新する必要があります」という警告文が画面に表示されます。

「コントロール設定を作成」から、名前が作成したS3バケットになっていることを確認し、オリジンタイプをS3にします。

ウェブアプリケーションファイアウォール (WAF)でセキュリティ保護を有効にし、以降の設定はそのままにしてディストリビューションを作成します。

ディストリビューションを作成したあとのCloudFrontの画面で、上部にS3バケットポリシー更新のお知らせが出てきます。
ポリシーをコピーし、「S3 バケットの権限に移動してポリシーを更新する」を選択します。

移動したS3バケットの画面で、アクセス許可>バケットポリシー>編集をクリックします。

このポリシーの編集画面で、先程コピーしたポリシーを貼り付けて、変更の保存を押します。
貼り付けた内容はこちら(画像のarn:aws:cloudfront::以降は削除していますが、皆さんは削除する必要ないです)

これで設定は完了です。
試しに、S3バケットにmyfile.htmlというファイルをアップロードしてCloudFront経由でアクセスしてみます。

例えば、CloudFront > ディストリビューション > 一般 > ディストリビューションドメイン名が xxx.cloudfront.net だとすると、 https://xxx.cloudfront.net/myfile.html のようにURLを指定してブラウザで開きます。
myfile.htmlには、This is some textというテキストを書いていたのですが、それが無事に表示されました。
また、S3への直接のアクセスなどは拒否される状態になっています。
これが、CloudFrontからS3にアクセスする際にOACによってアクセス制限が行われている状態です。
