cloud-foundation-fabric/modules/cloud-config-container/mysql
Ludovico Magnocavallo f6775aca1b
Use the same versions file everywhere, pin to tf 1.0+ provider 4.0+ (#355)
* add default versions file, remove old providers and versions

* use default versions file everywhere

* fix kms module

* re-add provider configuration for data platform step 2

* update kms module outputs sorting

* update kms documentation

* fix data solutions tests

* fix GKE workload identity attribute name

* work around firewall provider issue in datafusion example
2021-11-03 15:05:43 +01:00
..
.gitignore Refactor the onprem module (#55) 2020-04-06 16:27:13 +02:00
README.md Add support for org policies to folder and project modules (#58) 2020-04-08 14:54:49 +02:00
cloud-config.yaml Update copyright to 2021 2021-02-15 09:38:10 +01:00
instance.tf Refactor the onprem module (#55) 2020-04-06 16:27:13 +02:00
main.tf Update copyright to 2021 2021-02-15 09:38:10 +01:00
outputs-instance.tf Refactor the onprem module (#55) 2020-04-06 16:27:13 +02:00
outputs.tf Update copyright to 2021 2021-02-15 09:38:10 +01:00
variables-instance.tf Refactor the onprem module (#55) 2020-04-06 16:27:13 +02:00
variables.tf Update copyright to 2021 2021-02-15 09:38:10 +01:00
versions.tf Use the same versions file everywhere, pin to tf 1.0+ provider 4.0+ (#355) 2021-11-03 15:05:43 +01:00

README.md

Containerized MySQL on Container Optimized OS

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

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

  • a custom MySQL configuration can be set using the mysql_config variable
  • the container image can be changed via the image variable
  • a data disk can be specified via the mysql_data_disk variable, the configuration will optionally format and mount it for container use
  • a KMS encrypted root password can be passed to the container image, and decrypted at runtime on the instance using the attributes in the kms_config 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 a sngle iptables rule to allow traffic on the default MySQL port.

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. Please note that an f1-micro instance is too small to run MySQL. 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 MySQL configuration

This example will create a cloud-config that uses the container's default configuration, and a plaintext password for the MySQL root user.

module "cos-mysql" {
  source         = "./modules/cos-container/mysql"
  mysql_password = "foo"
}

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

Custom MySQL configuration and KMS encrypted password

This example will create a cloud-config that uses a custom MySQL configuration, and passes in an encrypted password and the KMS attributes required to decrypt it. Please note that the instance service account needs the roles/cloudkms.cryptoKeyDecrypter on the specified KMS key.

module "cos-mysql" {
  source         = "./modules/cos-container/mysql"
  mysql_config   = "./my.cnf"
  mysql_password = "CiQAsd7WY=="
  kms_config     = {
    project_id = "my-project"
    keyring    = "test-cos"
    location   = "europe-west1"
    key        = "mysql"
  }
}

MySQL 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-mysql" {
  source         = "./modules/cos-container/mysql"
  mysql_password = "foo"
  test_instance = {
    project_id = "my-project"
    zone       = "europe-west1-b"
    name       = "cos-mysql"
    type       = "n1-standard-1"
    network    = "default"
    subnetwork = "https://www.googleapis.com/compute/v1/projects/my-project/regions/europe-west1/subnetworks/my-subnet"
  }
}

Variables

name description type required default
mysql_password MySQL root password. If an encrypted password is set, use the kms_config variable to specify KMS configuration. string
cloud_config Cloud config template path. If null default will be used. string null
config_variables Additional variables used to render the cloud-config template. map(any) {}
image MySQL container image. string mysql:5.7
kms_config Optional KMS configuration to decrypt passed-in password. Leave null if a plaintext password is used. object({...}) null
mysql_config MySQL configuration file content, if null container default will be used. string null
mysql_data_disk MySQL data disk name in /dev/disk/by-id/ including the google- prefix. If null the boot disk will be used for data. 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