Skip to content

Commit 3789c91

Browse files
authored
Merge pull request #17 from unifio/yl-wip
PoC module for docker-openvpn
2 parents 2623fd2 + 5761bf7 commit 3789c91

File tree

15 files changed

+803
-0
lines changed

15 files changed

+803
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
*.tfstate*
22
.terraform/
3+
docker-openvpn-server/terraform.tfvars*
4+
docker-openvpn-server/.env

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
## Unreleased
22

3+
* Bring in covalence to help with bootstrapping/testing. Consider some kitchen/localstack testing.
4+
* PoC docker-openvpn-server modules
5+
36
## 1.0.0
47

58
#### IMPROVEMENTS:
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
data "aws_ami" "cluster_ami" {
2+
most_recent = true
3+
4+
filter {
5+
name = "name"
6+
values = ["amzn-ami-*-amazon-ecs-optimized"]
7+
}
8+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
resource "aws_eip" "openvpn_eip" {
2+
count = "${var.assign_eip == "true" ? 1 : 0}"
3+
vpc = true
4+
5+
tags {
6+
application = "${var.stack_item_fullname}"
7+
managed_by = "terraform"
8+
Name = "${var.stack_item_label}"
9+
}
10+
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# inputs
2+
locals {
3+
in_iam_stack_item_label = "${var.stack_item_label}"
4+
in_iam_region = "${var.region}"
5+
in_iam_s3_bucket = "${var.s3_bucket}"
6+
in_iam_s3_bucket_prefix = "${var.s3_bucket_prefix}"
7+
}
8+
9+
# local vars for the file
10+
locals {
11+
local_iam_name = "${local.in_iam_stack_item_label}-${local.in_iam_region}"
12+
local_iam_s3_full_path = "${replace(local.in_iam_s3_bucket,"/(/)+$/","")}/${replace(local.in_iam_s3_bucket_prefix,"/^(/)+|(/)+$/","")}"
13+
local_iam_s3_bucket_path = "${replace(local.in_iam_s3_bucket,"/(/)+$/","")}"
14+
}
15+
16+
## Creates IAM role & policies
17+
resource "aws_iam_role" "role" {
18+
name = "${local.local_iam_name}"
19+
path = "/"
20+
21+
assume_role_policy = <<EOF
22+
{
23+
"Version": "2012-10-17",
24+
"Statement": [
25+
{
26+
"Effect": "Allow",
27+
"Action": "sts:AssumeRole",
28+
"Principal": {
29+
"Service": "ec2.amazonaws.com"
30+
}
31+
}
32+
]
33+
}
34+
EOF
35+
}
36+
37+
resource "aws_iam_role_policy" "s3_certs_ro" {
38+
name = "s3_certs_ro"
39+
role = "${aws_iam_role.role.id}"
40+
41+
policy = <<EOF
42+
{
43+
"Version": "2012-10-17",
44+
"Statement": [
45+
{
46+
"Effect": "Allow",
47+
"Action": [
48+
"s3:Get*"
49+
],
50+
"Resource": [
51+
"arn:aws:s3:::${local.local_iam_s3_full_path}",
52+
"arn:aws:s3:::${local.local_iam_s3_full_path}/*"
53+
]
54+
},
55+
{
56+
"Effect": "Allow",
57+
"Action": [
58+
"s3:List*"
59+
],
60+
"Resource": [
61+
"arn:aws:s3:::${local.local_iam_s3_bucket_path}"
62+
]
63+
}
64+
]
65+
}
66+
EOF
67+
}
68+
69+
resource "aws_iam_role_policy" "tags" {
70+
name = "tags"
71+
role = "${aws_iam_role.role.id}"
72+
73+
policy = <<EOF
74+
{
75+
"Version": "2012-10-17",
76+
"Statement": [
77+
{
78+
"Effect": "Allow",
79+
"Action": [
80+
"ec2:CreateTags",
81+
"ec2:DescribeTags",
82+
"ec2:AssociateAddress",
83+
"ec2:DescribeAddresses",
84+
"ec2:DescribeInstances"
85+
],
86+
"Resource": "*"
87+
}
88+
]
89+
}
90+
EOF
91+
}
92+
93+
## Creates IAM instance profile
94+
resource "aws_iam_instance_profile" "profile" {
95+
name = "${local.local_iam_name}"
96+
role = "${aws_iam_role.role.name}"
97+
}
98+
99+
## outputs
100+
locals {
101+
out_iam_instance_profile_id = "${aws_iam_instance_profile.profile.id}"
102+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
provider "template" {
2+
version = "~> 1.0.0"
3+
}
4+
5+
locals {
6+
user_data_vars = {
7+
additional_routes = "${var.additional_routes}"
8+
assign_eip = "${var.assign_eip}"
9+
hostname = "${var.stack_item_label}"
10+
s3_bucket = "${var.s3_bucket}"
11+
s3_bucket_prefix = "${coalesce(var.s3_bucket_prefix_for_service, var.s3_bucket_prefix)}"
12+
stack_item_label = "${var.stack_item_label}"
13+
region = "${var.region}"
14+
route_cidrs = "${var.route_cidrs}"
15+
vpc_dns_ip = "${var.vpc_dns_ip}"
16+
openvpn_docker_image = "${var.openvpn_docker_image}"
17+
openvpn_docker_tag = "${var.openvpn_docker_tag}"
18+
}
19+
}
20+
21+
## Creates instance user data
22+
data "template_file" "user_data" {
23+
template = "${file("${path.module}/templates/user_data.tpl")}"
24+
vars = "${local.user_data_vars}"
25+
}
26+
27+
## Creates auto scaling cluster
28+
module "cluster" {
29+
source = "github.com/unifio/terraform-aws-asg?ref=v0.3.2//group"
30+
31+
# Resource tags
32+
stack_item_label = "${var.stack_item_label}"
33+
stack_item_fullname = "${var.stack_item_fullname}"
34+
35+
# VPC parameters
36+
vpc_id = "${var.vpc_id}"
37+
subnets = ["${split(",",var.subnets)}"]
38+
39+
# LC parameters
40+
ami = "${coalesce(var.ami_custom, data.aws_ami.cluster_ami.id)}"
41+
ebs_optimized = "false"
42+
enable_monitoring = "true"
43+
instance_based_naming_enabled = "${var.instance_based_naming_enabled}"
44+
instance_profile = "${aws_iam_instance_profile.profile.id}"
45+
instance_type = "${var.instance_type}"
46+
key_name = "${var.key_name}"
47+
user_data = "${coalesce(var.ami_custom_user_data, data.template_file.user_data.rendered)}"
48+
associate_public_ip_address = "${var.associate_public_ip_address}"
49+
50+
# ASG parameters
51+
enabled_metrics = "${var.enabled_metrics}"
52+
hc_check_type = "${var.enable_lb == "true" ? "ELB" : "EC2"}"
53+
instance_tags = "${var.instance_tags}"
54+
max_size = 2
55+
min_size = 1
56+
hc_grace_period = 300
57+
target_group_arns = "${var.lb_target_group_arns}"
58+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# inputs
2+
locals {
3+
in_sg_id = "${module.cluster.sg_id}"
4+
in_sg_vpn_whitelist = "${var.vpn_whitelist}"
5+
in_sg_ssh_whitelist = "${var.ssh_whitelist}"
6+
}
7+
8+
## Creates security group rules
9+
resource "aws_security_group_rule" "cluster_allow_all_out" {
10+
type = "egress"
11+
from_port = 0
12+
to_port = 0
13+
protocol = "-1"
14+
cidr_blocks = ["0.0.0.0/0"]
15+
security_group_id = "${local.in_sg_id}"
16+
}
17+
18+
resource "aws_security_group_rule" "cluster_allow_openvpn_tcp_in" {
19+
type = "ingress"
20+
from_port = 1194
21+
to_port = 1194
22+
protocol = "tcp"
23+
cidr_blocks = ["${split(",",local.in_sg_vpn_whitelist)}"]
24+
security_group_id = "${local.in_sg_id}"
25+
}
26+
27+
resource "aws_security_group_rule" "cluster_allow_ssh_in" {
28+
type = "ingress"
29+
from_port = 22
30+
to_port = 22
31+
protocol = "tcp"
32+
cidr_blocks = ["${split(",",local.in_sg_ssh_whitelist)}"]
33+
security_group_id = "${local.in_sg_id}"
34+
}
35+
36+
resource "aws_security_group_rule" "cluster_allow_icmp_in" {
37+
type = "ingress"
38+
from_port = 0
39+
to_port = 0
40+
protocol = "icmp"
41+
cidr_blocks = ["${split(",",var.ssh_whitelist)}"]
42+
security_group_id = "${local.in_sg_id}"
43+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#cloud-config
2+
runcmd:
3+
- sleep 60
4+
- yum update -y
5+
- yum install jq -y
6+
- curl -s -O https://bootstrap.pypa.io/get-pip.py && python get-pip.py
7+
- /usr/local/bin/pip install awscli && ln -sf /usr/local/bin/aws /usr/bin/
8+
9+
- export INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id`
10+
- docker pull ${openvpn_docker_image}:${openvpn_docker_tag}
11+
- mkdir -p /opt/openvpn
12+
- touch /opt/openvpn/.env && chmod 700 /opt/openvpn/.env
13+
- touch /opt/openvpn/server-append.conf && chmod 700 /opt/openvpn/server-append.conf
14+
- echo "OPENVPN_S3_PULL_CERTS=true" >> /opt/openvpn/.env
15+
- echo "OPENVPN_S3_CERT_PATH=${replace(s3_bucket,"/(/)+$/","")}/${replace(s3_bucket_prefix,"/^(/)+|(/)+$/","")}" >> /opt/openvpn/.env
16+
- if [ -n "${vpc_dns_ip}" ]; then echo "push \"dhcp-option DNS ${vpc_dns_ip}\"" >> /opt/openvpn/server-append.conf;fi
17+
- echo "push \"route $(ip route get 8.8.8.8| grep src| sed 's/.*src \(.*\)$/\1/g') 255.255.255.255 net_gateway\"" >> /opt/openvpn/server-append.conf
18+
- echo "push \"route ${cidrhost(element(split(",",route_cidrs),1), 0)} ${cidrnetmask(element(split(",",route_cidrs),1))}\"" >> /opt/openvpn/server-append.conf
19+
- echo "push \"route ${cidrhost(element(split(",",route_cidrs),2), 0)} ${cidrnetmask(element(split(",",route_cidrs),2))}\"" >> /opt/openvpn/server-append.conf
20+
- echo "push \"route ${cidrhost(element(split(",",route_cidrs),3), 0)} ${cidrnetmask(element(split(",",route_cidrs),3))}\"" >> /opt/openvpn/server-append.conf
21+
- echo "push \"route ${cidrhost(element(split(",",route_cidrs),4), 0)} ${cidrnetmask(element(split(",",route_cidrs),4))}\"" >> /opt/openvpn/server-append.conf
22+
- for route in `echo ${additional_routes} | tr ',' ' '`; do echo "push \"route $${route} 255.255.255.255\"" >> /opt/openvpn/server-append.conf;done
23+
24+
- echo "OPENVPN_COMPRESS_ALGORITHM=lzo" >> /opt/openvpn/.env
25+
- echo "OPENVPN_KEY_DHSIZE=1024" >> /opt/openvpn/.env
26+
- echo "OPENVPN_TLS_ENABLE=false" >> /opt/openvpn/.env
27+
28+
- docker run -d --name openvpn --env-file=/opt/openvpn/.env --cap-add=NET_ADMIN --device=/dev/net/tun -v /opt/openvpn/:/etc/openvpn/ -v /var/run/openvpn/:/var/run/openvpn -p 1194:1194/tcp ${openvpn_docker_image}:${openvpn_docker_tag} /start_server.sh
29+
- if [ ${assign_eip} = 'true' ]; then for eip in `aws ec2 describe-tags --region=${region} --filters "Name=resource-type,Values=elastic-ip" "Name=value,Values=${stack_item_label}" | jq -r '.Tags[].ResourceId'`; do if [ `aws ec2 describe-addresses --allocation-id $${eip} --region=${region} | jq -r '.Addresses[].InstanceId'` = 'null' ]; then echo "$${eip} is available, assigning it to current instance";aws ec2 associate-address --instance-id "$${INSTANCE_ID}" --allocation-id $${eip} --region=${region};else echo "$${eip} is taken";fi; done;fi
30+
31+
output : { all : '| tee -a /var/log/cloud-init-output.log' }

0 commit comments

Comments
 (0)