最終的なコードはこちらです。
Terraformコンテナを使用してS3に静的サイトをホスティングする所まで行います。
環境
- Docker version20.10.10
- Windows10
- Terraform version 1.2.4
- provider hashicorp/aws 4.21.0
構築方法
docker-compose.yml
version: '3'
services:
terraform:
image: hashicorp/terraform:1.2.4
env_file:
- .env
volumes:
- ./terraform:/terraform
working_dir: /terraform
entrypoint: ash
tty: true
.env
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWSアクセスキー等をプッシュしてしまわないようにgitignoreを作成します。
.gitignore
.env
terraformフォルダに公式のterraform.gitignoreを配置します。
./terraform/.gitignore
# Local .terraform directories
**/.terraform/*
# .tfstate files
*.tfstate
*.tfstate.*
# Crash log files
crash.log
crash.*.log
# Exclude all .tfvars files, which are likely to contain sensitive data, such as
# password, private keys, and other secrets. These should not be part of version
# control as they are data points which are potentially sensitive and subject
# to change depending on the environment.
*.tfvars
*.tfvars.json
# Ignore override files as they are usually used to override resources locally and so
# are not checked in
override.tf
override.tf.json
*_override.tf
*_override.tf.json
# Include override files you do wish to add to version control using negated pattern
# !example_override.tf
# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
# example: *tfplan*
# Ignore CLI configuration files
.terraformrc
terraform.rc
S3に静的ウェブサイトをホスティングしてみる
動作確認としてS3に静的ウェブサイトをホスティングします。
./terraform/provider.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "4.21.0"
}
}
required_version = "1.2.4"
}
provider "aws" {
region = "ap-northeast-1"
}
./terraform/main.tf
resource "aws_s3_bucket" "website" {
bucket_prefix = "sample"
}
resource "aws_s3_bucket_policy" "website" {
bucket = aws_s3_bucket.website.id
policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::${aws_s3_bucket.website.id}/*"
]
}
]
}
POLICY
}
resource "aws_s3_bucket_website_configuration" "website" {
bucket = aws_s3_bucket.website.bucket
index_document {
suffix = "index.html"
}
}
resource "aws_s3_bucket_object" "index" {
key = "index.html"
bucket = aws_s3_bucket.website.id
source = "index.html"
content_type = "text/html"
}
./terraform/index.html
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>My Website Home Page</title>
</head>
<body>
<h1>Welcome to my website</h1>
<p>Now hosted on Amazon S3!</p>
</body>
</html>
Terminal
docker-compose up -d
docker-compose exec terraform ash
terraform init
terraform apply
コマンドでサイトのアドレスを確認します。
Terminal
docker-compose exec terraform ash
terraform state show aws_s3_bucket_website_configuration.website

サイトのエンドポイントが出力されるのでブラウザからアクセスします。

上記ページが表示されたら成功です。
AWSリソース及びコンテナをクリーンアップします。
Terminal
docker-compose exec terraform ash
terraform destroy
exit
docker-compose down