Deployment on Google Cloud Plateform | On-Premise | PM2 Enterprise Documentation

Deployment on Google Cloud Plateform

Documentation about how to deploy the keymetrics on-premise version on GCP

Requirements

In the following examples, we assume that you already have a fully working Terraform project. You can follow the Getting Started guide on the official website here.

Setup steps

1. Adding the module to your terraform project

There’s two options available in order to use our terraform module in your project.

  • Link the module’s git repository address in your terraform module definition
  • Clone the repository and set the source variable of your module definiton to the correct path on your drive.
Without cloning the repository

When defining your module definition, use the following source value:

  • git@github.com:keymetrics/on-premise.git//terraform/keymetrics_aio_gcp

Example:

module "keymetrics" {
  source  = "git@github.com:keymetrics/on-premise.git//terraform/keymetrics_aio_gcp"
  ...
}
By cloning the repository

Start by cloning the repository in your project directory using the git command:

  • git clone git@github.com:keymetrics/on-premise.git keymetrics-on-premise

Define the kemetrics module using the relative path. Example:

module "keymetrics" {
  source  = "keymetrics-on-premise/terraform/keymetrics_aio_gcp"
  ...
}

2. Set the module variables

The variables are set inside the module definition and allow you to chose how the module is going to setup your infrastructe and which external services are going to be used.

Example of module with variables:

module "example_keymetrics_setup" {
  source  = "keymetrics_aio_gcp"

  keymetrics_key = "...

  environment = "example"

  smtp_host = "smtp.mailgun.org"
  smtp_username = "postmaster@example.com"
  smtp_password = "XXX"
  smtp_sender = "keymetrics@example.com"
  
  public_host_address = "our-keymetrics-public-subdomain.example.com"
  
  network_name = "default"
}

The following variables are available:

  • keymetrics_key: [Required] PM2 Plus License Key.
  • environment: [Required] The name of your environment (ex: qa, prod, prod-1, etc.).
  • smtp_username: [Required] Username used to connect to the SMTP server.
  • smtp_password: [Required] Password used to connect to the SMTP server.
  • smtp_host: [Required] Hostname of the SMTP server.
  • smtp_sender: [Required] Email address used to send emails.
  • network_name: [Required] Name of the GCP Network to use.
  • public_host_address: Public domain pointing to PM2 Plus HTTP Server (if empty, the public IP will be used), need to be formatted with http or https, not just the host.
  • mongodb_instance_type: GCP Instance type to use for MongoDB Instance.
  • elasticsearch_instance_type: GCP Instance type to use for ElasticSearch Instance.
  • redis_instance_type: GCP Instance type to use for Redis Instance.
  • backend_instance_type: GCP Instance type to use for Backend Instance.

For more informations, please check the variables.tf file in the module

3. Plan and Apply your changes using the terraform command

Run terraform plan -target=module.example_keymetrics_setup -out tfout and make sure no error shows up in the logs.

You can then run terraform apply tfout in order to make terraform created the infrastructure on your GCP Project.

Extra configuration depending of your own existing infrastructure

Add a sub-domain pointing to PM2 Plus instance

By default, PM2 Plus instance is using an External IP addresses to be publicly available to its users. If you want to use it with a domain, you first need to set public_host_address variable to the domain to use and then create a A record pointing to its public External IP addresses.

Warning: Once deployed with either the public IP or a domain, it’s not possible to change it without fully dropping the mongodb database.

Allow your apps to connect to PM2 Plus APIs

By default, PM2 Plus instance only accept connection on port 80/tcp from 0.0.0.0/32. In order to let your applications talk with the PM2 Plus backend, you need to allow their security groups to connected to PM2 Plus instance on port 3900/tcp, 3010/tcp, 4010/tcp and 43554/tcp.

To do so, you can use the module output values as target or source of new Firewall rules :

  • redis_fw_tag_name
  • mongodb_fw_tag_name
  • elasticsearch_fw_tag_name
  • backend_fw_tag_name

Example:

module "example_keymetrics_setup" {
  source  = "keymetrics_aio_gcp"
  ...
}

resource "google_compute_firewall" "allow_all_connections_to_km" {
  name    = "allow_all_connections_to_km"
  network = "default"

  allow {
    protocol = "icmp"
  }

  allow {
    protocol = "tcp"
    ports    = ["80", "3900", "3010", "4010", "43554"]
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags = ["${module.example_keymetrics_setup.backend_fw_tag_name}"]
}

...