Skip to content

Commit ff371fb

Browse files
authored
Add support for EC2 instance type (#63)
* add support for ec2 instance type * update changelog and readme * PR comment updates
1 parent 6271d08 commit ff371fb

14 files changed

+323
-15
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,5 @@ target/
3939
# Ansible host file
4040
ansible/*-hosts
4141
ansible/*-hosts
42+
43+
test/*

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ All notable changes to this project will be documented in this file.
33

44
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
55

6+
## [2.0.0] - TBD
7+
8+
### Added
9+
- Support for running Waggle Dance on EC2 nodes.
10+
611
## [1.1.3] - 2019-06-27
712

813
### Changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ For more information please refer to the main [Apiary](https://github.com/Expedi
3131
| tags | A map of tags to apply to resources. | map | `<map>` | no |
3232
| vpc_id | VPC ID. | string | - | yes |
3333
| wd_ecs_task_count | Number of ECS tasks to create. | string | `1` | no |
34+
| wd_instance_type | Waggle Dance instance type, possible values: `ecs`,`ec2`. | string | `ecs` | no |
35+
| waggledance_version | Waggle Dance version to install on EC2 nodes | string | `3.3.2` | no |
36+
| key_name | Waggle Dance EC2 ssh key pair name. | string | automation | no |
37+
| root_vol_type | Waggle Dance EC2 root volume type. | string | `gp2` | no |
38+
| root_vol_size | Waggle Dance EC2 root volume size. | string | `10` | no |
39+
| ec2_instance_type | Waggle Dance EC2 instance type. | string | `m5.large` | no |
40+
| ami_id | Amazon Linux AMI. | string | - | no |
3441

3542
## Usage
3643

common.tf

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,23 @@
55
*/
66

77
locals {
8-
instance_alias = "${ var.instance_name == "" ? "waggledance" : format("waggledance-%s",var.instance_name) }"
9-
remote_metastore_zone_prefix = "${ var.instance_name == "" ? "remote-metastore" : format("remote-metastore-%s",var.instance_name) }"
8+
instance_alias = "${var.instance_name == "" ? "waggledance" : format("waggledance-%s", var.instance_name)}"
9+
remote_metastore_zone_prefix = "${var.instance_name == "" ? "remote-metastore" : format("remote-metastore-%s", var.instance_name)}"
10+
cw_arn = "arn:aws:swf:${var.aws_region}:${data.aws_caller_identity.current.account_id}:action/actions/AWS_EC2.InstanceId.Reboot/1.0"
1011
}
1112

13+
data "aws_caller_identity" "current" {}
14+
1215
data "aws_vpc" "waggledance_vpc" {
1316
id = "${var.vpc_id}"
1417
}
1518

1619
data "aws_secretsmanager_secret" "bastion_ssh_key" {
17-
count = "${ var.bastion_ssh_key_secret_name == "" ? 0 : 1}"
20+
count = "${var.bastion_ssh_key_secret_name == "" ? 0 : 1}"
1821
name = "${var.bastion_ssh_key_secret_name}"
1922
}
2023

2124
data "aws_secretsmanager_secret" "docker_registry" {
22-
count = "${ var.docker_registry_auth_secret_name == "" ? 0 : 1 }"
23-
name = "${ var.docker_registry_auth_secret_name }"
25+
count = "${var.docker_registry_auth_secret_name == "" ? 0 : 1}"
26+
name = "${var.docker_registry_auth_secret_name}"
2427
}

ec2.tf

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/**
2+
* Copyright (C) 2018-2019 Expedia Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
*/
6+
7+
data "aws_ami" "amzn" {
8+
most_recent = true
9+
owners = ["amazon"]
10+
11+
filter {
12+
name = "architecture"
13+
values = ["x86_64"]
14+
}
15+
16+
filter {
17+
name = "name"
18+
values = ["amzn-ami-hvm-*-ebs"]
19+
}
20+
21+
filter {
22+
name = "root-device-type"
23+
values = ["ebs"]
24+
}
25+
26+
filter {
27+
name = "virtualization-type"
28+
values = ["hvm"]
29+
}
30+
}
31+
32+
data "template_file" "waggledance_userdata" {
33+
template = "${file("${path.module}/templates/waggledance_userdata.sh")}"
34+
}
35+
36+
resource "aws_instance" "waggledance" {
37+
count = "${var.wd_instance_type == "ecs" ? 0 : length(var.subnets)}"
38+
ami = "${var.ami_id == "" ? data.aws_ami.amzn.id : var.ami_id}"
39+
instance_type = "${var.ec2_instance_type}"
40+
key_name = "${var.key_name}"
41+
ebs_optimized = true
42+
43+
subnet_id = "${var.subnets[count.index]}"
44+
iam_instance_profile = "${aws_iam_instance_profile.waggledance.id}"
45+
vpc_security_group_ids = ["${aws_security_group.wd_sg.id}"]
46+
47+
user_data_base64 = "${base64encode(data.template_file.waggledance_userdata.rendered)}"
48+
49+
root_block_device {
50+
volume_type = "${var.root_vol_type}"
51+
volume_size = "${var.root_vol_size}"
52+
}
53+
54+
tags = "${merge(map("Name", "${local.instance_alias}-${count.index + 1}"), "${var.tags}")}"
55+
56+
lifecycle {
57+
create_before_destroy = true
58+
}
59+
}
60+
61+
resource "aws_cloudwatch_metric_alarm" "waggledance" {
62+
count = "${var.wd_instance_type == "ecs" ? 0 : length(var.subnets)}"
63+
64+
alarm_name = "Auto Reboot - ${aws_instance.waggledance.*.id[count.index]}"
65+
66+
dimensions {
67+
InstanceId = "${aws_instance.waggledance.*.id[count.index]}"
68+
}
69+
70+
metric_name = "StatusCheckFailed"
71+
namespace = "AWS/EC2"
72+
period = "60"
73+
statistic = "Average"
74+
threshold = "1"
75+
comparison_operator = "GreaterThanOrEqualToThreshold"
76+
evaluation_periods = "3"
77+
78+
alarm_description = "This will restart ${local.instance_alias}-${count.index + 1} if the status check fails"
79+
80+
alarm_actions = ["${local.cw_arn}"]
81+
}

ecs-service-discovery.tf

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
*/
66

77
resource "aws_service_discovery_private_dns_namespace" "waggledance" {
8-
name = "${local.instance_alias}-${var.aws_region}.${var.domain_extension}"
9-
vpc = "${var.vpc_id}"
8+
count = "${var.wd_instance_type == "ecs" ? 1 : 0}"
9+
name = "${local.instance_alias}-${var.aws_region}.${var.domain_extension}"
10+
vpc = "${var.vpc_id}"
1011
}
1112

1213
resource "aws_service_discovery_service" "metastore_proxy" {
13-
name = "metastore-proxy"
14+
count = "${var.wd_instance_type == "ecs" ? 1 : 0}"
15+
name = "metastore-proxy"
1416

1517
dns_config {
1618
namespace_id = "${aws_service_discovery_private_dns_namespace.waggledance.id}"
@@ -29,8 +31,8 @@ resource "aws_service_discovery_service" "metastore_proxy" {
2931
}
3032

3133
resource "aws_route53_zone_association" "secondary" {
32-
count = "${length(var.secondary_vpcs)}"
34+
count = "${var.wd_instance_type == "ecs" ? length(var.secondary_vpcs) : 0}"
3335
zone_id = "${aws_service_discovery_private_dns_namespace.waggledance.hosted_zone}"
34-
vpc_id = "${element(var.secondary_vpcs,count.index)}"
36+
vpc_id = "${element(var.secondary_vpcs, count.index)}"
3537
vpc_region = "${var.aws_region}"
3638
}

ecs.tf

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
*/
66

77
resource "aws_ecs_cluster" "waggledance" {
8-
name = "${local.instance_alias}"
9-
tags = "${var.tags}"
8+
count = "${var.wd_instance_type == "ecs" ? 1 : 0}"
9+
name = "${local.instance_alias}"
10+
tags = "${var.tags}"
1011
}
1112

1213
resource "aws_ecs_service" "waggledance_service" {
14+
count = "${var.wd_instance_type == "ecs" ? 1 : 0}"
1315
name = "${local.instance_alias}-service"
1416
launch_type = "FARGATE"
1517
cluster = "${aws_ecs_cluster.waggledance.id}"
@@ -27,6 +29,7 @@ resource "aws_ecs_service" "waggledance_service" {
2729
}
2830

2931
resource "aws_ecs_task_definition" "waggledance" {
32+
count = "${var.wd_instance_type == "ecs" ? 1 : 0}"
3033
family = "${local.instance_alias}"
3134
task_role_arn = "${aws_iam_role.waggledance_task.arn}"
3235
execution_role_arn = "${aws_iam_role.waggledance_task_exec.arn}"

iam-ecs.tf

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ resource "aws_iam_role_policy" "secretsmanager_for_ecs_task_exec" {
4242
"Statement": {
4343
"Effect": "Allow",
4444
"Action": "secretsmanager:GetSecretValue",
45-
"Resource": [ "${join("\",\"",concat(data.aws_secretsmanager_secret.docker_registry.*.arn))}" ]
45+
"Resource": [ "${join("\",\"", concat(data.aws_secretsmanager_secret.docker_registry.*.arn))}" ]
4646
}
4747
}
4848
EOF
@@ -59,7 +59,7 @@ resource "aws_iam_role" "waggledance_task" {
5959
"Sid": "",
6060
"Effect": "Allow",
6161
"Principal": {
62-
"Service": "ecs-tasks.amazonaws.com"
62+
"Service": [ "ecs-tasks.amazonaws.com", "ec2.amazonaws.com" ]
6363
},
6464
"Action": "sts:AssumeRole"
6565
}
@@ -71,7 +71,7 @@ EOF
7171
}
7272

7373
resource "aws_iam_role_policy" "secretsmanager_for_waggledance_task" {
74-
count = "${ var.bastion_ssh_key_secret_name == "" ? 0 : 1}"
74+
count = "${var.bastion_ssh_key_secret_name == "" ? 0 : 1}"
7575
name = "secretsmanager"
7676
role = "${aws_iam_role.waggledance_task.id}"
7777

@@ -86,3 +86,15 @@ resource "aws_iam_role_policy" "secretsmanager_for_waggledance_task" {
8686
}
8787
EOF
8888
}
89+
90+
resource "aws_iam_role_policy_attachment" "waggledance_ssm_policy" {
91+
count = "${var.wd_instance_type == "ecs" ? 0 : 1}"
92+
role = "${aws_iam_role.waggledance_task.name}"
93+
policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM"
94+
}
95+
96+
resource "aws_iam_instance_profile" "waggledance" {
97+
count = "${var.wd_instance_type == "ecs" ? 0 : 1}"
98+
name = "${aws_iam_role.waggledance_task.name}"
99+
role = "${aws_iam_role.waggledance_task.name}"
100+
}

route53.tf

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Copyright (C) 2018-2019 Expedia Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
*/
6+
7+
resource "aws_route53_zone" "waggledance" {
8+
count = "${var.wd_instance_type == "ecs" ? 0 : 1}"
9+
name = "${local.instance_alias}-${var.aws_region}.${var.domain_extension}"
10+
11+
vpc = {
12+
vpc_id = "${var.vpc_id}"
13+
}
14+
}
15+
16+
resource "aws_route53_record" "metastore_proxy" {
17+
count = "${var.wd_instance_type == "ecs" ? 0 : 1}"
18+
name = "metastore-proxy"
19+
20+
zone_id = "${aws_route53_zone.waggledance.id}"
21+
type = "A"
22+
ttl = "300"
23+
records = ["${aws_instance.waggledance.*.private_ip}"]
24+
}

sg.tf

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ resource "aws_security_group" "wd_sg" {
99
vpc_id = "${var.vpc_id}"
1010
tags = "${var.tags}"
1111

12+
ingress {
13+
from_port = 22
14+
to_port = 22
15+
protocol = "tcp"
16+
cidr_blocks = "${var.ingress_cidr}"
17+
}
18+
1219
ingress {
1320
from_port = 48869
1421
to_port = 48869

ssm.tf

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* Copyright (C) 2018-2019 Expedia Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
*/
6+
7+
data "template_file" "waggledance_playbook" {
8+
template = "${file("${path.module}/templates/waggledance_playbook.yml")}"
9+
10+
vars {
11+
aws_region = "${var.aws_region}"
12+
waggledance_version = "${var.waggledance_version}"
13+
server_yaml = "${base64encode(data.template_file.server_yaml.rendered)}"
14+
federation_yaml = "${base64encode(data.template_file.federation_yaml.rendered)}"
15+
}
16+
}
17+
18+
#to delay ssm assiociation till ansible is installed
19+
resource "null_resource" "waggledance_delay" {
20+
count = "${var.wd_instance_type == "ecs" ? 0 : 1}"
21+
22+
triggers = {
23+
waggledance_instance_ids = "${join(",", aws_instance.waggledance.*.id)}"
24+
}
25+
26+
provisioner "local-exec" {
27+
command = "sleep 90"
28+
}
29+
}
30+
31+
resource "aws_ssm_association" "waggledance_playbook" {
32+
count = "${var.wd_instance_type == "ecs" ? 0 : 1}"
33+
name = "AWS-RunAnsiblePlaybook"
34+
association_name = "${local.instance_alias}-playbook"
35+
36+
schedule_expression = "rate(30 minutes)"
37+
38+
targets {
39+
key = "InstanceIds"
40+
values = ["${aws_instance.waggledance.*.id}"]
41+
}
42+
43+
parameters = {
44+
playbook = "${data.template_file.waggledance_playbook.rendered}"
45+
}
46+
47+
depends_on = ["null_resource.waggledance_delay"]
48+
}

templates/waggledance_playbook.yml

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
- hosts: all
2+
become: true
3+
4+
vars:
5+
server_yaml: "${server_yaml}"
6+
federation_yaml: "${federation_yaml}"
7+
heapsize: "{{ (ansible_memtotal_mb * 0.8)|int }}"
8+
9+
tasks:
10+
11+
- name: cleanup packages
12+
yum:
13+
name:
14+
- java-1.7.0-openjdk
15+
state: absent
16+
17+
- name: install binaries
18+
yum:
19+
name:
20+
- java-1.8.0-openjdk
21+
- wget
22+
- unzip
23+
- jq
24+
- htop
25+
- telnet
26+
- nc
27+
state: present
28+
29+
- name: install waggle-dance
30+
yum:
31+
name: http://search.maven.org/remotecontent?filepath=com/hotels/waggle-dance-rpm/${waggledance_version}/waggle-dance-rpm-${waggledance_version}.rpm
32+
state: present
33+
34+
- name: server yaml
35+
copy:
36+
dest: /opt/waggle-dance/conf/waggle-dance-server.yml
37+
content: "{{ server_yaml|b64decode }}"
38+
39+
- name: federation yaml
40+
copy:
41+
dest: /opt/waggle-dance/conf/waggle-dance-federation.yml
42+
content: "{{ federation_yaml|b64decode }}"
43+
44+
- name: server conf
45+
copy:
46+
dest: /opt/waggle-dance/service/waggle-dance-core-latest-exec.conf
47+
content: |
48+
LOG_FOLDER=/var/log/waggle-dance/
49+
JAVA_OPTS="-Xmx{{ heapsize }}m -Xms{{ heapsize }}m -XX:+UseG1GC -XX:G1ReservePercent=15 -Dlog4j.configurationFile=/opt/waggle-dance/conf/log4j2.xml -Dlogging.config=/opt/waggle-dance/conf/log4j2.xml"
50+
RUN_ARGS="--server-config=/opt/waggle-dance/conf/waggle-dance-server.yml --federation-config=/opt/waggle-dance/conf/waggle-dance-federation.yml"
51+
notify:
52+
- restart-waggledance
53+
54+
- name: state waggle-dance
55+
service:
56+
name: waggle-dance
57+
enabled: yes
58+
state: started
59+
60+
handlers:
61+
62+
- name: restart-waggledance
63+
service:
64+
name: waggle-dance
65+
enabled: yes
66+
state: restarted

0 commit comments

Comments
 (0)