AWSのCDNサービスCloudFrontのOAI・OAC機能についてまとめる。
1. 概要
OAI (Origin Access Identity)
- 概要
- CloudFront と S3 バケット間のアクセス制御に特化した仕組み。
- OAI を使用して、S3 バケットをパブリックアクセス不可にしつつ、CloudFront 経由でのみオブジェクトを取得可能にすることができる。
- S3 バケットポリシーで「CloudFront の OAI からのアクセスだけ許可」する形で制御する。
OAC (Origin Access Control)
- 概要
- OAI の後継的な機能。
- OAI と同様に、CloudFront からのアクセスのみをオリジンで許可する仕組みだが、より柔軟かつ拡張性が高い。
- S3 以外のオリジン(カスタムオリジンなど)にも対応可能で、今後は OAC の利用が推奨されつつある。
- OAIと比較して優れている点
- セキュリティ – OAC は、短期間のクレデンシャル、頻繁なクレデンシャルのローテーション、およびリソースベースのポリシーのような強化されたセキュリティプラクティスで実装されている。
- 包括的な HTTP メソッドのサポート – OAC は GET、PUT、POST、PATCH、DELETE、OPTIONS、および HEAD をサポートする。
- SSE-KMS – OAC は、SSE-KMS で暗号化された S3 オブジェクトのダウンロードとアップロードをサポートする。
2. 用途
OAI の用途
- S3 バケットの直接アクセスをブロック
- バケットを完全にプライベートにし、OAI を用いて CloudFront 経由でのみファイルにアクセスさせる。
- セキュアなコンテンツ配信
- S3 バケットの URL を隠蔽し、CloudFront のディストリビューション URL を通じたアクセスに統一。
OAC の用途
- OAI の拡張・代替機能として
- OAI から移行しやすく、機能的にはほぼ上位互換。
- 複数のオリジンタイプでの柔軟なアクセス制御
- S3 に限らず、カスタムオリジンや他の AWS サービス(Lambda@Edge など)にも対応。
- 将来のセキュリティ拡張への対応
- OAI では難しかったさらなる制御機能(IAM ポリシーとの連携など)に柔軟に対応可能。
3. 設定方法
OAI の設定方法
-
S3 バケットをプライベートに設定
- S3 コンソールやバケットポリシーで「パブリックアクセスをブロック」する。
-
CloudFront で OAI を作成
- CloudFront コンソールでディストリビューションを作成/編集する際に「オリジンアクセスアイデンティティの設定」から作成。
- 作成時に自動的にバケットポリシーへ反映するオプションを選択する/手動設定する。
-
バケットポリシーの設定
-
OAI に対して
s3:GetObject
を許可する。 -
例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXX" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-sample-bucket/*" } ] }
-
OAC の設定方法
- CloudFront コンソールでオリジンアクセスコントロール (OAC) を有効化
- 「オリジン」タブでオリジンを追加または編集し、「オリジンアクセスコントロールを作成」を選択。
- OAC のタイプを選択
- S3 バケットの場合は
S3Origin
として署名付きリクエスト(“Sign requests”)を設定。 - 必要に応じて "AWS シグネチャバージョン4" を使用するなど設定を行う。
- S3 バケットの場合は
- S3 バケットポリシーを自動または手動で更新
- OAC 作成時に CloudFront がバケットポリシーを自動生成・設定可能。
- 手動で行う場合は、OAC で作成された IAM エンティティ(または条件付きポリシー)を参照して、
s3:GetObject
を許可する。
- ディストリビューションをデプロイ
- 設定が完了したらディストリビューションを保存し、デプロイが完了するのを待つ。
4. 仕組み (シーケンス)
以下は、クライアントが OAI/OACを利用したCloudFront 経由で S3 からコンテンツを取得する流れ。
- OAI: CloudFront は OAI を用いて S3 バケットポリシーで許可された IAM ユーザとしてリクエストを行う。
- OAC: CloudFront は IAM シグネチャを使ってリクエストし、S3 側でその署名が有効かどうかチェックする(バケットポリシーまたは IAM ポリシーで制御)。