서버리스 정적 웹사이트 호스팅

Chori·2024년 12월 26일
0
post-thumbnail

스스로 구축하는 AWS 클라우드 인프라 - 기본편을 수강하며 AWS 인프라를 Terraform으로 작성한 내용입니다.


정적 웹사이트 호스팅

  • S3 버킷에 html, 이미지 파일 등 콘텐츠를 업로드하고 정적 웹사이트 호스팅 기능을 설정하면 웹사이트처럼 작동

Terraform Backend 설정

  • backend.tf 파일을 아래와 같이 작성
terraform {
  backend "s3" {
    bucket = "aws-cloud-infra-practice-tfstate"
    key = "workspace/serverless-web-hosting/terraform.tfstate"
    region = "ap-northeast-2"
    encrypt = true
    dynamodb_table = "terraform-lock"
  }
}
  • provider.tf 파일을 아래와 같이 작성
provider "aws" {
  region = "us-east-1" 
}

S3 생성

  • s3.tf 파일을 아래와 같이 작성
resource "aws_s3_bucket" "main" {
  bucket = "s3-web-hosting-chori"

  tags = {
    Name = "s3-web-hosting-chori"
  }
}
  • terraform init, terraform plan -parallelism=30, terraform apply -parallelism=30 명령어를 순서대로 실행
  • AWS 콘솔에서 S3 버킷이 생성된 것을 확인

오브젝트 업로드

  • 웹사이트 호스팅 용도로 사용할 S3 버킷에 html 파일과 jpg 파일 업로드
  • objects 파일을 만들고 아래와 같이 작성
resource "aws_s3_object" "index_html" {
  bucket = aws_s3_bucket.main.id
  key = "mycar.html"
  source = "./mycar.html"
}

resource "aws_s3_object" "car_image" {
  bucket = aws_s3_bucket.main.id
  key = "car.jpg"
  source = "./car.jpg"
}

정적 웹사이트 호스팅을 위한 작업

1. 버킷의 웹사이트 호스팅 기능 활성화

  • s3.tf 파일 하단에 아래 내용을 추가
resource "aws_s3_bucket_website_configuration" "web_hosting" {
  bucket = aws_s3_bucket.main.id

  index_document {
    suffix = "mycar.html"
  }
}
  • index_documentsuffix = "mycar.html"은 기본적으로 보여줄 html 파일을 정의, 즉 기본 웹 페이지로 "mycar.html" 파일을 표시
  • terraform plan -parallelism=30, terraform apply -parallelism=30 명령어 실행

2. S3 버킷과 오브젝트의 액세스 권한 변경

  • s3.tf 파일에 아래 내용을 추가
resource "aws_s3_bucket_public_access_block" "public_access_block" {
  bucket = aws_s3_bucket.main.id

  block_public_acls = false
  block_public_policy = false
  ignore_public_acls = false
  restrict_public_buckets = false
}

resource "aws_s3_bucket_policy" "public_read_policy" {
  bucket = aws_s3_bucket.main.id
  policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Sid = "PublicReadGetObject",
        Effect = "Allow",
        Principal = "*",
        Action = "s3:GetObject",
        Resource = "${aws_s3_bucket.main.arn}/*"
      }
    ]
  })
}
  • 퍼블릭 액세스 차단을 비활성화하고 모두가 오브젝트에 접근할 수 있는 정책 부여
profile
전부인 것처럼, 전부가 아닌 것처럼

0개의 댓글