Deploying a Static Website on AWS S3 Using Terraform
Published: 2024-06-27 18:22:22

## Introduction :
In this step-by-step guide, we’ll dive into deploying a static website on AWS S3 using Terraform! We’ll walk through the process of:
1. Automating S3 Bucket Creation: Terraform will handle creating the S3 bucket where your website files will reside.
2. Effortless Website Upload: We’ll configure Terraform to skip manual uploads by referencing your website files locally.
3. Public Access for All: Terraform will configure the S3 bucket policy to grant public read 
access, ensuring anyone can access your website.
4. Enabling Web Hosting: Terraform will transform your S3 bucket into a fully functional static website, ready to serve your content to the world.
By the end, you’ll have a Terraform script that automates the entire deployment process, saving you time and ensuring a secure and accessible website.

**Step 1: Setup Terraform**
1. Create a `terraform.tf` file to set up the Terraform and provider:

```
terraform {
 required_version = "1.7.4"
 required_providers {
 aws = {
 source = "hashicorp/aws"
version = "5.40.0"
 }
 }
}
provider "aws" {
 profile = "default"
 region = "ap-south-1"
}
```
**Terraform Configuration Block:**
terraform { ... }:This block defines the Terraform configuration itself.
required_version = "1.7.4": Specifies the minimum Terraform version required to run this configuration.
AWS Provider Block:
profile = "default": Uses the default AWS profile configured in your local AWS credentials.
region = "ap-south-1": Specifies the AWS region where your infrastructure will be deployed.

## Step 2: Configuration for S3 Bucket:
1. Create a `bucket.tf` file to store the Terraform configuration related to the S3 bucket:

```
resource "aws_s3_bucket" "terraform_demo" {
 bucket = "terraform-demo-43234"
}
resource "aws_s3_object" "terraform_index" {
 bucket = aws_s3_bucket.terraform_demo.id
 key = "index.html"
 source = "index.html"
 content_type = "text/html"
 etag = filemd5("index.html")
}
resource "aws_s3_bucket_website_configuration" "terraform_hosting" {
 bucket = aws_s3_bucket.terraform_demo.id
 index_document {
 suffix = "index.html"
 }
}
```

## Step 3: Configuration for Bucket Policy:
1. Create a `policy.tf` file to store the Terraform configuration related to the bucket policy for public 
access:
# S3 public access

```
resource "aws_s3_bucket_public_access_block" "terraform_demo" {
 bucket = aws_s3_bucket.terraform_demo.id
 block_public_acls = false
 block_public_policy = false
}
resource "aws_s3_bucket_policy" "open_access" {
 bucket = aws_s3_bucket.terraform_demo.id
policy = jsonencode({
 Version = "2012-10-17"
 Id = "Public_access"
 Statement = [
 {
 Sid = "IPAllow"
 Effect = "Allow"
 Principal = "*"
 Action = ["s3:GetObject"]
 Resource = "${aws_s3_bucket.terraform_demo.arn}/*"
 },
 ]
 })
 depends_on = [aws_s3_bucket_public_access_block.terraform_demo]
}
```

## Step 4: Configuration for Output Variable
1. Create an `output.tf` file to print out the URL to access the website:
Website URL
```
output "website_url" {
 value = "http://${aws_s3_bucket.terraform_demo.bucket}.s3-
website.${aws_s3_bucket.terraform_demo.region}.amazonaws.com"
}.
```

## Step 5: Initialize Terraform
1. Open the command prompt or terminal, navigate to the folder where the Terraform file is 
located, and run the below command:

```
terraform init
```
- Prepares Terraform’s working directory for managing infrastructure.

## Step 6: Terraform Validate
1. Run the below command to validate the Terraform configuration:

```
terraform validate

```
- Performs a static analysis of your Terraform configuration files.

## Step 7: Terraform Plan
1. Run the below command to review the intended changes to the infrastructure

```
terraform plan
```
- Used for understanding and reviewing the intended changes to your infrastructure.

## Step 8: Terraform Apply
1. Run the below command to execute the changes

```
terraform apply
```
- Executes the actions outlined in the plan generated by the Terraform plan.

## Step 9: Destroy:
1. Run the below command to tear down the infrastructure resources

```
terraform destroy
```
- The terraform destroy command tears down the infrastructure resources that your Terraform 
configuration currently manages.

## Conclusion:
In this comprehensive guide, we have walked through the process of deploying a static website on 
AWS S3 using Terraform. By following the step-by-step instructions outlined above, you can automate 
the creation of S3 buckets, effortlessly upload your website files, configure public access policies, and 
enable web hosting with ease