DEV Community

Cover image for Day 03 - Provisioning Your First AWS S3 Bucket with Terraform
Tran Huynh An Duy (Andy)
Tran Huynh An Duy (Andy)

Posted on

Day 03 - Provisioning Your First AWS S3 Bucket with Terraform

As you embark on your journey into Infrastructure as Code (IaC), understanding how to translate simple resource needs into code is the essential first step. Terraform enables us to define infrastructure, ensuring consistency and efficiency. This blog post walks through the process of provisioning the simplest possible resource on AWS: an S3 bucket, leveraging the core Terraform workflow.

The Foundation: Configuration and Resource Definition

To begin provisioning any resource, you must first define your configuration in a file that uses the .tf extension (e.g., main.tf). Terraform recognizes this extension as a configuration file.
Before defining the resource itself, you must ensure the AWS Provider is configured, typically specifying a default region. The provider handles the crucial task of translating your HashiCorp Configuration Language (HCL) code into AWS API calls.

Workflow

For our task creating an S3 bucket, we consult the Terraform documentation to find the required resource type: aws_s3_bucket.

Code Example: Defining the S3 Bucket
The resource definition starts with the resource block, followed by the resource type and an internal name (e.g., firstbucket), which is used to reference the resource within other Terraform configurations. Crucially, the bucket name provided must be unique across all AWS regions.

We also define tags using key value pairs, which are presented as a string data type enclosed in curly braces.

// main.tf: Defining the AWS Provider and the S3 Resource

provider "aws" {
  // Define your default region
  region = "us-east-1" 
}

resource "aws_s3_bucket" "firstbucket" {
  // The bucket name must be globally unique
  bucket = "tech-tutorials-my-unique-bucket-2024" 

  // Tags (key-value pairs) for identification
  tags = {
    Name        = "my bucket 2.0" 
    Environment = "dev"
  }
}
Enter fullscreen mode Exit fullscreen mode

The Four Major Terraform Commands

Once the .tf file is ready, we use the core Terraform command workflow to manage the lifecycle of the resource:

1. Initialization (terraform init)

This is the mandatory first step. It initializes the Terraform environment, downloading the necessary provider plugin binary and initializing the backend.

terraform init

2. Planning (terraform plan)

Running terraform plan performs a dry run. It compares your configuration file with the existing environment (or the current state file) and reports exactly what changes will be made. For initial creation, the plan will state that there is "one resource to add".

terraform plan

3. Application (terraform apply)

The terraform apply command is responsible for executing the provisioning by calling the AWS API. By default, it prompts the user to type yes for approval. To automate the process and skip this prompt, you can use the --auto-approve flag: terraform apply -auto-approve. Once complete, the output will confirm the resource creation and provide its ID.

terraform apply

4. Destruction (terraform destroy)

To clean up resources and save costs, particularly for non-production environments, the terraform destroy command is used. Like apply, it asks for confirmation unless used with the -auto-approve flag.

terraform destroy

Diagram: The Simple Terraform Workflow

This diagram illustrates the relationship between the configuration file and the necessary commands to manage the S3 resource lifecycle:

Simple Terraform Workflow

Handling Modifications and The State File

Terraform doesn't just create resources; it manages them throughout their lifespan. If you change a parameter in your configuration file, such as updating a tag name (e.g., changing my bucket to my bucket 2.0), Terraform knows exactly what to do.

Change description

When you run terraform plan after a change, it compares the updated configuration against the state file (which tracks the actual state of the deployed infrastructure). The plan will then reflect "one to change" and "zero to add, zero to destroy". Running terraform apply executes only the specific modification, demonstrating Terraform’s ability to prevent manual configuration drift and ensuring consistency across updates.

These four fundamental commands allow a beginner to successfully define, provision, modify, and destroy cloud infrastructure with simplicity and accuracy.


Video from original challenge

Below is the foundational video that demonstrates the practical steps of creating an S3 bucket and utilizing these core Terraform commands from @piyushsachdeva

Top comments (0)