182 lines
4.1 KiB
HCL
182 lines
4.1 KiB
HCL
variable "region" {}
|
|
variable "ami" {}
|
|
variable "instance_type" {}
|
|
variable "key_name" {}
|
|
variable "server_count" {}
|
|
variable "client_count" {}
|
|
variable "cluster_tag_value" {}
|
|
|
|
data "aws_vpc" "default" {
|
|
default = true
|
|
}
|
|
|
|
resource "aws_security_group" "primary" {
|
|
name = "hashistack"
|
|
vpc_id = "${data.aws_vpc.default.id}"
|
|
|
|
ingress {
|
|
from_port = 22
|
|
to_port = 22
|
|
protocol = "tcp"
|
|
cidr_blocks = ["0.0.0.0/0"]
|
|
}
|
|
|
|
# Consul UI
|
|
ingress {
|
|
from_port = 8500
|
|
to_port = 8500
|
|
protocol = "tcp"
|
|
cidr_blocks = ["0.0.0.0/0"]
|
|
}
|
|
|
|
# HDFS NameNode UI
|
|
ingress {
|
|
from_port = 50070
|
|
to_port = 50070
|
|
protocol = "tcp"
|
|
cidr_blocks = ["0.0.0.0/0"]
|
|
}
|
|
|
|
# HDFS DataNode UI
|
|
ingress {
|
|
from_port = 50075
|
|
to_port = 50075
|
|
protocol = "tcp"
|
|
cidr_blocks = ["0.0.0.0/0"]
|
|
}
|
|
|
|
# Spark history server UI
|
|
ingress {
|
|
from_port = 18080
|
|
to_port = 18080
|
|
protocol = "tcp"
|
|
cidr_blocks = ["0.0.0.0/0"]
|
|
}
|
|
|
|
ingress {
|
|
from_port = 0
|
|
to_port = 0
|
|
protocol = "-1"
|
|
self = true
|
|
}
|
|
|
|
egress {
|
|
from_port = 0
|
|
to_port = 0
|
|
protocol = "-1"
|
|
cidr_blocks = ["0.0.0.0/0"]
|
|
}
|
|
}
|
|
|
|
data "template_file" "user_data_server_primary" {
|
|
template = "${file("${path.root}/user-data-server.sh")}"
|
|
|
|
vars {
|
|
server_count = "${var.server_count}"
|
|
region = "${var.region}"
|
|
cluster_tag_value = "${var.cluster_tag_value}"
|
|
}
|
|
}
|
|
|
|
data "template_file" "user_data_client" {
|
|
template = "${file("${path.root}/user-data-client.sh")}"
|
|
|
|
vars {
|
|
region = "${var.region}"
|
|
cluster_tag_value = "${var.cluster_tag_value}"
|
|
}
|
|
}
|
|
|
|
resource "aws_instance" "primary" {
|
|
ami = "${var.ami}"
|
|
instance_type = "${var.instance_type}"
|
|
key_name = "${var.key_name}"
|
|
vpc_security_group_ids = ["${aws_security_group.primary.id}"]
|
|
count = "${var.server_count}"
|
|
|
|
#Instance tags
|
|
tags {
|
|
Name = "hashistack-server-${count.index}"
|
|
ConsulAutoJoin = "${var.cluster_tag_value}"
|
|
}
|
|
|
|
user_data = "${data.template_file.user_data_server_primary.rendered}"
|
|
iam_instance_profile = "${aws_iam_instance_profile.instance_profile.name}"
|
|
}
|
|
|
|
resource "aws_instance" "client" {
|
|
ami = "${var.ami}"
|
|
instance_type = "${var.instance_type}"
|
|
key_name = "${var.key_name}"
|
|
vpc_security_group_ids = ["${aws_security_group.primary.id}"]
|
|
count = "${var.client_count}"
|
|
depends_on = ["aws_instance.primary"]
|
|
|
|
#Instance tags
|
|
tags {
|
|
Name = "hashistack-client-${count.index}"
|
|
ConsulAutoJoin = "${var.cluster_tag_value}"
|
|
}
|
|
|
|
user_data = "${data.template_file.user_data_client.rendered}"
|
|
iam_instance_profile = "${aws_iam_instance_profile.instance_profile.name}"
|
|
}
|
|
|
|
resource "aws_iam_instance_profile" "instance_profile" {
|
|
name_prefix = "hashistack"
|
|
role = "${aws_iam_role.instance_role.name}"
|
|
}
|
|
|
|
resource "aws_iam_role" "instance_role" {
|
|
name_prefix = "hashistack"
|
|
assume_role_policy = "${data.aws_iam_policy_document.instance_role.json}"
|
|
}
|
|
|
|
data "aws_iam_policy_document" "instance_role" {
|
|
statement {
|
|
effect = "Allow"
|
|
actions = ["sts:AssumeRole"]
|
|
|
|
principals {
|
|
type = "Service"
|
|
identifiers = ["ec2.amazonaws.com"]
|
|
}
|
|
}
|
|
}
|
|
|
|
resource "aws_iam_role_policy" "auto_discover_cluster" {
|
|
name = "auto-discover-cluster"
|
|
role = "${aws_iam_role.instance_role.id}"
|
|
policy = "${data.aws_iam_policy_document.auto_discover_cluster.json}"
|
|
}
|
|
|
|
data "aws_iam_policy_document" "auto_discover_cluster" {
|
|
statement {
|
|
effect = "Allow"
|
|
|
|
actions = [
|
|
"ec2:DescribeInstances",
|
|
"ec2:DescribeTags",
|
|
"autoscaling:DescribeAutoScalingGroups",
|
|
]
|
|
|
|
resources = ["*"]
|
|
}
|
|
}
|
|
|
|
output "primary_server_private_ips" {
|
|
value = ["${aws_instance.primary.*.private_ip}"]
|
|
}
|
|
|
|
output "primary_server_public_ips" {
|
|
value = ["${aws_instance.primary.*.public_ip}"]
|
|
}
|
|
|
|
output "client_private_ips" {
|
|
value = ["${aws_instance.client.*.private_ip}"]
|
|
}
|
|
|
|
output "client_public_ips" {
|
|
value = ["${aws_instance.client.*.public_ip}"]
|
|
}
|