Website based on LAMP or LEMP stack using Terraform
To create an infrastructure for a website on the LAMP or LEMP stack using Terraform:
We will use the example.com domain name as an example.
If you no longer need the resources you created, delete them.
Get your cloud ready
Sign up for Yandex Cloud and create a billing account:
- Navigate to the management console
and log in to Yandex Cloud or create a new account. - On the Yandex Cloud Billing
page, make sure you have a billing account linked and it has theACTIVEorTRIAL_ACTIVEstatus. If you do not have a billing account, create one and link a cloud to it.
If you have an active billing account, you can navigate to the cloud page
Learn more about clouds and folders here.
Required paid resources
The infrastructure support costs for a website include:
- Fee for a continuously running VM (see Yandex Compute Cloud pricing).
- Fee for using a public IP address (see Yandex Virtual Private Cloud pricing).
- Fee for public DNS queries and DNS zones if using Yandex Cloud DNS (see Cloud DNS pricing).
Create your infrastructure
With Terraform
Terraform is distributed under the Business Source License
For more information about the provider resources, see the relevant documentation on the Terraform
To create an infrastructure using Terraform:
-
Specify the source for installing the Yandex Cloud provider (see Configure your provider, step 1).
-
Set up your infrastructure description files:
Ready-made archiveManually- Create a directory.
- Download the archive
(1 KB). - Unpack the archive to the directory. As a result, it should contain the
lamp-lemp.tfconfiguration file and thelamp-lemp.auto.tfvarsuser data file.
-
Create a folder for the infrastructure description file.
-
In the directory, create a configuration file named
lamp-lemp.tf:lamp-lemp.tf
# Declaring variables for custom parameters variable "zone" { type = string } variable "folder_id" { type = string } variable "vm_image_family" { type = string } variable "vm_user" { type = string } variable "ssh_key_path" { type = string } variable "dns_zone" { type = string } # Adding other variables locals { network_name = "web-network" subnet_name = "subnet1" sg_vm_name = "sg-web" vm_name = "lamp-vm" dns_zone_name = "example-zone" } # Configuring a provider terraform { required_providers { yandex = { source = "yandex-cloud/yandex" version = ">= 0.47.0" } } } provider "yandex" { folder_id = var.folder_id } # Creating a cloud network resource "yandex_vpc_network" "network-1" { name = local.network_name } # Creating a subnet resource "yandex_vpc_subnet" "subnet-1" { name = local.subnet_name v4_cidr_blocks = ["192.168.1.0/24"] zone = var.zone network_id = yandex_vpc_network.network-1.id } # Creating a security group resource "yandex_vpc_security_group" "sg-1" { name = local.sg_vm_name network_id = yandex_vpc_network.network-1.id egress { protocol = "ANY" description = "any" v4_cidr_blocks = ["0.0.0.0/0"] } ingress { protocol = "TCP" description = "ext-http" v4_cidr_blocks = ["0.0.0.0/0"] port = 80 } ingress { protocol = "TCP" description = "ext-https" v4_cidr_blocks = ["0.0.0.0/0"] port = 443 } } # Adding a prebuilt VM image resource "yandex_compute_image" "lamp-vm-image" { source_family = var.vm_image_family } resource "yandex_compute_disk" "boot-disk" { name = "bootvmdisk" type = "network-hdd" zone = "ru-central1-a" size = "20" image_id = yandex_compute_image.lamp-vm-image.id } # Creating a VM instance resource "yandex_compute_instance" "vm-lamp" { name = local.vm_name platform_id = "standard-v3" zone = var.zone resources { core_fraction = 20 cores = 2 memory = 1 } boot_disk { disk_id = yandex_compute_disk.boot-disk.id } network_interface { subnet_id = yandex_vpc_subnet.subnet-1.id nat = true security_group_ids = [yandex_vpc_security_group.sg-1.id] } metadata = { user-data = "#cloud-config\nusers:\n - name: ${var.vm_user}\n groups: sudo\n shell: /bin/bash\n sudo: 'ALL=(ALL) NOPASSWD:ALL'\n ssh_authorized_keys:\n - ${file("${var.ssh_key_path}")}" } } # Creating a DNS zone resource "yandex_dns_zone" "zone1" { name = local.dns_zone_name zone = var.dns_zone public = true } # Creating a type A resource record resource "yandex_dns_recordset" "rs-a" { zone_id = yandex_dns_zone.zone1.id name = var.dns_zone type = "A" ttl = 600 data = [ yandex_compute_instance.vm-lamp.network_interface.0.nat_ip_address ] } # Creating a CNAME resource record resource "yandex_dns_recordset" "rs-cname" { zone_id = yandex_dns_zone.zone1.id name = "www" type = "CNAME" ttl = 600 data = [ var.dns_zone ] } -
In the directory, create a user data file named
lamp-lemp.auto.tfvars:lamp-lemp.auto.tfvars
zone = "<availability_zone>" folder_id = "<folder_ID>" vm_image_family = "<VM_image_family>" vm_user = "<VM_username>" ssh_key_path = "<path_to_public_SSH_key>" dns_zone = "<DNS_zone>"
Learn more about the properties of Terraform resources in the relevant provider guides:
-
In the
lamp-lemp.auto.tfvarsfile, set the following user parameters:zone: Availability zone the VM will reside in.folder_id: Folder ID.family_id: Specify the family of a VM image with the required components:vm_user: VM user name.ssh_key_path: Path to the file with a public SSH key to authenticate the user on the VM. For more information, see Creating an SSH key pair.dns_zone: DNS zone. Specify your registered domain with a period at the end, e.g.,example.com..
To use domain names in the public DNS zone, you need to delegate it to authoritative name servers. Specifyns1.yandexcloud.netandns2.yandexcloud.netserver addresses in your registrar's account settings.
-
Create the resources:
-
In the terminal, go to the directory where you edited the configuration file.
-
Make sure the configuration file is correct using this command:
terraform validateIf the configuration is correct, you will get this message:
Success! The configuration is valid. -
Run this command:
terraform planYou will see a detailed list of resources. No changes will be made at this step. If the configuration contains any errors, Terraform will show them.
-
Apply the changes:
terraform apply -
Type
yesand press Enter to confirm the changes.
-
-
Get the VM public IP address: you will need it later to upload the website files.
After creating the infrastructure, upload the website files.
Upload the website files
To test the web server, upload the index.html file to the VM. You can use a test file
-
Find the VM public IP address under Network on the VM page in the management console
. -
Connect to the VM via SSH.
-
Grant your user write permissions for the
/var/www/htmldirectory:sudo chown -R "$USER":www-data /var/www/html -
Upload the website files to the VM via SCP
.Linux/macOSWindowsUse the
scpcommand line utility:scp -r <path_to_directory_with_files> <VM_user_name>@<VM_IP_address>:/var/www/htmlUse WinSCP
to copy the local file directory to/var/www/htmlon the VM.
After uploading the files, test the website.
Test the website
To test the site, enter its IP or domain name in your browser:
http://<public_IP_of_VM>http://www.example.com
How to delete the resources you created
To stop paying for the resources you created:
-
Open the
lamp-lemp.tffile and delete your infrastructure description from it. -
Apply the changes:
-
In the terminal, go to the directory where you edited the configuration file.
-
Make sure the configuration file is correct using this command:
terraform validateIf the configuration is correct, you will get this message:
Success! The configuration is valid. -
Run this command:
terraform planYou will see a detailed list of resources. No changes will be made at this step. If the configuration contains any errors, Terraform will show them.
-
Apply the changes:
terraform apply -
Type
yesand press Enter to confirm the changes.
-