Menjalankan WordPress Self Managed di Amazon Lightsail

tl;dr Cara menjalankan WordPress self managed di Amazon Lightsail menggunakan Terraform

WordPress sebagaimana yang kita tahu adalah salah satu Content Management System (CMS) yang banyak digunakan. Salah satu kegunaannya yang sering dijumpai adalah sebagai platform untuk hosting blog. Sebetulnya WordPress menyediakan Software as a Service (SaaS) yang dapat kita gunakan. Namun kadang di beberapa pengguna mungkin ada yang ingin menggunakan layanan self managed WordPress terlepas dari beberapa faktor seperti biaya berlangganan SaaS, compliance dari perusahaan dan sebagainya.

Pada blogpost kali ini saya akan mendiskusikan cara dan konfigurasi menjalankan atau provision WordPress self managed di Amazon Lighstail. Konfigurasi akan dilakukan menggunakan IaC tool Terraform dengan backend remote (Terraform Cloud).

Konfigurasi

Pada artikel ini, struktur file yang digunakan oleh terraform code sebagai berikut:

modules/
├─ lighstail/
│  ├─ lighstail-apse1/
│  │  ├─ wordpress/
│  │  │  ├─ instance.tf
│  │  │  ├─ variables.tf
│  │  │  ├─ outputs.tf
lightsail/
├─ lightsail-apse1/
│  ├─ main.tf
│  ├─ variables.tf
│  ├─ outputs.tf
│  ├─ instance.tf

Resource lightsail dibuat berdasarkan self managed module yang saya buat dimana di dalamnya dikonfigurasi beberapa parameter yang dijadikan template untuk membuat instance wordpress di lightsail.

Langkah Konfigurasi

  1. Konfigurasi saya mulai dengan membuat self managed module yang ada di directory modules/lightsail/lightsail-apse1/wordpress. File pertama yang saya diskusikan adalah modules/lightsail/lightsail-apse1/wordpress/instance.tf. Pada file ini saya membuat template untuk lightsail instance yang sudah terinstall wordpress dengan menggunakan blueprint wordpress di lightsail yang sudah disediakan. Konfigurasi template instance ini menggunakan acuan dari variable-variable yang sudah didefinisikan di file modules/lightsail/lightsail-apse1/wordpress/variables.tf dan akan saya jelaskan di poin berikutnya.

module-instance

# Create lighstail instance with wordpress blueprint
resource "aws_lightsail_instance" "instance" {
  name              = var.instance_name
  availability_zone = var.availability_zone
  blueprint_id      = var.wp_blueprint_id
  bundle_id         = var.bundle_id
  key_pair_name     = var.lightsail_key_pair
  tags              = var.instance_tags
}
  1. Berikutnya pada file modules/lightsail/lightsail-apse1/wordpress/variables.tf saya definisikan variable-variable yang digunakan di poin nomor 1. Saya definisikan default value di beberapa variable seperti list blueprint_id worddpress yang digunakan, bundle_id untuk ukuran instance lightsail dan key pair yang digunakan, selebihnya variable tidak di-definisikan default valuenya.

module-variable

variable "instance_name" {
  type        = string
  description = "Lightsail instance name"
  default     = ""
}

variable "availability_zone" {
  description = "Region availability zone"
}

variable "wp_blueprint_id" {
  type        = string
  description = "WordPress blueprint id"
  default     = "wordpress"
}

variable "bundle_id" {
  type        = string
  description = "Lightsail bundle id"
  default     = "nano_2_0"
}

variable "lightsail_key_pair" {
  type        = string
  description = "Key pair used for ssh access"
  default     = "lightsail-apse1"
}

variable "instance_tags" {
  type        = map(string)
  description = "Set key value tags for lightsail instance"
  default     = {}
}
  1. Setelah itu di file modules/lightsail/lightsail-apse1/wordpress/outputs.tf, saya deklarasikan output yang nantinya dapat dipanggil di root module. Output berupa lightsail instance id.

module-output

# Set outputs
output "lightsail_instance_id" {
  value = aws_lightsail_instance.instance.id
}
  1. Setelah child module untuk template instance lightsail wordpress selesai dibuat, selanjutnya adalah konfigurasi lightsail root module. Saya mulai dengan menjelaskan file lightsail/lightsail-apse1/main.tf. Di file ini saya akan mendeklarasikan konfigurasi terraform yang akan mengacu ke terraform cloud (app.terraform.io) sebagai backend. Dan mereferensikan nama organisasi dan workspace yang digunakan. Kemudian saya juga deklarasikan terraform provider yang digunakan yaitu hashisorp/aws dengan versi terkait. Di akhir saya deklarasikan region aws yang digunakan, mengacu ke variable aws_region yang ada di file lightsail/lightsail-apse1/variables.tf yang berikutnya akan saya jelaskan.

root-main

# Setup terraform cloud and workspace
terraform {
  backend "remote" {
    hostname     = "app.terraform.io"
    organization = "lanandra"

    workspaces {
      name = "lightsail-ap-southeast-1"
    }
  }
}

# Setup terraform providers
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.22.0"
    }
  }

  required_version = ">= 1.2.4"
}

# Setup AWS provider
provider "aws" {
  region = var.aws_region
}
  1. Selanjutnya adalah mendefinisikan variable yang digunakan oleh lightsail root module di file lightsail/lightsail-apse1/variables.tf.

root-variables

variable "aws_region" {
  type        = string
  description = "AWS Region"
  default     = "ap-southeast-1"
}

variable "availability_zone" {
  type        = list(string)
  description = "Availability Zone"
  default     = ["ap-southeast-1a", "ap-southeast-1b", "ap-southeast-1c"]
}
  1. Berikutnya di file lightsail/lightsail-apse1/instance.tf, saya membuat instance lightsail dengan referensi dari child module instance bundle wordpress yang sudah saya buat sebelumnya. Di dalam konfigurasi instance lightsail di root module ini saya deklarasikan nama instance, availability zone yang digunakan dan instance tags. Sebagai tambahan saya juga siapkan konfigurasi static IP address yang akan diasosiasikan ke instance wordpress tersebut.

root-instance

# Create lightsail instance from module
module "wordpress_sandbox" {
  source = "../../modules/lightsail/lightsail-apse1/wordpress/"

  instance_name     = "wordpress-sandbox"
  availability_zone = var.availability_zone[0]

  instance_tags = {
    Name        = "wordpress-sandbox"
    Environment = "Sandbox"
    Owner       = "Luthfi"
  }
}

resource "aws_lightsail_static_ip" "wordpress_sandbox_ip" {
  name = "wordpress-sandbox-ip"
}

resource "aws_lightsail_static_ip_attachment" "wordpress_sandbox" {
  static_ip_name = aws_lightsail_static_ip.wordpress_sandbox_ip.id
  instance_name  = "wordpress-sandbox"
}
  1. Selanjutnya di file lightsail/lightsail-apse1/outputs.tf, saya mencoba untuk meneruskan menampilkan value atau nilai output instance id yang sudah dideklarasikan di child module. Nilai output ini nantinya akan digunakan sebagai referensi untuk nama instance yang didefinisikan di resource "aws_lightsail_static_ip_attachment".

root-outputs

# Set outputs
output "wordpress_sandbox_instance_id" {
  value = module.wordpress_sandbox.lightsail_instance_id
}
  1. Berikutnya adalah melakukan commit dan push terraform code ke repository. Dan lakukan terraform plan dan terraform apply di Terraform Cloud workspace agar infrastructure dapat dibuat/provisioned. Untuk bagian ini hanya saya tampilkan simulasinya saja. Jika ingin melihat lebih detail bagaimana proses provisioning resource AWS via Terraform Cloud, silahkan lihat blogpost saya berikut ini.

tfcloud-plan-apply

  1. Setelah provisioning resource via terraform sudah selesai. Langkah selanjutnya adalah memastikan resource-resource berhasil terbentuk. Kita dapat menggunakan AWS web console untuk memastikannya. Resource pertama yang akan kita verifikasi adalah lightsail instance. Masuk ke halaman service Lightsail, kemudian pilih Instances, pastikan lighstail instance wordpress yang didefinisikan di terraform code sudah berhasil terbentuk.

verify-instance

  1. Seperti dijelaskan sebelumnya, sudah dideklarasikan juga pembuatan dan asosiasi static ip address ke lightsail instance wordpress. Masuk ke halaman detail instance, kemudian masuk ke menu Networking. Pastikan static ip sudah berhasil terbentuk dan terasosiasi.

verify-static-ip

  1. Secara default, wordpress berjalan dengan menggunakan protocol http. Kita dapat menjadikan wordpress sebagai secure website yang berjalan dengan protocol https dengan bantuan Bitnami HTTPS configuration tool (bncert). Silahkan lihat detail cara konfigurasinya di dokumentasi Enabling HTTPS on your WordPress instance in Amazon Lightsail. Saya juga sudah menyiapkan nama domain yang akan digunakan oleh wordpress dan sudah saya konfigurasi di DNS server. Nama domain yang saya gunakan pada artikel ini adalah blog-sandbox.ludesdeveloper.com dan http://www.blog-sandbox.ludesdeveloper.com. Domain dengan dan tanpa www diperlukan untuk konfigurasi bncert. Pastikan langkah langkah yang ada di dokumentasi berjalan dengan sukses.

bncert-configuration

  1. Selanjutnya kita dapat memastikan wordpress admin maupun halaman blog/website wordpress sudah dapat berhasil diakses.

wp-admin

wp-home

Kesimpulan

Akhirnya kita sampai di penghujung artikel ini. Ada beberapa kesimpulan atau key takeaways yang ingin saya sampaikan:

  • Amazon Lighstail menyediakan Virtual Private Server (VPS) dengan pre-configured wordpress image
  • Konfigurasi Lightail dapat dilakukan dengan pendekatan IaC. Sehingga kita memiliki state file dari infrastruktur yang sudah kita buat

Silahkan kunjungi GitHub repo saya untuk melihat source code konfigurasi yang digunakan dalam artikel ini. Child module untuk template lighstail instance dengan pre-configured wordpress dapat dilihat di directory Lightsail WordPress Module. Konfigurasi root module untuk Lightsail dapat dilihat di directory Lightsail.

Sekian artikel kali ini. Jika ada saran, kritik, atau masukan silahkan tinggalkan di kolom komentar.

Iklan

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

Connecting to %s

Situs yang Didukung WordPress.com.

Atas ↑

%d blogger menyukai ini: