Undefined Title

awscliでAWS Static Website Hostingの404ページを設定する

2014-05-24

AWS S3のStatic Website Hostingを使うと静的サイトを簡単に公開できる。 もちろんこのサイトも使ってる(ジェネレータはmiddleman) Bucketのpropertiesで、Static Website Hosting -> Enable website hostingを選択すればいい。 そのときIndex Documentでインデックスページを指定したりできる。

設定箇所は2014/05/24現在、下のような感じ。

Error Documentの項目に404.htmlとか設定すると、存在しないpathにアクセスしたときにそのページを返してくれるんだけど、 よくよく見てみたらHTTPステータスコードは403 Forbiddenを返してた。

まあそれじゃあまずいということで404を返す方法を調べた。 404を返すようにする設定はもちろんWebコンソールからでもできるけど、今回はawscliを使ってやった。awscliはpipとかで入れてください。

s3 bucket policyというのを設定します。

aws s3api put-bucket-policy \
  --bucket blog.tmtk.net \
  --policy file://`pwd`/policy.json 

policy.jsonはこんな感じ。AWS Policy Generatorから作れます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::blog.tmtk.net/*"
        }
    ]
}

あとは上の画像の設定の部分。Index DocumentとError Documentを指定。

aws s3 website s3://blog.tmtk.net \
  --index-document index.html \
  --error-document 404.html

--error-documentだけの設定はできないので(ちょっとハマった)両方指定します。もちろん実際にindex.htmlとか404.htmlというS3オブジェクトが存在すること。

$ curl -I blog.tmtk.net/missing
HTTP/1.1 404 Not Found
x-amz-error-code: NoSuchKey
x-amz-error-message: The specified key does not exist.
x-amz-error-detail-Key: missing
x-amz-request-id: D776050FA60AA5CF
x-amz-id-2: eE00HBPSRKYCMjKy193ulPgb6UN0Kw2k5Jxe2ymrPg0Z7xbkmp20F8wEUZaPPGsN
Transfer-Encoding: chunked
Date: Sat, 24 May 2014 07:12:53 GMT
Server: AmazonS3

404、ちゃんと返ってきました。

Redirection Rulesの設定をするともっと細かい制御ができるみたいだけど、今はいいや。