OACを使用してCloudFront経由でS3のコンテンツを公開する
はじめに
表題の通り、本記事はOACを用いてCloudFront経由でS3のコンテンツを公開することが目的ですが、CloudFrontを使用しない場合との差を確認しながら進める形をとります。
- CloudFrontを経由せずにS3のコンテンツを公開する
- CloudFrontを経由してS3のコンテンツを公開する
- S3からのアクセスを拒否する
といった流れで進ます。また、必要最低限の設定のみを行います。
CloudFrontを経由せずにS3のコンテンツを公開する
はじめは、CloudFrontを経由せずにS3の静的ウェブサイトホスティング機能を用いて、コンテンツを公開します。
S3バケットの作成
test-oac.com
というバケットを作成します。
次に「パブリックアクセスをすべてブロック」をオフにします。
「パブリックアクセスのブロックをすべてオフにすると、このバケットとバケット内のオブジェクトが公開される可能性があります。」といったメッセージが表示されると思いますが、気にせずにチェックをします。
その後、「バケットを作成」をクリックします。他の設定はデフォルトの値で問題ありません。
S3バケットにコンテンツを配置
S3バケットにアクセスするコンテンツを配置します。
今回はテスト用のページとして、HTML/CSS/JavaScriptの3ファイルを配置しました。私が使用したのは以下のようなファイルです。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>テストページ</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<h1>ようこそ、テストページへ!</h1>
<button id="messageButton">クリックしてメッセージを表示</button>
<p id="message" class="hidden">こんにちは!ボタンをクリックしました。</p>
</div>
<script src="script.js"></script>
</body>
</html>
body {
font-family: Arial, sans-serif;
background-color: #f0f0f0;
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.container {
text-align: center;
background-color: #ffffff;
padding: 20px;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
button {
padding: 10px 20px;
font-size: 16px;
border: none;
background-color: #3498db;
color: white;
border-radius: 5px;
cursor: pointer;
}
button:hover {
background-color: #2980b9;
}
.hidden {
display: none;
}
#message {
margin-top: 20px;
color: #2ecc71;
font-size: 18px;
}
document.getElementById("messageButton").addEventListener("click", function() {
var message = document.getElementById("message");
message.classList.remove("hidden");
});
静的ウェブサイトホスティングの設定
S3バケットの「プロパティ」>「静的ウェブサイトホスティング >「編集」の順にクリックします。
「静的ウェブサイトホスティング」を有効にします。
「インデックスドキュメント」にWebページのホームとなるファイル名を入力します。私の例だとindex.html
ファイルになります。
その後、設定を保存してください。
S3バケットの「プロパティ」タブの画面の最下に、http://test-oac.com.s3-website-ap-northeast-1.amazonaws.com
のようにURLが表示されるようになったと思います。これで静的ウェブサイトホスティングの設定は完了です。
S3バケットポリシーの設定
静的ウェブサイトホスティングの設定は完了しましたが、この状態でURLにアクセスしても403エラー(AccessDenied)となるはずです。これは、S3バケット自体へのアクセスを許可していないことが原因です。
S3バケットポリシーに以下の設定を加えることで、パブリックな読み取りを明示的に許可します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::test-oac.com/*"
]
}
]
}
これにより、http://test-oac.com.s3-website-ap-northeast-1.amazonaws.com
を閲覧することが可能になりました。
CloudFrontを経由してS3のコンテンツを公開する
次に、S3バケットに直接アクセスするのではなく、CloudFrontを経由してアクセスするように設定していきます。
初めにCloudFront > ディストリビューション > 「ディストリビューションを作成」とクリックします。
様々な設定値がありますが今回は簡略化のため以下のように設定しました。その他はデフォルトの設定のままにしました。
- Origin domain =>
test-oac.com.s3.ap-northeast-1.amazonaws.com
- オリンジンアクセス=>
Origin access control settings
を選択後、「Create new OAC」を選択して「create」を実行 - 許可された HTTP メソッド =>
GET, HEAD
- ウェブアプリケーションファイアウォール (WAF) =>
セキュリティ保護を有効にしないでください
- デフォルトルートオブジェクト =>
index.html
設定が完了するとディストリビューションが追加されていることが分かります。
このドメインにアクセスすると画面が表示されました。(私は設定が反映されるのに1分程度かかりました。)
以上でCloudFront経由でS3のファイルにアクセスする設定は完了です。
S3からのアクセスを拒否する
次にS3バケットから直接アクセスできないように設定をします。
S3バケットポリシーを編集する
現状のバケットポリシーでは、外部からのアクセスを全て許可している状態です。
これをCloudFront経由のみS3バケットへのアクセスを許可する設定に変更します。
{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "AllowCloudFrontServicePrincipal",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::test-oac.com/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::<アカウントID>:d1bgqmmu07kzsl.cloudfront.net"
}
}
}
]
}
パブリックアクセスを無効にする
以下のようにしてブロックします。
アクセスして確認
これで設定完了です。S3の静的ウェブサイトホスティングのURLを叩いた場合、権限エラーが表示されるようになっていることが確認できました。
おわりに
OACを用いてCloudFront経由でS3のコンテンツを公開することができました!
Discussion