From b349a321562014aa0c275b1293f8194cd1e7793a Mon Sep 17 00:00:00 2001 From: Marcin Baniowski Date: Thu, 5 Jul 2018 00:46:23 +0200 Subject: [PATCH] Add Terraform templates (#316) --- contrib/terraform/NOTICE | 5 + contrib/terraform/README.md | 85 +++++++++++++ contrib/terraform/modules/etcd/bastion.tf | 51 ++++++++ contrib/terraform/modules/etcd/certs.tf | 95 +++++++++++++++ contrib/terraform/modules/etcd/dns.tf | 16 +++ contrib/terraform/modules/etcd/ignition.tf | 79 ++++++++++++ contrib/terraform/modules/etcd/main.tf | 86 +++++++++++++ contrib/terraform/modules/etcd/output.tf | 3 + .../resources/dropins/40-etcd-cluster.conf | 17 +++ contrib/terraform/modules/etcd/variables.tf | 53 ++++++++ .../terraform/modules/event-gateway/alb.tf | 48 ++++++++ .../terraform/modules/event-gateway/ecs.tf | 114 ++++++++++++++++++ .../terraform/modules/event-gateway/etcd.tf | 18 +++ .../terraform/modules/event-gateway/iam.tf | 40 ++++++ .../terraform/modules/event-gateway/output.tf | 14 +++ .../modules/event-gateway/provider.tf | 3 + .../modules/event-gateway/variables.tf | 110 +++++++++++++++++ .../terraform/modules/event-gateway/vpc.tf | 18 +++ 18 files changed, 855 insertions(+) create mode 100644 contrib/terraform/NOTICE create mode 100644 contrib/terraform/README.md create mode 100644 contrib/terraform/modules/etcd/bastion.tf create mode 100644 contrib/terraform/modules/etcd/certs.tf create mode 100644 contrib/terraform/modules/etcd/dns.tf create mode 100644 contrib/terraform/modules/etcd/ignition.tf create mode 100644 contrib/terraform/modules/etcd/main.tf create mode 100644 contrib/terraform/modules/etcd/output.tf create mode 100644 contrib/terraform/modules/etcd/resources/dropins/40-etcd-cluster.conf create mode 100644 contrib/terraform/modules/etcd/variables.tf create mode 100644 contrib/terraform/modules/event-gateway/alb.tf create mode 100644 contrib/terraform/modules/event-gateway/ecs.tf create mode 100644 contrib/terraform/modules/event-gateway/etcd.tf create mode 100644 contrib/terraform/modules/event-gateway/iam.tf create mode 100644 contrib/terraform/modules/event-gateway/output.tf create mode 100644 contrib/terraform/modules/event-gateway/provider.tf create mode 100644 contrib/terraform/modules/event-gateway/variables.tf create mode 100644 contrib/terraform/modules/event-gateway/vpc.tf diff --git a/contrib/terraform/NOTICE b/contrib/terraform/NOTICE new file mode 100644 index 0000000..186d451 --- /dev/null +++ b/contrib/terraform/NOTICE @@ -0,0 +1,5 @@ +CoreOS Project +Copyright 2017 CoreOS, Inc + +This product includes software developed at CoreOS, Inc. +(http://www.coreos.com/). \ No newline at end of file diff --git a/contrib/terraform/README.md b/contrib/terraform/README.md new file mode 100644 index 0000000..b8b98e1 --- /dev/null +++ b/contrib/terraform/README.md @@ -0,0 +1,85 @@ +# Event Gateway Terraform module + +This module creates Event Gateway running on ECS Fargate with a standalone etcd cluster. + +The module is an extract form the [Tectonic Installer repository](https://github.com/coreos/tectonic-installer). + +## Usage + +```hcl +module "event-gateway" { + source = "github.com/serverless/event-gateway//contrib/terraform/modules/event-gateway" + + aws_region = "us-east-1" + command_list = ["-db-hosts", "event-gateway-etcd-0.etcd:2379,event-gateway-etcd-1.etcd:2379,event-gateway-etcd-2.etcd:2379", "-log-level", "debug"] + tags = { + Application = "event-gateway" + } +} + +output "config_url" { + value = "${module.event-gateway.config_url}" +} + +output "events_url" { + value = "${module.event-gateway.events_url}" +} +``` + +## Debugging etcd + +It's possible to enable SSH access via bastion instance, by adding parameters: + +``` +bastion_enabled = true +ssh_key = "eg-key" +``` + +Bastion IP can be distplayed by adding output: + +``` +output "bastion_ip" { + value = "${module.event-gateway.bastion_ip}" +} +``` + +To connect to one of the etcd cluster hosts, run: + +```bash +ssh -J ec2-user@ core@ +``` + +## Inputs + +| Name | Description | Type | Default | Required | +|------|-------------|:----:|:-----:|:-----:| +| aws_region | AWS region for the stack | string | - | yes | +| bastion_enabled | Set to true enables SSH access to etcd nodes in the private subnet | string | `false` | no | +| command_list | List of parameters for the `event-gateway` command | list | `["-log-level", "debug"]` | no | +| config_alb_name | Config ALB name | string | `alb-config` | no | +| config_port | Port number of the Event Gateway Config API | string | `4001` | no | +| eg_image | Event Gateway docker image | string | `serverless/event-gateway:latest` | no | +| eg_vpc_name | Event Gateway VPC name | string | `eg-vpc` | no | +| etcd_base_domain | Name of the base domain for the etcd cluster | string | `etcd` | no | +| etcd_image | etcd Docker image | string | `quay.io/coreos/etcd:v3.1.8` | no | +| etcd_instance_count | Number of nodes in the etcd cluster | string | `3` | no | +| etcd_instance_type | Etcd node type | string | `t2.micro` | no | +| etcd_root_volume_iops | Number of IOPS of the etcd cluster volumes | string | `100` | no | +| etcd_root_volume_size | Size of the etcd cluster volumes (in GiB) | string | `30` | no | +| etcd_root_volume_type | Type of the etcd cluster volumes | string | `gp2` | no | +| etcd_ssh_key | (optional) Name of the preexisting SSH key | string | `` | no | +| etcd_tls_enabled | Enable TLS for the etcd cluster | string | `false` | no | +| events_alb_name | Events ALB name | string | `alb-events` | no | +| events_port | Event Gateway Events API port number | string | `4000` | no | +| fargate_cpu | Fargate instance CPU units | string | `256` | no | +| fargate_memory | Fargate instance memory | string | `512` | no | +| tags | Additional tags | map | `` | no | +| task_count | Number of Event Gateway Fargate tasks | string | `3` | no | + +## Outputs + +| Name | Description | +|------|-------------| +| bastion_ip | Public IP of etcd bastion instance | +| config_url | Event Gateway Config API URL | +| events_url | Event Gateway Events API URL | diff --git a/contrib/terraform/modules/etcd/bastion.tf b/contrib/terraform/modules/etcd/bastion.tf new file mode 100644 index 0000000..6f2d9a8 --- /dev/null +++ b/contrib/terraform/modules/etcd/bastion.tf @@ -0,0 +1,51 @@ +data "aws_ami" "amazon-linux" { + most_recent = true + + filter { + name = "name" + values = ["amzn-ami-*-x86_64-gp2"] + } + + filter { + name = "virtualization-type" + values = ["hvm"] + } + + filter { + name = "owner-alias" + values = ["amazon"] + } +} + +resource "aws_instance" "bastion" { + count = "${var.bastion_enabled ? 1 : 0}" + + ami = "${data.aws_ami.amazon-linux.id}" + instance_type = "t2.micro" + key_name = "${var.ssh_key}" + subnet_id = "${var.bastion_subnet}" + vpc_security_group_ids = ["${aws_security_group.bastion.id}"] + + tags = "${merge(var.tags, map("Name", var.bastion_name))}" +} + +resource "aws_security_group" "bastion" { + count = "${var.bastion_enabled ? 1 : 0}" + + name = "eg-bastion" + vpc_id = "${var.vpc_id}" + + ingress { + protocol = "tcp" + from_port = "22" + to_port = "22" + cidr_blocks = ["0.0.0.0/0"] + } + + egress { + protocol = "-1" + from_port = 0 + to_port = 0 + cidr_blocks = ["0.0.0.0/0"] + } +} diff --git a/contrib/terraform/modules/etcd/certs.tf b/contrib/terraform/modules/etcd/certs.tf new file mode 100644 index 0000000..f136c88 --- /dev/null +++ b/contrib/terraform/modules/etcd/certs.tf @@ -0,0 +1,95 @@ +locals { + etcd_crt_id_list = [ + "${data.ignition_file.etcd_ca.*.id}", + "${data.ignition_file.etcd_client_key.*.id}", + "${data.ignition_file.etcd_client_crt.*.id}", + "${data.ignition_file.etcd_server_key.*.id}", + "${data.ignition_file.etcd_server_crt.*.id}", + "${data.ignition_file.etcd_peer_key.*.id}", + "${data.ignition_file.etcd_peer_crt.*.id}", + ] +} + +data "ignition_file" "etcd_ca" { + path = "/etc/ssl/etcd/ca.crt" + mode = 0644 + uid = 232 + gid = 232 + filesystem = "root" + + content { + content = "${module.etcd_certs.etcd_ca_crt_pem}" + } +} + +data "ignition_file" "etcd_client_key" { + path = "/etc/ssl/etcd/client.key" + mode = 0400 + uid = 0 + gid = 0 + filesystem = "root" + + content { + content = "${module.etcd_certs.etcd_client_key_pem}" + } +} + +data "ignition_file" "etcd_client_crt" { + path = "/etc/ssl/etcd/client.crt" + mode = 0400 + uid = 0 + gid = 0 + filesystem = "root" + + content { + content = "${module.etcd_certs.etcd_client_crt_pem}" + } +} + +data "ignition_file" "etcd_server_key" { + path = "/etc/ssl/etcd/server.key" + mode = 0400 + uid = 232 + gid = 232 + filesystem = "root" + + content { + content = "${module.etcd_certs.etcd_server_key_pem}" + } +} + +data "ignition_file" "etcd_server_crt" { + path = "/etc/ssl/etcd/server.crt" + mode = 0400 + uid = 232 + gid = 232 + filesystem = "root" + + content { + content = "${module.etcd_certs.etcd_server_crt_pem}" + } +} + +data "ignition_file" "etcd_peer_key" { + path = "/etc/ssl/etcd/peer.key" + mode = 0400 + uid = 232 + gid = 232 + filesystem = "root" + + content { + content = "${module.etcd_certs.etcd_peer_key_pem}" + } +} + +data "ignition_file" "etcd_peer_crt" { + path = "/etc/ssl/etcd/peer.crt" + mode = 0400 + uid = 232 + gid = 232 + filesystem = "root" + + content { + content = "${module.etcd_certs.etcd_peer_crt_pem}" + } +} diff --git a/contrib/terraform/modules/etcd/dns.tf b/contrib/terraform/modules/etcd/dns.tf new file mode 100644 index 0000000..99446ea --- /dev/null +++ b/contrib/terraform/modules/etcd/dns.tf @@ -0,0 +1,16 @@ +resource "aws_route53_zone" "etcd_priv" { + name = "${var.base_domain}" + vpc_id = "${var.vpc_id}" + comment = "Managed by Terraform" + + tags = "${var.tags}" +} + +resource "aws_route53_record" "etcd_a_nodes" { + count = "${var.instance_count}" + type = "A" + ttl = "60" + zone_id = "${aws_route53_zone.etcd_priv.zone_id}" + name = "${var.cluster_name}-etcd-${count.index}" + records = ["${module.etcd.ip_addresses[count.index]}"] +} diff --git a/contrib/terraform/modules/etcd/ignition.tf b/contrib/terraform/modules/etcd/ignition.tf new file mode 100644 index 0000000..2258457 --- /dev/null +++ b/contrib/terraform/modules/etcd/ignition.tf @@ -0,0 +1,79 @@ +locals { + scheme = "${var.tls_enabled ? "https" : "http"}" + + // see https://github.com/hashicorp/terraform/issues/9858 + etcd_initial_cluster_list = "${concat(data.template_file.etcd_hostname_list.*.rendered, list("dummy"))}" + + metadata_env = "EnvironmentFile=/run/metadata/coreos" + + metadata_deps = <