サーバーレスのススメ S3で静的コンテンツサーバーを立てる

どんなページでも公開する時はサーバーが必要になります。 静的なウェブサイト程度であれば、どの会社でも一番安いプランでも十分な事が多いです。

しかし、下記のような面倒が発生することもあります。

  • 1年契約が必要だが、1年もサイトを公開しない。
  • サーバーを増やしたい時、となると契約し直す必要がある。

そういった時は、AWS S3でサクッとバケットを作って、ネットを通してしまうと言う方法があります。
今回は、S3でとりあえずサイトを公開するまでの手順を解説します。

この記事で得られる知識

  • S3バケットで静的なWebサイトを公開できる

S3バケットを用意

任意の名前でS3バケットを作ります。 S3の管理画面で、「Create buckets」を押下します。 f:id:nakahashi_h:20171216004743p:plain

名前とリージョンで、バケットの名前を入力し「次へ」ボタンを押下します。 f:id:nakahashi_h:20171216005127p:plain

プロパティの設定は、特に設定する事がなければそのまま「次へ」を押下します。
(作成後も修正できます。) f:id:nakahashi_h:20171216005448p:plain

アクセス許可の設定は後で行うので、「次へ」を押下します。 もし、特定のAMIだけ許可/不許可にする場合は、アカウントの追加から追加してください。 f:id:nakahashi_h:20171216005629p:plain

確認で、入力内容が正しいか確認したら、「バケットを作成」を押下して作成完了。 f:id:nakahashi_h:20171216013732p:plain

S3バケットをhttpでアクセスできるように設定

S3バケットの公開設定

このままだと、非公開なので公開して、インターネットを引き込みます。
s3のバケットのポリシーを変更して、httpでアクセスできるようにします。

s3のトップ画面で、作成したbucketを選択します。
選択されたバケットの詳細画面に映りますので、パンくずメニューの下にあるタブから、「プロパティ」を選択します。
すると次の画面になりますので、「Static website hosting」を選択します。

f:id:nakahashi_h:20171216013201p:plain

「Static website hosting」の設定画面がポップアップで表示されます。
次の画像のように、「このバケットを使用してウェブサイトをホストする」を選択します。
インデックスドキュメントに、indexにするファイルを入力します。今回は「index.html」です。

f:id:nakahashi_h:20171216011059p:plain

これで、S3バケットが公開されます。

ポリシーの設定

これで公開はできたのですが、デフォルトではGetメソッドでアクセスすることすら許可されていないのでポリシーを追加します。
「プロパティ」の隣の「アクセス権限」タブを選択し、「バケットポリシー」を選択します。
f:id:nakahashi_h:20171216011524p:plain

バケットポリシーエディタ画面が開きますので、次のようにポリシーを入力してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",   // 任意の識別子
            "Effect": "Allow",  // このステートメントの許可有無 Allowは許可(デフォルトはDeny)
            "Principal": "*",  // リソースへのアクセス許可ユーザー。*はワイルドカード
            "Action": [
                "s3:GetObject"  // GETメソッドでアクセスするのを許可。
            ],
            "Resource": [
                "arn:aws:s3:::**********(追加したバケット)/*"  // 対象のリソースをAmazon リソースネーム(ARN)形式で記載
            ]
        }
    ]
}

ポリシーに関する参考資料

公開するファイルをアップロードする

内容は何でも良いのですが、インデックスドキュメントに設定したファイルをS3にアップロードします。 awsコマンドの登録については、公式のドキュメントを参考にしてください。

$ cd  (デプロイするディレクトリ)
$ aws s3 sync . s3://**********(追加したバケット)

公開確認

再度、「Static website hosting」の設定画面を開きます。
エンドポイントと言う項目の隣に公開URLが乗っていますので、押下してブラウザで確認できればOKです。
f:id:nakahashi_h:20171216011951p:plain

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以外のコマンドもあります。 詳細は次のドキュメントを参考にしてください。

docs.aws.amazon.com

作る

$ 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
...