目標
S3で静的なWebサイトを公開する。
やること
バケットの作成
静的ウェブサイトホスティングの有効化
バケットポリシーの編集
ファイルのアップロード
バケットの作成
バケット名はグローバルで一意でなければならない。
また、独自ドメインを設定する場合はドメイン名と同じにする。
※ CloudFrontに対して独自ドメインを設定する場合は同じにする必要はない。
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_s3_bucket" "bucket" {
bucket = "{バケット名}"
}
静的ウェブサイトホスティングの有効化
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_s3_bucket" "bucket" {
bucket = "{バケット名}"
acl = "public-read"
website {
index_document = "index.html"
}
}
バケットポリシーの編集
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_s3_bucket" "bucket" {
bucket = "{バケット名}"
acl = "public-read"
website {
index_document = "index.html"
}
}
resource "aws_s3_bucket_policy" "bucket_policy" {
bucket = aws_s3_bucket.bucket.id
policy = data.aws_iam_policy_document.policy_document.json
}
data "aws_iam_policy_document" "policy_document" {
statement {
sid = "Statement1"
effect = "Allow"
principals {
type = "*"
identifiers = ["*"]
}
actions = [
"s3:GetObject"
]
resources = [
"${aws_s3_bucket.bucket.arn}/*"
]
}
}
ファイルのアップロード
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_s3_bucket" "bucket" {
bucket = "{バケット名}"
acl = "public-read"
website {
index_document = "index.html"
}
}
resource "aws_s3_bucket_policy" "bucket_policy" {
bucket = aws_s3_bucket.bucket.id
policy = data.aws_iam_policy_document.policy_document.json
}
data "aws_iam_policy_document" "policy_document" {
statement {
sid = "Statement1"
effect = "Allow"
principals {
type = "*"
identifiers = ["*"]
}
actions = [
"s3:GetObject"
]
resources = [
"${aws_s3_bucket.bucket.arn}/*"
]
}
}
resource "aws_s3_bucket_object" "bucket_object" {
bucket = aws_s3_bucket.bucket.id
key = "index.html"
source = "index.html"
content_type = "text/html"
}
今回は動作確認のため、以下の内容のファイルをアップロードして
「Hello, S3!」と表示されることを確認する。
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>【Terraform】S3で静的なWebサイトを公開する</title>
</head>
<body>
<p>Hello, S3!</p>
</body>
</html>
プロパティの静的ウェブサイトホスティングにある
バケットウェブサイトエンドポイントからアクセスする。
http://{バケット名}.s3-website-ap-northeast-1.amazonaws.com/
「Hello, S3!」と表示されれば完了。
おまけ
buildディレクトリのすべてのファイルをアップロードする。
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_s3_bucket" "bucket" {
bucket = "{バケット名}"
acl = "public-read"
website {
index_document = "index.html"
}
}
resource "aws_s3_bucket_policy" "bucket_policy" {
bucket = aws_s3_bucket.bucket.id
policy = data.aws_iam_policy_document.policy_document.json
}
data "aws_iam_policy_document" "policy_document" {
statement {
sid = "Statement1"
effect = "Allow"
principals {
type = "*"
identifiers = ["*"]
}
actions = [
"s3:GetObject"
]
resources = [
"${aws_s3_bucket.bucket.arn}/*"
]
}
}
module "template_files" {
source = "hashicorp/dir/template"
base_dir = "build"
}
resource "aws_s3_bucket_object" "bucket_object" {
for_each = module.template_files.files
bucket = aws_s3_bucket.bucket.id
key = each.key
source = each.value.source_path
content_type = each.value.content_type
}
課題
現在のURL: http://{バケット名}.s3-website-ap-northeast-1.amazonaws.com/
URLがカッコ悪い -> 独自ドメインの設定や常時SSL化などの対応が必要
参考
Terraform Registry
Terraform Registry
Terraform Registry