どんなページでも公開する時はサーバーが必要になります。 静的なウェブサイト程度であれば、どの会社でも一番安いプランでも十分な事が多いです。
しかし、下記のような面倒が発生することもあります。
- 1年契約が必要だが、1年もサイトを公開しない。
- サーバーを増やしたい時、となると契約し直す必要がある。
そういった時は、AWS S3でサクッとバケットを作って、ネットを通してしまうと言う方法があります。
今回は、S3でとりあえずサイトを公開するまでの手順を解説します。
この記事で得られる知識
- S3バケットで静的なWebサイトを公開できる
S3バケットを用意
任意の名前でS3バケットを作ります。 S3の管理画面で、「Create buckets」を押下します。
名前とリージョンで、バケットの名前を入力し「次へ」ボタンを押下します。
プロパティの設定は、特に設定する事がなければそのまま「次へ」を押下します。
(作成後も修正できます。)
アクセス許可の設定は後で行うので、「次へ」を押下します。 もし、特定のAMIだけ許可/不許可にする場合は、アカウントの追加から追加してください。
確認で、入力内容が正しいか確認したら、「バケットを作成」を押下して作成完了。
S3バケットをhttpでアクセスできるように設定
S3バケットの公開設定
このままだと、非公開なので公開して、インターネットを引き込みます。
s3のバケットのポリシーを変更して、httpでアクセスできるようにします。
s3のトップ画面で、作成したbucketを選択します。
選択されたバケットの詳細画面に映りますので、パンくずメニューの下にあるタブから、「プロパティ」を選択します。
すると次の画面になりますので、「Static website hosting」を選択します。
「Static website hosting」の設定画面がポップアップで表示されます。
次の画像のように、「このバケットを使用してウェブサイトをホストする」を選択します。
インデックスドキュメントに、indexにするファイルを入力します。今回は「index.html」です。
これで、S3バケットが公開されます。
ポリシーの設定
これで公開はできたのですが、デフォルトではGetメソッドでアクセスすることすら許可されていないのでポリシーを追加します。
「プロパティ」の隣の「アクセス権限」タブを選択し、「バケットポリシー」を選択します。
バケットポリシーエディタ画面が開きますので、次のようにポリシーを入力してください。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", // 任意の識別子 "Effect": "Allow", // このステートメントの許可有無 Allowは許可(デフォルトはDeny) "Principal": "*", // リソースへのアクセス許可ユーザー。*はワイルドカード "Action": [ "s3:GetObject" // GETメソッドでアクセスするのを許可。 ], "Resource": [ "arn:aws:s3:::**********(追加したバケット)/*" // 対象のリソースをAmazon リソースネーム(ARN)形式で記載 ] } ] }
ポリシーに関する参考資料
- ポリシーのジェネレーター:policygenerateor
- Actionで指定できる要素について:IAM ポリシーエレメントのリファレンス
- ARNの指定方法について:Amazon リソースネーム (ARN) と AWS サービスの名前空間
公開するファイルをアップロードする
内容は何でも良いのですが、インデックスドキュメントに設定したファイルをS3にアップロードします。 awsコマンドの登録については、公式のドキュメントを参考にしてください。
$ cd (デプロイするディレクトリ) $ aws s3 sync . s3://**********(追加したバケット)
公開確認
再度、「Static website hosting」の設定画面を開きます。
エンドポイントと言う項目の隣に公開URLが乗っていますので、押下してブラウザで確認できればOKです。
Tips
アクセス制限の掛け方
s3のバケットでは、普通のサーバーのような操作でwebサーバーのアクセス制限をかけられません。
例えば、apacheでhtaccessを使ったBasic認証は出来ません。
そのため、ポリシーにIP制限の設定を追記します。
NotIpAddressに制限したいIPを記載します。
{ "Version": "2012-10-17", "Id": "S3PolicyId1", "Statement": [ { "Sid": "IPAllow", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::examplebucket/*", "Condition": { "IpAddress": {"aws:SourceIp": "54.240.143.0/24"}, "NotIpAddress": {"aws:SourceIp": "54.240.143.188/32"} } } ] }
サブネットマスクをCIDR形式で書く必要がありますので、もし、IPの範囲指定はせず、特定のIPだけ除外したい場合は「(指定したいIP)/32」と指定してください。
cliからバケットを扱う方法
sync以外のコマンドもあります。 詳細は次のドキュメントを参考にしてください。
作る
$ aws s3 mb s3://**********(作りたいバケット)
消す
$ aws s3 rb s3:///**********(消したいバケット)
一覧を見る
$ aws s3 ls
webサーバーは何使ってるの?
AmazonS3だそうです。
Amazon linuxではないようですね。
$ curl -D - -s -o /dev/null (公開したバケットのページ) HTTP/1.1 200 OK ... Server: AmazonS3 ...