fix(terraform): AWS
[csit.git] / fdio.infra.terraform / terraform-aws-2n-aws-c5n / main.tf
1 data "vault_aws_access_credentials" "creds" {
2   backend = "${var.vault-name}-path"
3   role    = "${var.vault-name}-role"
4 }
5
6 locals {
7   ansible_python_executable = "/usr/bin/python3"
8   availability_zone         = "eu-central-1a"
9   name                      = "csit-vpc"
10   environment               = "csit-vpc-environment"
11   key_pair_key_name         = "${var.resource_prefix}-${var.testbed_name}-pk"
12   placement_group_name      = "${var.resource_prefix}-${var.testbed_name}-pg"
13   security_group_name       = "${var.resource_prefix}-${var.testbed_name}-sg"
14   testbed_name              = "testbed1"
15   topology_name             = "2n-aws-c5n"
16   tg_name                   = "${var.resource_prefix}-${var.testbed_name}-tg"
17   sut1_name                 = "${var.resource_prefix}-${var.testbed_name}-sut1"
18 }
19
20 # Create VPC
21 module "vpc" {
22   source                   = "../terraform-aws-vpc"
23   security_group_name      = local.security_group_name
24   subnet_availability_zone = local.availability_zone
25   tags_name                = local.name
26   tags_environment         = local.environment
27   vpc_enable_dns_hostnames = false
28 }
29
30 # Create Subnet
31 module "subnet_b" {
32   source                   = "../terraform-aws-subnet"
33   subnet_cidr_block        = "192.168.10.0/24"
34   subnet_ipv6_cidr_block   = cidrsubnet(module.vpc.vpc_ipv6_cidr_block, 8, 2)
35   subnet_availability_zone = local.availability_zone
36   tags_name                = local.name
37   tags_environment         = local.environment
38   subnet_vpc_id            = module.vpc.vpc_id
39 }
40
41 module "subnet_d" {
42   source                   = "../terraform-aws-subnet"
43   subnet_cidr_block        = "192.168.20.0/24"
44   subnet_ipv6_cidr_block   = cidrsubnet(module.vpc.vpc_ipv6_cidr_block, 8, 4)
45   subnet_availability_zone = local.availability_zone
46   tags_name                = local.name
47   tags_environment         = local.environment
48   subnet_vpc_id            = module.vpc.vpc_id
49 }
50
51 # Create Private Key
52 resource "tls_private_key" "private_key" {
53   algorithm   = var.private_key_algorithm
54 }
55
56 # Create Key Pair
57 resource "aws_key_pair" "key_pair" {
58   depends_on = [
59     tls_private_key.private_key
60   ]
61   key_name   = local.key_pair_key_name
62   public_key = tls_private_key.private_key.public_key_openssh
63 }
64
65 # Create Placement Group
66 resource "aws_placement_group" "placement_group" {
67   name     = local.placement_group_name
68   strategy = var.placement_group_strategy
69 }
70
71 # Create Instance
72 resource "aws_instance" "tg" {
73   depends_on = [
74     module.vpc,
75     aws_placement_group.placement_group
76   ]
77   ami                                  = var.tg_ami
78   availability_zone                    = local.availability_zone
79   associate_public_ip_address          = var.tg_associate_public_ip_address
80   instance_initiated_shutdown_behavior = var.tg_instance_initiated_shutdown_behavior
81   instance_type                        = var.tg_instance_type
82   key_name                             = aws_key_pair.key_pair.key_name
83   placement_group                      = aws_placement_group.placement_group.id
84   private_ip                           = var.tg_private_ip
85   source_dest_check                    = var.tg_source_dest_check
86   subnet_id                            = module.vpc.vpc_subnet_id
87   vpc_security_group_ids               = [module.vpc.vpc_security_group_id]
88   # host_id                            = "1"
89
90   root_block_device {
91     delete_on_termination = true
92     volume_size           = 50
93   }
94
95   tags = {
96     "Name"        = local.tg_name
97     "Environment" = local.environment
98   }
99 }
100
101 resource "aws_network_interface" "tg_if1" {
102   depends_on = [
103     module.subnet_b,
104     aws_instance.tg
105   ]
106   private_ip        = var.tg_if1_private_ip
107   private_ips       = [var.tg_if1_private_ip]
108   security_groups   = [module.vpc.vpc_security_group_id]
109   source_dest_check = var.tg_source_dest_check
110   subnet_id         = module.subnet_b.subnet_id
111
112   attachment {
113     instance     = aws_instance.tg.id
114     device_index = 1
115   }
116
117   tags = {
118     "Name"        = local.tg_name
119     "Environment" = local.environment
120   }
121 }
122
123 resource "aws_network_interface" "tg_if2" {
124   depends_on = [
125     module.subnet_d,
126     aws_instance.tg
127   ]
128   private_ip        = var.tg_if2_private_ip
129   private_ips       = [var.tg_if2_private_ip]
130   security_groups   = [module.vpc.vpc_security_group_id]
131   source_dest_check = var.tg_source_dest_check
132   subnet_id         = module.subnet_d.subnet_id
133
134   attachment {
135     instance     = aws_instance.tg.id
136     device_index = 2
137   }
138
139   tags = {
140     "Name"        = local.tg_name
141     "Environment" = local.environment
142   }
143 }
144
145 data "aws_network_interface" "tg_if1" {
146   id = aws_network_interface.tg_if1.id
147 }
148
149 data "aws_network_interface" "tg_if2" {
150   id = aws_network_interface.tg_if2.id
151 }
152
153 resource "aws_route" "route_tg_if1" {
154   depends_on = [
155     aws_instance.tg
156   ]
157   destination_cidr_block = var.destination_cidr_block_tg_if1
158   network_interface_id   = aws_instance.tg.primary_network_interface_id
159   route_table_id         = module.vpc.vpc_main_route_table_id
160 }
161
162 resource "aws_route" "route_tg_if2" {
163   depends_on = [
164     aws_instance.tg
165   ]
166   destination_cidr_block = var.destination_cidr_block_tg_if2
167   network_interface_id   = aws_instance.tg.primary_network_interface_id
168   route_table_id         = module.vpc.vpc_main_route_table_id
169 }
170
171 resource "aws_instance" "sut1" {
172   depends_on = [
173     module.vpc,
174     aws_placement_group.placement_group
175   ]
176   ami                                  = var.sut1_ami
177   availability_zone                    = local.availability_zone
178   associate_public_ip_address          = var.sut1_associate_public_ip_address
179   instance_initiated_shutdown_behavior = var.sut1_instance_initiated_shutdown_behavior
180   instance_type                        = var.sut1_instance_type
181   key_name                             = aws_key_pair.key_pair.key_name
182   placement_group                      = aws_placement_group.placement_group.id
183   private_ip                           = var.sut1_private_ip
184   source_dest_check                    = var.sut1_source_dest_check
185   subnet_id                            = module.vpc.vpc_subnet_id
186   vpc_security_group_ids               = [module.vpc.vpc_security_group_id]
187   # host_id                            = "2"
188
189   root_block_device {
190     delete_on_termination = true
191     volume_size           = 50
192   }
193
194   tags = {
195     "Name"        = local.sut1_name
196     "Environment" = local.environment
197   }
198 }
199
200 resource "aws_network_interface" "sut1_if1" {
201   depends_on = [
202     module.subnet_b,
203     aws_instance.sut1
204   ]
205   private_ip        = var.sut1_if1_private_ip
206   private_ips       = [var.sut1_if1_private_ip]
207   security_groups   = [module.vpc.vpc_security_group_id]
208   source_dest_check = var.sut1_source_dest_check
209   subnet_id         = module.subnet_b.subnet_id
210
211   attachment {
212     instance     = aws_instance.sut1.id
213     device_index = 1
214   }
215
216   tags = {
217     "Name"        = local.sut1_name
218     "Environment" = local.environment
219   }
220 }
221
222 resource "aws_network_interface" "sut1_if2" {
223   depends_on = [
224     module.subnet_d,
225     aws_instance.sut1
226   ]
227   private_ip        = var.sut1_if2_private_ip
228   private_ips       = [var.sut1_if2_private_ip]
229   security_groups   = [module.vpc.vpc_security_group_id]
230   source_dest_check = var.sut1_source_dest_check
231   subnet_id         = module.subnet_d.subnet_id
232
233   attachment {
234     instance     = aws_instance.sut1.id
235     device_index = 2
236   }
237
238   tags = {
239     "Name"        = local.sut1_name
240     "Environment" = local.environment
241   }
242 }
243
244 data "aws_network_interface" "sut1_if1" {
245   id = aws_network_interface.sut1_if1.id
246 }
247
248 data "aws_network_interface" "sut1_if2" {
249   id = aws_network_interface.sut1_if2.id
250 }
251
252 resource "null_resource" "deploy_tg" {
253   depends_on = [
254     aws_instance.tg,
255     aws_network_interface.tg_if1,
256     aws_network_interface.tg_if2,
257     aws_instance.sut1,
258     aws_network_interface.sut1_if1,
259     aws_network_interface.sut1_if2
260   ]
261
262   connection {
263     user        = "ubuntu"
264     host        = aws_instance.tg.public_ip
265     private_key = tls_private_key.private_key.private_key_pem
266   }
267
268   provisioner "remote-exec" {
269     inline = var.first_run_commands
270   }
271 }
272
273 resource "null_resource" "deploy_sut1" {
274   depends_on = [
275     aws_instance.tg,
276     aws_network_interface.tg_if1,
277     aws_network_interface.tg_if2,
278     aws_instance.sut1,
279     aws_network_interface.sut1_if1,
280     aws_network_interface.sut1_if2
281   ]
282
283   connection {
284     user        = "ubuntu"
285     host        = aws_instance.sut1.public_ip
286     private_key = tls_private_key.private_key.private_key_pem
287   }
288
289   provisioner "remote-exec" {
290     inline = var.first_run_commands
291   }
292 }
293
294 resource "null_resource" "deploy_topology" {
295   depends_on = [
296     aws_instance.tg,
297     aws_instance.sut1
298   ]
299
300   provisioner "ansible" {
301     plays {
302       playbook {
303         file_path = var.ansible_topology_path
304       }
305       hosts = ["local"]
306       extra_vars = {
307         ansible_python_interpreter = local.ansible_python_executable
308         testbed_name               = local.testbed_name
309         cloud_topology             = local.topology_name
310         tg_if1_mac                 = data.aws_network_interface.tg_if1.mac_address
311         tg_if2_mac                 = data.aws_network_interface.tg_if2.mac_address
312         dut1_if1_mac               = data.aws_network_interface.sut1_if1.mac_address
313         dut1_if2_mac               = data.aws_network_interface.sut1_if2.mac_address
314         tg_public_ip               = aws_instance.tg.public_ip
315         dut1_public_ip             = aws_instance.sut1.public_ip
316         public_ip_list             = "${aws_instance.tg.public_ip},${aws_instance.sut1.public_ip}"
317       }
318     }
319   }
320 }