はじめに
AWS上で静的ウェブサイトのホスティングやアセット配信を行う際、Amazon S3とAmazon CloudFrontの組み合わせは定番の構成です。しかし、S3バケットを直接公開してしまうと、セキュリティ上のリスクや予期せぬ転送量コストが発生する可能性があります。
本記事では、S3バケットへの直接アクセスを遮断し、CloudFront経由のアクセスのみをセキュアに許可する最新のベストプラクティスである「OAC(Origin Access Control)」の設定手順をステップバイステップで分かりやすく解説します。
前提知識/必要な理由
従来の構成では「OAI(Origin Access Identity)」が使われていましたが、AWSは現在、より堅牢で機能が拡張された「OAC(Origin Access Control)」への移行を強く推奨しています。
OACを採用すべき主な理由は以下の通りです。
- セキュリティの向上: HTTP POSTやPUTなどのリクエストに対応し、SSE-KMSによる暗号化オブジェクトへのアクセスもサポートしています。
- ダイレクトアクセスの防止: S3のパブリックアクセスをすべてブロックしたまま、CloudFrontからのアクセスのみを厳格に許可できます。
- すべてのAWSリージョンに対応: 新しいリージョンを含むすべてのAWSリージョンで統合された運用が可能です。
具体的な設定手順・設計方法
ステップ1:S3バケットの作成と非公開化
まずはコンテンツを格納するS3バケットを作成します。
- AWSマネジメントコンソールでS3を開き、「バケットを作成」をクリックします。
- バケット名を入力し、リージョンを選択します。
- 「このバケットのブロックパブリックアクセス設定」で、「すべてのパブリックアクセスをブロック」にチェックが入っていることを確認します。
- 「バケットを作成」を実行します。
ステップ2:CloudFrontディストリビューションの作成とOACの設定
次に、S3の前段に配置するCloudFrontディストリビューションを作成します。
- CloudFrontコンソールを開き、「ディストリビューションを作成」を選択します。
- 「オリジンドメイン」にステップ1で作成したS3バケットを選択します。
- 「オリジンアクセス」の項目で「Origin access control settings (recommended)」を選択します。
- 「コントロール設定を作成」をクリックし、デフォルト設定のまま作成して割り当てます。
ステップ3:S3バケットポリシーの更新
ディストリビューション作成後、CloudFrontからのアクセスのみを許可するバケットポリシーをS3に適用します。
S3バケットの「アクセス許可」タブを開き、バケットポリシーに以下のJSON形式のポリシーを設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudFrontServicePrincipal",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::【ご自身のバケット名】/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::【アカウントID】:distribution/【ディストリビューションID】"
}
}
}
]
}
補足:AWS CLIによる検証手順と環境構築
構築後の動作確認や自動化スクリプトを実行するためにAWS CLIを使用する場合は、あらかじめPythonの標準パッケージ管理ツール(pip)等を利用してツールをインストールしておきます。
# AWS CLIのインストール補足手順
pip install awscli
# インストール後の動作確認
aws --version
# S3へテストファイルをアップロードするコマンド例
aws s3 cp index.html s3://【ご自身のバケット名】/index.html
実務での注意点
- キャッシュの反映遅延(Invalidationの必要性): S3上のファイルを更新しても、CloudFrontのエッジサーバーにキャッシュが残っている場合は即座に反映されません。実務ではデプロイ時にInvalidation(キャッシュ削除)を実行する運用を設計しましょう。
- KMS暗号化使用時の権限追加: S3バケットでSSE-KMS暗号化を使用している場合、CloudFrontがKMSキーを使用できるようにKMSキーポリシーにも権限を追加する必要があります。
- OAIからの移行: 既存環境がOAIを使用している場合は、ポリシーを書き換える前にダウンタイムの発生有無や影響範囲を十分に検証してください。
まとめ
S3とCloudFrontを連携させる際、OACを利用することで高水準なセキュリティを簡単に実現できます。S3のパブリックアクセスを全遮断した上でCloudFront経由のみに絞り込む設定は、インフラ設計における必須のベストプラクティスです。ぜひ本手順を参考に、セキュアな配信環境を構築してみてください。