TerraformでS3の静的ウェブサイトのウェブホスティングを構築する

AWSの静的ウェブサイトのウェブホスティングとは

静的ウェブサイトを Amazon Simple Storage Service (Amazon S3) でホスティングできます。

つまり、静的コンテンツであれば、S3に配置することでEC2などのサーバーを管理することなく、ウェブサイトが公開可能。

Amazon S3 での静的ウェブサイトのホスティング

ということで、TerraformでS3のウェブホスティングを構築したのでまとめる。
TerraformでAWSにアクセスして、S3のバケットを作成したり、更新したりできる権限がある前提。
今回は外部へ公開しない前提で作る。

bucketの作成

resource "aws_s3_bucket" "website_hosting_inamuu_com" {
  bucket = "website-hosting.inamuu.com"
  acl    = "public-read"
  policy = "${file("files/s3/policy/website_hosting_inamuu.com.json")}"

  website {
    index_document = "index.html"
    error_document = "error.html"
  }
}

これだけでwebホスティングとして公開するバケットを作成できる
なお、ポリシーの箇所は人によってはヒアドキュメントを使って書くことも可能。※ファイルが長くなってしまうので私は今のところはポリシー用のファイルはリソースと分けるようにしている。
また、SPAとかで公開していると、別のURLになったときにindex.htmlを見に行かないので、エラーになったりする。
その場合は error_documentもindex.htmlにすることで回避できる。
ポリシーは下記の通り。

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Sid": "AddPerm",
          "Effect": "Allow",
          "Principal": "*",
          "Action": "s3:GetObject",
          "Resource": "arn:aws:s3:::web-hosting.inamuu.com/*",
          "Condition": {
              "IpAddress": {
                  "aws:SourceIp": [
                      "X.X.X.X",
                      "X.X.X.X"
                  ]
              }
          }
      }
  ]
}

接続元のIPアドレス制限をするのでConditionを指定しているが、もしIP制限をしなければそこを削除するだけで良い。
これだけでとても簡単に構築することができる。
なお、例えば hogehoge.com にAliasとしてRoute53で割当をしたい場合、hogehoge.com というバケット名にしないと設定できないので注意が必要。
Terraformでかなり簡単に作成することができた。
今後もs3バケットは作成することが多々あると思うので、活用していきたい。