こんにちは。 技術課の山本です。 秋が近いですね。
先日、2022 年 8 月 25 日に 「Amazon CloudFront が Origin Access Control を提供するようになりました。」というアナウンスがありました。
S3 バケットで公開しているコンテンツを、CloudFront からのアクセスのみに制限するためにある、CloudFront の機能です。
今までは Origin Access Identity (OAI)という機能で実現していました。
CloudFront + S3 の構成を新しく作成する場合には、Origin Access Control (OAC)を使用すると良さそうです。
一方で、Origin Access Identity も引き続き使えるようですので、切り替え等はまだ考えなくても良さそうです。
ただ、セキュリティ面の強化や、今後のことも考えると移行した方が良いでしょう。
新しく提供されている Origin Access Control では、以下の強化をしているようです。
- AWS Signature Version 4(SigV4) を必要とする AWS リージョンでの POST メソッドを使用した HTTP および HTTPS リクエストに対応
- SSE-KMS との連携に対応
詳細に書こうと思っていたら、公式さんがブログを書いてくれていました。
以下を参照していただければと思います。
Terraform
Terraform を使っている場合は、以下の記事もご参照ください。
Amazon CloudFront の Origin Access Identity を Origin Access Control (OAC) に切り替える。Terraform編。 - サーバーワークスエンジニアブログ
Origin Access Identity を Origin Access Control (OAC) に切り替えてみる。
Origin Access Identity を Origin Access Control (OAC) に切り替えたい、という方のために、手順を確認してみました。
以下、手順です。
CloudFront の オリジン設定を見てみると "Origin access Identities" が "Legacy access Identities" に変わっています。
推奨(recommended)になっている "Origin access control settings (recommended)" を選択し「コントロール設定を作成」を押します。
「作成」を押します。設定値の詳細は上に載せた公式のブログを参照ください。
自動生成のS3バケットポリシー(Origin Access Control用)をコピーします。
適当なファイル名で保存しておきます。
CloudFront の オリジンになっているS3を、S3のサービス画面から確認し、バケットポリシー(Origin Access Identity用)をコピーします。
上で保存した自動生成のバケットポリシー(Origin Access Control用)に、今のバケットポリシー(Origin Access Identity用)をマージします。"Statement" セクション内"Sid"が1つ増えるようにしてマージする形になります。
サンプルです。testetetetetetetettest はオリジンのS3バケット名です。
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "AllowCloudFrontServicePrincipal", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::testetetetetetetettest/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/HOGEHOGE" } } }, { "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity OAIOAIOAIOIOI" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::testetetetetetetettest/*" } ] }
マージしたバケットポリシーに更新します。これにより、CloudFront を更新するタイミングでこのWEBサイトに接続しているユーザーが、Origin Access Identity で 引き続きS3 オリジンのコンテンツに接続できます。
CloudFront のサービス画面に戻り、オリジンへの変更 (OAI→OAC) を保存します。
CloudFront が「デプロイ中」状態になります。この間は Origin Access Identity と Origin Access Control の両方を利用しているユーザーがいる状態になります。
サイトにアクセスできました。
少しすると、CloudFront の「デプロイ中」状態が消え、デプロイが完了しました。
S3 のバケットポリシーから、Origin Access Identity用のポリシーを削除します。
サンプルです。
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "AllowCloudFrontServicePrincipal", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::testetetetetetetettest/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/HOGEHOGE" } } } ] }
サイトにアクセスできました。
まとめ
Origin Access Identity を Origin Access Control (OAC) に切り替える方法を紹介しました。
山本 哲也 (記事一覧)
カスタマーサクセス部のエンジニア。2024 Japan AWS Top Engineers に選んでもらいました。
今年の目標は Advanced Networking – Specialty と Machine Learning - Specialty を取得することです。
山を走るのが趣味です。今年の目標は 100 km と 100 mile を完走することです。 100 km は Gran Trail みなかみで完走しました。OSJ koumi 100 で 100 mile 砕け散りました。どこかで 100 mile やりたいです。
基本的にのんびりした性格です。座右の銘は「いつか着く」