Skip to content

Commit fa3dd8f

Browse files
committed
Full featured graylog setup
* Separate MongoDB * Separate ElasticSearch
1 parent 074a88b commit fa3dd8f

File tree

21 files changed

+1200
-159
lines changed

21 files changed

+1200
-159
lines changed

modules/elasticsearch/ec2.tf

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,32 @@ resource "aws_security_group" "elasticsearch_sg" {
44

55
# Elasticsearch native transport protocol
66
ingress {
7-
from_port = 9300
8-
to_port = 9300
7+
from_port = "${var.elasticsearch_native_port}"
8+
to_port = "${var.elasticsearch_native_port}"
99
protocol = "tcp"
1010
cidr_blocks = ["${var.trusted_networks}"]
1111
}
1212

1313
# Elasticsearch HTTP service
1414
ingress {
15-
from_port = 9200
16-
to_port = 9200
15+
from_port = "${var.elasticsearch_http_port}"
16+
to_port = "${var.elasticsearch_http_port}"
1717
protocol = "tcp"
1818
cidr_blocks = ["${var.trusted_networks}"]
1919
}
2020

2121
# Elasticsearch native transport protocol
2222
egress {
23-
from_port = 9300
24-
to_port = 9300
23+
from_port = "${var.elasticsearch_native_port}"
24+
to_port = "${var.elasticsearch_native_port}"
2525
protocol = "tcp"
2626
cidr_blocks = ["${var.trusted_networks}"]
2727
}
2828

2929
# Elasticsearch HTTP service
3030
egress {
31-
from_port = 9200
32-
to_port = 9200
31+
from_port = "${var.elasticsearch_http_port}"
32+
to_port = "${var.elasticsearch_http_port}"
3333
protocol = "tcp"
3434
cidr_blocks = ["${var.trusted_networks}"]
3535
}
@@ -40,27 +40,29 @@ resource "aws_security_group" "elasticsearch_sg" {
4040
}
4141
}
4242

43-
data "template_file" "elasticsearch_master_cloudconfig" {
43+
data "template_file" "master_node_cloudconfig" {
4444
template = "${file("${path.module}/resources/userdata.tpl")}"
4545
vars {
46-
configuration_script = "${base64encode(file("${path.module}/../resources/install-unix-tools.sh"))}"
47-
cluster_name = "${var.ecs_cluster_name}"
4846
cluster_role = "elasticsearch-master"
49-
host_name = "${lower(var.verbose_name)}-elasticsearch"
50-
volume_device = "${var.data_volume_device}"
47+
cluster_name = "${var.ecs_cluster_name}"
48+
instance_group = "${var.ecs_instance_group}"
49+
host_name = "${lower(var.env_name)}-elasticsearch-master"
5150
volume_path = "${var.data_volume_path}"
51+
volume_device = "${var.data_volume_device}"
52+
configuration_script = "${base64encode(file("${path.module}/../resources/install-unix-tools.sh"))}"
5253
}
5354
}
5455

55-
data "template_file" "elasticsearch_data_cloudconfig" {
56+
data "template_file" "data_node_cloudconfig" {
5657
template = "${file("${path.module}/resources/userdata.tpl")}"
5758
vars {
58-
configuration_script = "${base64encode(file("${path.module}/../resources/install-unix-tools.sh"))}"
59-
cluster_name = "${var.ecs_cluster_name}"
6059
cluster_role = "elasticsearch-data"
61-
host_name = "${lower(var.verbose_name)}-elasticsearch"
62-
volume_device = "${var.data_volume_device}"
60+
cluster_name = "${var.ecs_cluster_name}"
61+
instance_group = "${var.ecs_instance_group}"
62+
host_name = "${lower(var.env_name)}-elasticsearch-data"
6363
volume_path = "${var.data_volume_path}"
64+
volume_device = "${var.data_volume_device}"
65+
configuration_script = "${base64encode(file("${path.module}/../resources/install-unix-tools.sh"))}"
6466
}
6567
}
6668

@@ -76,7 +78,7 @@ resource "aws_instance" "elasticsearch_master_instance" {
7678
source_dest_check = false
7779
disable_api_termination = "${var.enable_termination_protection}"
7880
instance_initiated_shutdown_behavior = "stop"
79-
user_data = "${data.template_file.elasticsearch_master_cloudconfig.rendered}"
81+
user_data = "${data.template_file.master_node_cloudconfig.rendered}"
8082
tags {
8183
Env = "${var.env_name}"
8284
Name = "${var.env_name}-${var.verbose_name}-Elasticsearch-Master-Zone${count.index}"
@@ -85,7 +87,6 @@ resource "aws_instance" "elasticsearch_master_instance" {
8587

8688
resource "aws_instance" "elasticsearch_data_instance" {
8789
count = "${var.data_nodes_count}"
88-
depends_on = ["aws_ebs_volume.elasticsearch_data_volume"]
8990
ami = "${var.instance_ami}"
9091
instance_type = "${var.data_instance_type}"
9192
subnet_id = "${element(var.vpc_subnets, count.index)}"
@@ -96,7 +97,7 @@ resource "aws_instance" "elasticsearch_data_instance" {
9697
source_dest_check = false
9798
disable_api_termination = "${var.enable_termination_protection}"
9899
instance_initiated_shutdown_behavior = "stop"
99-
user_data = "${data.template_file.elasticsearch_data_cloudconfig.rendered}"
100+
user_data = "${data.template_file.data_node_cloudconfig.rendered}"
100101
tags {
101102
Env = "${var.env_name}"
102103
Name = "${var.env_name}-${var.verbose_name}-Elasticsearch-Data-Zone${count.index}"
@@ -107,20 +108,19 @@ resource "aws_ebs_volume" "elasticsearch_data_volume" {
107108
count = "${var.data_nodes_count}"
108109
availability_zone = "${element(var.availability_zones, count.index)}"
109110
size = "${var.data_instance_storage_size}"
110-
111111
tags {
112112
Env = "${var.env_name}"
113-
Name = "${var.env_name}-${var.verbose_name}-Elasticseach-Volume-Zone${count.index}"
113+
Name = "${var.env_name}-${var.verbose_name}-Elasticsearch-Data-Volume-Zone${count.index}"
114114
}
115115
}
116116

117117
resource "aws_ebs_volume" "elasticsearch_master_volume" {
118118
count = "${var.master_nodes_count}"
119119
availability_zone = "${element(var.availability_zones, count.index)}"
120-
size = 10
120+
size = "${var.master_instance_storage_size}"
121121
tags {
122122
Env = "${var.env_name}"
123-
Name = "${var.env_name}-${var.verbose_name}-Elasticseach-Volume-Zone${count.index}"
123+
Name = "${var.env_name}-${var.verbose_name}-Elasticsearch-Master-Volume-Zone${count.index}"
124124
}
125125
}
126126

@@ -140,23 +140,24 @@ resource "aws_volume_attachment" "elasticsearch_master_volume_attachement" {
140140
instance_id = "${element(aws_instance.elasticsearch_master_instance.*.id, count.index)}"
141141
}
142142

143+
143144
data "aws_route53_zone" "local" {
144145
zone_id = "${var.vpc_dns_zone_id}"
145146
}
146147

147-
resource "aws_route53_record" "elasticsearch_master_node_dns_records" {
148-
count = "${var.master_nodes_count}"
148+
resource "aws_route53_record" "elasticsearch_master_record" {
149+
count = "${var.master_nodes_count > 0 ? 1 : 0}"
149150
zone_id = "${var.vpc_dns_zone_id}"
150-
name = "${var.master_nodes_count == 1 ? format("elasticsearch.master.%s", data.aws_route53_zone.local.name) : format("elasticsearch.master%d.%s", count.index, data.aws_route53_zone.local.name)}"
151+
name = "elasticsearch.master.${data.aws_route53_zone.local.name}",
151152
type = "A"
152153
ttl = "60"
153-
records = ["${element(aws_instance.elasticsearch_master_instance.*.private_ip, 0)}"]
154+
records = ["${aws_instance.elasticsearch_master_instance.*.private_ip}"]
154155
}
155156

156-
resource "aws_route53_record" "elasticsearch_data_node_dns_records" {
157-
count = "${var.data_nodes_count}"
157+
resource "aws_route53_record" "elasticsearch_data_record" {
158+
count = "${var.data_nodes_count > 0 ? 1 : 0}"
158159
zone_id = "${var.vpc_dns_zone_id}"
159-
name = "${var.data_nodes_count == 1 ? format("elasticsearch.%s", data.aws_route53_zone.local.name) : format("elasticsearch%d.%s", count.index, data.aws_route53_zone.local.name)}"
160+
name = "elasticsearch.${data.aws_route53_zone.local.name}",
160161
type = "A"
161162
ttl = "60"
162163
records = ["${element(aws_instance.elasticsearch_data_instance.*.private_ip, 0)}"]

modules/elasticsearch/ecs.tf

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,67 @@
1-
resource "aws_ecs_cluster" "elasticsearch_cluster" {
2-
name = "${var.ecs_cluster_name}"
1+
data "aws_ecs_cluster" "ecs_cluster" {
2+
cluster_name = "${var.ecs_cluster_name}"
33
}
44

55
resource "aws_ecs_task_definition" "elasticsearch_master_task" {
66
family = "${lower(var.env_name)}-elasticsearch-master"
77
container_definitions = "${data.template_file.elasticsearch_master_config.rendered}"
88
volume {
9-
name = "elasticseach-data"
10-
host_path = "${var.data_volume_path}"
9+
name = "elasticsearch-data"
10+
host_path = "${var.data_volume_path}/elasticsearch-data"
1111
}
1212
}
1313

1414
resource "aws_ecs_task_definition" "elasticsearch_data_task" {
1515
family = "${lower(var.env_name)}-elasticsearch-data"
1616
container_definitions = "${data.template_file.elasticsearch_data_config.rendered}"
1717
volume {
18-
name = "elasticseach-data"
19-
host_path = "${var.data_volume_path}"
18+
name = "elasticsearch-data"
19+
host_path = "${var.data_volume_path}/elasticsearch-data"
2020
}
2121
}
2222

2323
resource "aws_ecs_service" "elasticsearch_master_service" {
24-
depends_on = ["aws_iam_role_policy.docker_policy", "aws_ecs_task_definition.elasticsearch_master_task"]
25-
name = "${lower(var.env_name)}-${lower(var.verbose_name)}-elasticsearch-master"
26-
cluster = "${aws_ecs_cluster.elasticsearch_cluster.id}"
24+
name = "${lower(var.env_name)}-elasticsearch-master"
25+
desired_count = "${var.master_tasks_count}"
26+
cluster = "${data.aws_ecs_cluster.ecs_cluster.id}"
2727
task_definition = "${aws_ecs_task_definition.elasticsearch_master_task.arn}"
28-
desired_count = "${var.master_nodes_count}"
28+
/* Place only of dedicated instances */
2929
placement_constraints {
3030
type = "memberOf"
3131
expression = "attribute:cluster_role == elasticsearch-master"
3232
}
33+
depends_on = ["aws_iam_role_policy.docker_policy", "aws_ecs_task_definition.elasticsearch_master_task"]
3334
}
3435

3536
resource "aws_ecs_service" "elasticsearch_data_service" {
36-
depends_on = ["aws_iam_role_policy.docker_policy", "aws_ecs_task_definition.elasticsearch_master_task"]
37-
name = "${lower(var.env_name)}-${lower(var.verbose_name)}-elasticsearch-data"
38-
cluster = "${aws_ecs_cluster.elasticsearch_cluster.id}"
37+
name = "${lower(var.env_name)}-elasticsearch-data"
38+
desired_count = "${var.data_tasks_count}"
39+
cluster = "${data.aws_ecs_cluster.ecs_cluster.id}"
3940
task_definition = "${aws_ecs_task_definition.elasticsearch_data_task.arn}"
40-
desired_count = "${var.data_nodes_count}"
4141
placement_constraints {
4242
type = "memberOf"
43-
expression = "attribute:cluster_role == elasticsearch-data"
43+
expression = "attribute:group == ${var.ecs_instance_group}"
4444
}
45+
depends_on = ["aws_iam_role_policy.docker_policy", "aws_ecs_task_definition.elasticsearch_master_task"]
4546
}
4647

4748
data "template_file" "elasticsearch_master_config" {
4849
template = "${file("${path.module}/resources/elasticsearch.json")}"
4950
vars {
5051
elasticsearch_version = "${var.elasticsearch_version}"
5152
container_name = "elasticsearch-master"
52-
container_memory = 512
53-
native_transport_port = 9300
54-
http_transport_port = 9200
53+
container_memory = "${var.master_memory_limit}"
54+
native_transport_port = "${var.elasticsearch_native_port}"
55+
http_transport_port = "${var.elasticsearch_http_port}"
5556
cluster_name = "${var.elasticsearch_cluster_name}"
5657
node_name = "${lower(var.verbose_name)}-elasticsearch-master"
5758
is_master = "true"
5859
is_data = "false"
59-
min_master_nodes = "${var.master_nodes_count == 0 ? (var.master_nodes_count / 2) + 1 : 0}"
60-
master_nodes_addresses = ""
61-
heap_size = 256
62-
volume_name = "elasticseach-data"
60+
num_shards = "${var.elasticsearch_num_shards}"
61+
num_replicas = "${var.elasticsearch_num_replicas}"
62+
heap_size = "${var.elasticsearch_memory_limit / 2}"
63+
volume_name = "elasticsearch-data"
64+
extra-options = "-Ddiscovery.zen.minimum_master_nodes=${(var.master_nodes_count / 2) + 1 }"
6365
}
6466
}
6567

@@ -69,15 +71,16 @@ data "template_file" "elasticsearch_data_config" {
6971
elasticsearch_version = "${var.elasticsearch_version}"
7072
container_name = "elasticsearch-data"
7173
container_memory = "${var.elasticsearch_memory_limit}"
72-
native_transport_port = 9300
73-
http_transport_port = 9200
74+
native_transport_port = "${var.elasticsearch_native_port}"
75+
http_transport_port = "${var.elasticsearch_http_port}"
7476
cluster_name = "${var.elasticsearch_cluster_name}"
7577
node_name = "${lower(var.verbose_name)}-elasticsearch-data"
7678
is_master = "${var.is_data_nodes_master_eiligible == 1 ? "true" : "false"}"
7779
is_data = "true"
78-
master_nodes_addresses = "${join(", ", concat(var.external_masters_addresses, aws_route53_record.elasticsearch_master_node_dns_records.*.name))}"
79-
min_master_nodes = "${(var.master_nodes_count / 2) + 1 }"
80+
num_shards = "${var.elasticsearch_num_shards}"
81+
num_replicas = "${var.elasticsearch_num_replicas}"
8082
heap_size = "${var.elasticsearch_memory_limit / 2}"
81-
volume_name = "elasticseach-data"
83+
volume_name = "elasticsearch-data"
84+
extra-options = "-Ddiscovery.zen.ping.unicast.hosts=${join(", ", concat(var.external_masters_addresses, formatlist("$s:%s", aws_route53_record.elasticsearch_master_record.*.name, var.elasticsearch_native_port)))} -Ddiscovery.zen.minimum_master_nodes=${(var.master_nodes_count / 2) + 1 }"
8285
}
8386
}

modules/elasticsearch/iam.tf

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
resource "aws_iam_instance_profile" "elasticsearch" {
2-
name = "${lower(var.env_name)}-${lower(var.verbose_name)}-elasticsearch"
2+
name = "${lower(var.env_name)}-elasticsearch"
33
role = "${aws_iam_role.elasticsearch_role.name}"
44
}
55

66
resource "aws_iam_role" "elasticsearch_role" {
7-
name = "${lower(var.env_name)}-${var.verbose_name}-elasticsearch"
7+
name = "${lower(var.env_name)}-elasticsearch"
88
assume_role_policy = "${data.aws_iam_policy_document.ec2_assume_policy.json}"
99
}
1010

@@ -50,7 +50,6 @@ data "aws_iam_policy_document" "docker_policy" {
5050
"ecr:BatchGetImage",
5151
"logs:CreateLogStream",
5252
"logs:PutLogEvents",
53-
5453
"ec2:AuthorizeSecurityGroupIngress",
5554
"ec2:Describe*",
5655
"elasticloadbalancing:DeregisterInstancesFromLoadBalancer",

modules/elasticsearch/output.tf

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,29 @@
1-
output "private_ips" {
2-
value = ["${aws_instance.elasticsearch_data_instance.*.private_ip}"]
1+
output "elasticsearch_http_address" {
2+
value = "${var.master_nodes_count > 0 ? format("http://%s:%s", aws_route53_record.elasticsearch_master_record.name, var.elasticsearch_http_port) : format("http://%s:%s", aws_route53_record.elasticsearch_data_record.name, var.elasticsearch_http_port)}"
3+
}
4+
5+
output "elasticsearch_native_address" {
6+
value = "${var.master_nodes_count > 0 ? format("%s:%s", aws_route53_record.elasticsearch_master_record.name, var.elasticsearch_native_port) : format("%s:%s", aws_route53_record.elasticsearch_data_record.name, var.elasticsearch_native_port)}"
37
}
48

5-
output "elasticseacrch_master_addresses" {
6-
value = "${formatlist("%s:%s", aws_route53_record.elasticsearch_master_node_dns_records.*.name)}"
9+
output "master_instance_ids" {
10+
value = ["${aws_instance.elasticsearch_master_instance.*.id}"]
711
}
812

9-
output "elasticseacrch_node_addresses" {
10-
value = "${formatlist("%s:%s", aws_route53_record.elasticsearch_data_node_dns_records.*.name)}"
13+
14+
output "master_instance_ips" {
15+
value = ["${aws_instance.elasticsearch_master_instance.*.private_ip}"]
1116
}
1217

13-
output "instance_ids" {
18+
output "data_instance_ids" {
1419
value = ["${aws_instance.elasticsearch_data_instance.*.id}"]
1520
}
1621

22+
23+
output "data_instance_ips" {
24+
value = ["${aws_instance.elasticsearch_data_instance.*.private_ip}"]
25+
}
26+
1727
output "elasticsearch_sg_id" {
1828
value = "${aws_security_group.elasticsearch_sg.id}"
1929
}

0 commit comments

Comments
 (0)