Introduction
hi, i am Akshay Rao
This blog is about the installation of nginx in GCP VM through terraform.
Pre-requisite
GCP account (can get 300$ free trial account)
Terraform installed
VS-code
Let's start
- create a project in the gcp console.
- click on the tab beside google cloud logo and click new project, give name i have given it a terraform-gcp.
create a service account by searching service account in the search bar, click create service account-> give name -> add the editor role under basic.
create a keys for the service account and download the json file.
make a directory in which the terraform scripts will be stored and move the above downloaded json to this directory.
mv ~/Downloads/<file name> credentials.json
create a file named main.tf
- Provider block
provider "google" {
project = "<your project-id>"
credentials = "${file("credentials.json")}"
region = "us-west1"
zone = "us-west1-a"
}
now execute terraform init
this is done so that the terraform can connect to gcp.
.terraform.lock.hcl
.terraform
will be created automatically
provider will be registered.
- Resources block create a network , one subnetwork and VM instance in which the nginx will be running.
resource "google_compute_network" "vpc_network" {
name = "my-custom-network"
auto_create_subnetworks = false
mtu = 1460
}
resource "google_compute_subnetwork" "default" {
name = "us-west-a"
ip_cidr_range = "10.0.1.0/24"
region = "us-west1"
network = google_compute_network.vpc_network.id
}
resource "google_compute_instance" "nginx-instance" {
name = "nginx-intsance"
machine_type = "f1-micro"
tags = ["ssh"]
zone = "us-west1-a"
allow_stopping_for_update = true
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
metadata_startup_script = "sudo apt-get update; sudo apt-get install -y nginx; sudo systemctl start nginx" // renderning script from template file
network_interface {
subnetwork = "google_compute_subnetwork.default.id"
subnetwork_project = "<your project id>"
access_config {
// is included so that the vm gets external ip address
}
}
}
- mtu - maximum trasmiaaion unit.
- added boot as the debian 11 image.
- in the metadata_startup_script i have passed the installation commands for the nginx.
Deployment and Verify
save it
now run command terraform plan
and yes
terraform will know the what resources to create with plan command and it will create orderly when applied.
[akshay.rao terraform-gcp]$ terraform plan
data.template_file.nginx_installation: Reading...
data.template_file.nginx_installation: Read complete after 0s [id=cfbeb1ad70856f85403aaec9edaed46cdcd3ab215367abd5b1049f5a69a24fc1]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# google_compute_instance.nginx-instance will be created
+ resource "google_compute_instance" "nginx-instance" {
+ allow_stopping_for_update = true
+ can_ip_forward = false
+ cpu_platform = (known after apply)
+ current_status = (known after apply)
+ deletion_protection = false
+ guest_accelerator = (known after apply)
+ id = (known after apply)
+ instance_id = (known after apply)
+ label_fingerprint = (known after apply)
+ machine_type = "f1-micro"
+ metadata_fingerprint = (known after apply)
+ metadata_startup_script = <<-EOT
#!/bin/bash/
set -e
echo "** installing nginx **"
sudo apt-get update
sudo apt-get install -y nginx
sudo systemctl enable nginx
sudo systemctl restart nginx
echo "** Installation Complteted!! **"
echo "Welcome to Nginx which is deployed using Terraform!!!" > /var/www/html
echo "** Startup script completes!! **"
EOT
+ min_cpu_platform = (known after apply)
+ name = "nginx-intsance"
+ project = (known after apply)
+ self_link = (known after apply)
+ tags = [
+ "proxy",
]
+ tags_fingerprint = (known after apply)
+ zone = "us-west1-a"
+ boot_disk {
+ auto_delete = true
+ device_name = (known after apply)
+ disk_encryption_key_sha256 = (known after apply)
+ kms_key_self_link = (known after apply)
+ mode = "READ_WRITE"
+ source = (known after apply)
+ initialize_params {
+ image = "debian-cloud/debian-11"
+ labels = (known after apply)
+ size = (known after apply)
+ type = (known after apply)
}
}
+ network_interface {
+ ipv6_access_type = (known after apply)
+ name = (known after apply)
+ network = "default"
+ network_ip = (known after apply)
+ stack_type = (known after apply)
+ subnetwork = (known after apply)
+ subnetwork_project = (known after apply)
+ access_config {
+ nat_ip = (known after apply)
+ network_tier = (known after apply)
}
}
}
Plan: 1 to add, 0 to change, 0 to destroy.
now terraform apply
and yes
[akshay.rao terraform-gcp ]$ terraform apply
data.template_file.nginx_installation: Reading...
data.template_file.nginx_installation: Read complete after 0s [id=cfbeb1ad70856f85403aaec9edaed46cdcd3ab215367abd5b1049f5a69a24fc1]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# google_compute_instance.nginx-instance will be created
+ resource "google_compute_instance" "nginx-instance" {
+ allow_stopping_for_update = true
+ can_ip_forward = false
+ cpu_platform = (known after apply)
+ current_status = (known after apply)
+ deletion_protection = false
+ guest_accelerator = (known after apply)
+ id = (known after apply)
+ instance_id = (known after apply)
+ label_fingerprint = (known after apply)
+ machine_type = "f1-micro"
+ metadata_fingerprint = (known after apply)
+ metadata_startup_script = <<-EOT
#!/bin/bash/
set -e
echo "** installing nginx **"
sudo apt-get update
sudo apt-get install -y nginx
sudo systemctl enable nginx
sudo systemctl restart nginx
echo "** Installation Complteted!! **"
echo "Welcome to Nginx which is deployed using Terraform!!!" > /var/www/html
echo "** Startup script completes!! **"
EOT
+ min_cpu_platform = (known after apply)
+ name = "nginx-intsance"
+ project = (known after apply)
+ self_link = (known after apply)
+ tags = [
+ "proxy",
]
+ tags_fingerprint = (known after apply)
+ zone = "us-west1-a"
+ boot_disk {
+ auto_delete = true
+ device_name = (known after apply)
+ disk_encryption_key_sha256 = (known after apply)
+ kms_key_self_link = (known after apply)
+ mode = "READ_WRITE"
+ source = (known after apply)
+ initialize_params {
+ image = "debian-cloud/debian-11"
+ labels = (known after apply)
+ size = (known after apply)
+ type = (known after apply)
}
}
+ network_interface {
+ ipv6_access_type = (known after apply)
+ name = (known after apply)
+ network = "default"
+ network_ip = (known after apply)
+ stack_type = (known after apply)
+ subnetwork = (known after apply)
+ subnetwork_project = (known after apply)
+ access_config {
+ nat_ip = (known after apply)
+ network_tier = (known after apply)
}
}
}
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
google_compute_instance.nginx-instance: Creating...
google_compute_instance.nginx-instance: Still creating... [10s elapsed]
google_compute_instance.nginx-instance: Still creating... [20s elapsed]
google_compute_instance.nginx-instance: Creation complete after 22s [id=projects/terraform-gcp-388209/zones/us-west1-a/instances/nginx-intsance]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
now go to console and search for vm instances you will be able to see the vm running
click on ssh with open with browser window
the terminal will open
run command systemctl status nginx
you will get:-
we have insatlled nginx through terraform.
Thank you
Top comments (0)