Skip to content

Latest commit

 

History

History
 
 

Containerized Nginx on Container Optimized OS

This module manages a cloud-config configuration that starts a containerized Nginx service on Container Optimized OS, using the hello demo image.

The resulting cloud-config can be customized in a number of ways:

  • a custom Nginx configuration can be set in /etc/nginx/conf.d using the nginx_config variable
  • additional files (eg for hosts or zone files) can be passed in via the files variable
  • a completely custom cloud-config can be passed in via the cloud_config variable, and additional template variables can be passed in via config_variables

The default instance configuration inserts iptables rules to allow traffic on port 80.

Logging and monitoring are enabled via the Google Cloud Logging driver configured for the CoreDNS container, and the Node Problem Detector service started by default on boot.

The module renders the generated cloud config in the cloud_config output, to be used in instances or instance templates via the user-data metadata.

For convenience during development or for simple use cases, the module can optionally manage a single instance via the test_instance variable. If the instance is not needed the instance*tf files can be safely removed. Refer to the top-level README for more details on the included instance.

Examples

Default configuration

This example will create a cloud-config that uses the module's defaults, creating a simple hello web server showing host name and request id.

module "cos-nginx" {
  source           = "./modules/cloud-config-container/nginx"
}

# use it as metadata in a compute instance or template
resource "google_compute_instance" "default" {
  metadata = {
    user-data = module.cos-nginx.cloud_config
  }

Nginx instance

This example shows how to create the single instance optionally managed by the module, providing all required attributes in the test_instance variable. The instance is purposefully kept simple and should only be used in development, or when designing infrastructures.

module "cos-nginx" {
  source           = "./modules/cloud-config-container/nginx"
  test_instance = {
    project_id = "my-project"
    zone       = "europe-west1-b"
    name       = "cos-nginx"
    type       = "f1-micro"
    network    = "default"
    subnetwork = "https://www.googleapis.com/compute/v1/projects/my-project/regions/europe-west1/subnetworks/my-subnet"
  }
}

Variables

name description type required default
cloud_config Cloud config template path. If null default will be used. string null
config_variables Additional variables used to render the cloud-config and Nginx templates. map(any) {}
docker_logging Log via the Docker gcplogs driver. Disable if you use the legacy Logging Agent instead. bool true
file_defaults Default owner and permissions for files. object({…}) {…}
files Map of extra files to create on the instance, path as key. Owner and permissions will use defaults if null. map(object({…})) {}
image Nginx container image. string "nginxdemos/hello:plain-text"
nginx_config Nginx configuration path, if null container default will be used. string null
test_instance Test/development instance attributes, leave null to skip creation. object({…}) null
test_instance_defaults Test/development instance defaults used for optional configuration. If image is null, COS stable will be used. object({…}) {…}

Outputs

name description sensitive
cloud_config Rendered cloud-config file to be passed as user-data instance metadata.
test_instance Optional test instance name and address.