Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: move clickhouseproxy to use generic ec2 module #140

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions ansible/deploy-clickhouse-proxy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
- name: Deploy clickhouse proxy
hosts:
- clickhouseproxy.dev.ooni.io
become: true
roles:
- role: bootstrap
- role: nginx
tags: nginx
- role: clickhouse_proxy
vars:
clickhouse_url: "clickhouse3.prod.ooni.io"
clickhouse_port: 9000
3 changes: 3 additions & 0 deletions ansible/inventory
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,6 @@ ams-ps.ooni.nu
# currently disabled due to them not supporting ed25519 keys
#mia-echoth.ooni.nu
#mia-httpth.ooni.nu

[aws-proxy]
clickhouseproxy.dev.ooni.io
15 changes: 15 additions & 0 deletions ansible/roles/clickhouse_proxy/handlers/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
- name: test nginx config
command: /usr/sbin/nginx -t -c /etc/nginx/nginx.conf
listen:
- restart nginx
- reload nginx

- name: restart nginx
service:
name: nginx
state: restarted

- name: reload nginx
service:
name: nginx
state: reloaded
20 changes: 20 additions & 0 deletions ansible/roles/clickhouse_proxy/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
- name: Create the modules-enabled directory if not exists
tags: webserv
ansible.builtin.file:
path: /etc/nginx/modules-enabled
state: directory
mode: 0755
owner: root
group: root

- name: Add stream nginx config
tags: webserv
template:
src: templates/99-stream.conf
dest: /etc/nginx/modules-enabled/99-stream.conf
mode: 0755
owner: root
notify:
- reload nginx
- restart nginx
13 changes: 13 additions & 0 deletions ansible/roles/clickhouse_proxy/templates/99-stream.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
stream {
upstream clickhouse_backend {
server {{ clickhouse_url }}:{{ clickhouse_port }};
}

server {
listen 9000;

proxy_pass clickhouse_backend;
}

error_log /var/log/nginx/error.log;
}
52 changes: 44 additions & 8 deletions tf/environments/dev/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -414,8 +414,8 @@ module "ooniapi_reverseproxy" {
)
}

module "ooni_backendproxy" {
source = "../../modules/ooni_backendproxy"
module "ooni_clickhouse_proxy" {
source = "../../modules/ec2"

stage = local.environment

Expand All @@ -427,19 +427,55 @@ module "ooni_backendproxy" {
key_name = module.adm_iam_roles.oonidevops_key_name
instance_type = "t3a.nano"

backend_url = "https://backend-fsn.ooni.org/"
wcth_addresses = module.ooni_th_droplet.droplet_ipv4_address
wcth_domain_suffix = "th.ooni.org"
clickhouse_url = "clickhouse1.prod.ooni.io"
clickhouse_port = "9000"
name = "oonickprx"
ingress_rules = [{
from_port = 22,
to_port = 22,
protocol = "tcp",
cidr_blocks = ["0.0.0.0/0"],
}, {
from_port = 80,
to_port = 80,
protocol = "tcp",
cidr_blocks = ["0.0.0.0/0"],
}, {
from_port = 9000,
to_port = 9000,
protocol = "tcp",
cidr_blocks = ["0.0.0.0/0"],
}]

egress_rules = [{
from_port = 0,
to_port = 0,
protocol = "-1",
cidr_blocks = ["0.0.0.0/0"],
}, {
from_port = 0,
to_port = 0,
protocol = "-1",
ipv6_cidr_blocks = ["::/0"]
}]

sg_prefix = "oockprx"
tg_prefix = "ckpr"

tags = merge(
local.tags,
{ Name = "ooni-tier0-backendproxy" }
{ Name = "ooni-tier0-clickhouseproxy" }
)
}

resource "aws_route53_record" "clickhouse_proxy_alias" {
zone_id = local.dns_zone_ooni_io
name = "clickhouseproxy.${local.environment}.ooni.io"
type = "CNAME"
ttl = 300

records = [
module.ooni_clickhouse_proxy.aws_instance_public_dns
]
}

#### OONI Run service

Expand Down
111 changes: 111 additions & 0 deletions tf/modules/ec2/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
data "aws_ssm_parameter" "ubuntu_22_ami" {
name = "/aws/service/canonical/ubuntu/server/22.04/stable/current/amd64/hvm/ebs-gp2/ami-id"
}

# Important note about security groups:
# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group#recreating-a-security-group
resource "aws_security_group" "ec2_sg" {
description = "security group for ec2"
name_prefix = var.sg_prefix

vpc_id = var.vpc_id

lifecycle {
create_before_destroy = true
}

tags = var.tags
}

resource "aws_security_group_rule" "ec2_sg_ingress" {
count = length(var.ingress_rules)

type = "ingress"
from_port = var.ingress_rules[count.index].from_port
to_port = var.ingress_rules[count.index].to_port
protocol = var.ingress_rules[count.index].protocol
cidr_blocks = var.ingress_rules[count.index].cidr_blocks
ipv6_cidr_blocks = var.ingress_rules[count.index].ipv6_cidr_blocks
security_group_id = aws_security_group.ec2_sg.id
}

resource "aws_security_group_rule" "ec2_sg_egress" {
count = length(var.egress_rules)

type = "egress"
from_port = var.egress_rules[count.index].from_port
to_port = var.egress_rules[count.index].to_port
protocol = var.egress_rules[count.index].protocol
cidr_blocks = var.egress_rules[count.index].cidr_blocks
ipv6_cidr_blocks = var.egress_rules[count.index].ipv6_cidr_blocks
security_group_id = aws_security_group.ec2_sg.id
}

data "cloudinit_config" "ooni_ec2" {
base64_encode = true

part {
filename = "init.cfg"
content_type = "text/cloud-config"
content = templatefile("${path.module}/templates/cloud-init.yml", {})
}

}

resource "aws_launch_template" "ooni_ec2" {
name_prefix = "${var.name}-tmpl-"
image_id = data.aws_ssm_parameter.ubuntu_22_ami.value
instance_type = var.instance_type
key_name = var.key_name

user_data = data.cloudinit_config.ooni_ec2.rendered

lifecycle {
create_before_destroy = true
}

network_interfaces {
delete_on_termination = true
associate_public_ip_address = true
subnet_id = var.subnet_id
security_groups = [
aws_security_group.ec2_sg.id,
]
}

tag_specifications {
resource_type = "instance"
tags = var.tags
}
}

resource "aws_instance" "ooni_ec2" {
launch_template {
id = aws_launch_template.ooni_ec2.id
version = "$Latest"
}

lifecycle {
create_before_destroy = true
}

tags = var.tags
}

resource "aws_alb_target_group" "ooni_ec2" {
name_prefix = "oo${var.tg_prefix}"
port = 80
protocol = "HTTP"
vpc_id = var.vpc_id

lifecycle {
create_before_destroy = true
}

tags = var.tags
}

resource "aws_lb_target_group_attachment" "oonibackend_proxy" {
target_id = aws_instance.ooni_ec2.id
target_group_arn = aws_alb_target_group.ooni_ec2.arn
}
7 changes: 7 additions & 0 deletions tf/modules/ec2/outputs.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
output "aws_instance_id" {
value = aws_instance.ooni_ec2.id
}

output "aws_instance_public_dns" {
value = aws_instance.ooni_ec2.public_dns
}
Empty file.
65 changes: 65 additions & 0 deletions tf/modules/ec2/variables.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
variable "vpc_id" {
description = "the id of the VPC to deploy the instance into"
}

variable "subnet_id" {
description = "the ids of the subnet to deploy the instance into"
}

variable "private_subnet_cidr" {
description = "the cidr block of the private subnet to allow traffic from for the clickhouse proxy"
}

variable "tags" {
description = "tags to apply to the resources"
default = {}
type = map(string)
}

variable "key_name" {
description = "Name of AWS key pair"
}

variable "name" {
description = "Name of the resources"
}

variable "instance_type" {
default = "t2.micro"
}

variable "stage" {
default = "one of dev, stage, test, prod"
}

variable "dns_zone_ooni_io" {
description = "id of the DNS zone for ooni_io"
}

variable "sg_prefix" {
description = "security group prefix"
}

variable "ingress_rules" {
type = list(object({
from_port = number
to_port = number
protocol = string
cidr_blocks = list(string)
ipv6_cidr_blocks = optional(list(string))
}))
}

variable "egress_rules" {
type = list(object({
from_port = number
to_port = number
protocol = string
cidr_blocks = optional(list(string))
ipv6_cidr_blocks = optional(list(string))
}))
}

variable "tg_prefix" {
description = "target group prefix. Will be prefixed with `oo`, example: bkprx -> oobkprx"
}
1 change: 0 additions & 1 deletion tf/modules/ooni_backendproxy/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ resource "aws_security_group" "nginx_sg" {
protocol = "tcp"
from_port = 9000
to_port = 9000
cidr_blocks = var.private_subnet_cidr
}

ingress {
Expand Down
58 changes: 0 additions & 58 deletions tf/modules/ooni_backendproxy/templates/cloud-init.yml
Original file line number Diff line number Diff line change
@@ -1,58 +0,0 @@
package_update: true

packages:
- nginx
- libnginx-mod-stream

write_files:
- path: /etc/nginx/sites-available/default
content: |
server {
listen 80;

server_name _;

location / {
proxy_pass ${backend_url};
proxy_http_version 1.1;
proxy_set_header Host \$host;
}
error_log /var/log/nginx/error.log;
}

%{ if length(wcth_addresses) > 0 }
upstream wcths {
%{ for address in wcth_addresses }
server ${ address };
%{ endfor }
}
server {
server_name *.${ wcth_domain_suffix };
listen 80;

location / {
proxy_pass http://wcths;
proxy_http_version 1.1;
proxy_set_header Host \$host;
}
}
%{ endif }

- path: /etc/nginx/modules-enabled/99-stream.conf
content: |
stream {
upstream clickhouse_backend {
server ${clickhouse_url}:${clickhouse_port};
}

server {
listen 9000;

proxy_pass clickhouse_backend;
}

error_log /var/log/nginx/error.log;
}

runcmd:
- service nginx restart
Loading