Before starting, ensure you have a basic understanding of:
-
Basic Terraform Knowledge
-
Understanding of CI/CD
-
GitLab CI Knowledge
-
AWS Account Creation
- Check out the official site to create an AWS account here.
-
GitLab Account
-
Login to GitLab.
-
Sign in via GitHub/Gmail.
-
Verify email and phone.
-
Fill up the questionnaires.
-
Provide group name & project name as per your choice.
-
-
Terraform Installed
-
Check out the official website to install Terraform here.
-
-
AWS CLI Installed
-
Navigate to the IAM dashboard on AWS, then select "Users."
-
Enter the username and proceed to the next step.
-
Assign permissions by attaching policies directly, opting for "Administrator access," and then create the user.
-
Locate "Create access key" in user settings, and choose the command line interface (CLI) option to generate an access key.
-
View or download the access key and secret access key either from the console or via CSV download.
sudo apt install unzip curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install aws configure (input created access key id and secret access key) cat ~/.aws/config cat ~/.aws/credentials aws iam list-users (to list all IAM users in an AWS account)
-
-
Code Editor (VS Code)
- Download it from here.
The project is divided into two parts:
-
Manual Setup: Write Terraform code, run Terraform commands, and create infrastructure manually.
-
Automation: Create a CI/CD pipeline script on GitLab to automate Terraform resource creation.
-
Create a new folder named โcicdtfโ and open it in VS Code to start writing the code.
-
Write Terraform code in the โcicdtfโ folder:
-
Create a file called
provider.tf
to define a provider. -
Deploy a VPC, a security group, a subnet, and an EC2 instance.
-
-
Files:
-
main.tf
: Defines resources like VPC, subnets, and security groups. -
variables.tf
: Declares input variables for customization. -
outputs.tf
: Specifies outputs like VPC ID, subnet IDs, etc.
-
-
Files:
-
main.tf
for VPC Module
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_support = true
enable_dns_hostnames = true
}
resource "aws_subnet" "main" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
map_public_ip_on_launch = true
availability_zone = "us-east-1a"
}
resource "aws_security_group" "main" {
vpc_id = aws_vpc.main.id
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
-
Define
outputs.tf
in the VPC module:output "pb_sn" { value = aws_subnet.main.id } output "sg" { value = aws_security_group.main.id }
-
Define
variables.tf
in the EC2 module:variable "subnet_id" {} variable "security_group_id" {}
- Initialize and Validate Terraform:
terraform init
terraform validate
terraform plan
terraform apply -auto-approve
- Backend Configuration:
- Set up a backend using S3 and DynamoDB.
# backend.tf
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "terraform/state"
region = "us-east-1"
dynamodb_table = "terraform-lock"
}
}
- Push Code to GitLab:
-
Initialize the GitLab repository and create a
.gitignore
file. -
Create a branch named "dev" and push the code.
git remote add origin https://gitlab.com/your-repo.git
git checkout -b dev
git add .
git commit -m "initial commit"
git push -u origin dev
-
Write a
.gitlab-ci.yml
file to automate Terraform commands. -
Store access keys and secret access keys in GitLab CI/CD variables.
# .gitlab-ci.yml
image: hashicorp/terraform:latest
variables:
TF_LOG: DEBUG
TF_IN_AUTOMATION: true
cache:
paths:
- .terraform/
stages:
- validate
- plan
- apply
- destroy
validate:
script:
- terraform init
- terraform validate
plan:
script:
- terraform plan -out=planfile
artifacts:
paths:
- planfile
apply:
script:
- terraform apply "planfile"
when: manual
destroy:
script:
- terraform destroy -auto-approve
when: manual
-
Validate stage:
terraform init
andterraform validate
-
Plan stage:
terraform plan
-
Apply stage:
terraform apply
-
The pipeline performs the following steps:
-
Initializes Terraform with the specified backend configuration.
-
Applies the Terraform plan to create infrastructure resources (VPC, Subnet, Security Group, and EC2 instance).
-
Saves
.terraform
directory to cache for future use. -
Cleans up the environment after the job is completed.# INFRA_AUTO_PROJECT
-