main.tf 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. data "aws_security_group" "typical-host" {
  2. name = "typical-host"
  3. vpc_id = var.vpc_id
  4. }
  5. # Use the default EBS key
  6. data "aws_kms_key" "ebs-key" {
  7. key_id = "alias/ebs_root_encrypt_decrypt"
  8. }
  9. data "aws_subnet" "private_subnet" {
  10. id = var.private_subnets[0]
  11. }
  12. resource "random_password" "password" {
  13. keepers = {
  14. "version": 1 # increment to change the password
  15. # n.b. you could add other stuff to make this change automatically, e.g.
  16. # "instance_type": var.instance_type
  17. # Would then change this password every time the instance type changes.
  18. }
  19. length = 32
  20. special = false
  21. min_lower = 1
  22. min_numeric = 1
  23. min_upper = 1
  24. min_special = 0
  25. #override_special = "~!%^()-_+"
  26. }
  27. resource "aws_network_interface" "management" {
  28. subnet_id = var.private_subnets[0]
  29. security_groups = [ data.aws_security_group.typical-host.id, aws_security_group.inside.id ]
  30. description = var.instance_name
  31. tags = merge(var.standard_tags, var.tags, { Name = var.instance_name })
  32. }
  33. resource "aws_network_interface" "outside" {
  34. subnet_id = var.public_subnets[0]
  35. security_groups = [ data.aws_security_group.typical-host.id, aws_security_group.outside.id ]
  36. description = var.instance_name
  37. tags = merge(var.standard_tags, var.tags, { Name = var.instance_name })
  38. }
  39. resource "aws_network_interface" "inside" {
  40. subnet_id = var.private_subnets[0]
  41. security_groups = [ data.aws_security_group.typical-host.id, aws_security_group.inside.id ]
  42. description = var.instance_name
  43. tags = merge(var.standard_tags, var.tags, { Name = var.instance_name })
  44. }
  45. resource "aws_eip" "outside" {
  46. vpc = true
  47. tags = merge(var.standard_tags, var.tags, { Name = var.instance_name })
  48. }
  49. resource "aws_eip_association" "outside" {
  50. network_interface_id = aws_network_interface.outside.id
  51. allocation_id = aws_eip.outside.id
  52. }
  53. resource "aws_instance" "instance" {
  54. #availability_zone = var.azs[count.index % 2]
  55. tenancy = "default"
  56. ebs_optimized = true
  57. disable_api_termination = var.instance_termination_protection
  58. instance_initiated_shutdown_behavior = "stop"
  59. instance_type = var.instance_type
  60. key_name = "msoc-build"
  61. monitoring = false
  62. iam_instance_profile = "msoc-default-instance-profile"
  63. ami = "ami-04fe5af2dfd9c9d5e" # not quite sure how to determine other than to launch one
  64. # Owner:
  65. # AMI Alias: /aws/service/marketplace/prod-bm2yu6zogql5s/9.15.1.15
  66. # Product Code: 80uds1joqwlz35hw1lx5h1bcc
  67. # Release Notes: https://www.cisco.com/c/en/us/support/security/asa-firepower-services/products-release-notes-list.html
  68. #
  69. # We need to ignore ebs_block_device changes, because if the AMI changes, so does the snapshot_id.
  70. # If they add a feature to block more specific changes (eg `ebs_block_devices[*].snapshot_id`), then
  71. # that could be removed.
  72. lifecycle { ignore_changes = [ ami, key_name, user_data, ebs_block_device ] }
  73. network_interface {
  74. network_interface_id = aws_network_interface.management.id
  75. device_index = 0
  76. }
  77. network_interface {
  78. network_interface_id = aws_network_interface.outside.id
  79. device_index = 1
  80. }
  81. network_interface {
  82. network_interface_id = aws_network_interface.inside.id
  83. device_index = 2
  84. }
  85. user_data = templatefile("${path.module}/files/userdata.tpl",
  86. {
  87. "hostname" = var.instance_name,
  88. "VPNPoolFrom1" = "172.16.32.15",
  89. "VPNPoolTo1" = "172.16.32.200",
  90. "VPNPoolMask1" = "255.255.255.0",
  91. "VPNUser" = "admin",
  92. "VPNPassword" = random_password.password.result,
  93. "dns1" = var.dns_servers[0],
  94. "dns2" = var.dns_servers[1],
  95. "PrivateSubnet1CIDR" = data.aws_subnet.private_subnet.cidr_block
  96. "PrivateSubnet1GW" = cidrhost(data.aws_subnet.private_subnet.cidr_block,1),
  97. "PrivateSubnet1Pool" = cidrhost(data.aws_subnet.private_subnet.cidr_block,0),
  98. "PrivateSubnet1Mask" = cidrnetmask(data.aws_subnet.private_subnet.cidr_block)
  99. #"PrivateSubnet1CIDR" = var.private_cidr[0],
  100. #"PrivateSubnet1GW" = cidrhost(var.private_cidr[0], 1),
  101. #"PrivateSubnet1Pool" = cidrhost(var.private_cidr[0], 0),
  102. #"PrivateSubnet1Mask" = cidrnetmask(var.private_cidr[0])
  103. }
  104. )
  105. tags = merge( var.standard_tags, var.tags, var.instance_tags, { Name = var.instance_name })
  106. volume_tags = merge( var.standard_tags, var.tags, { Name = var.instance_name })
  107. }
  108. module "private_dns_record" {
  109. source = "../../submodules/dns/private_A_record"
  110. name = var.instance_name
  111. ip_addresses = [ aws_network_interface.management.private_ip ]
  112. dns_info = var.dns_info
  113. reverse_enabled = true
  114. providers = {
  115. aws.c2 = aws.c2
  116. }
  117. }
  118. module "public_dns_record" {
  119. source = "../../submodules/dns/public_A_record"
  120. name = var.instance_name
  121. ip_addresses = [ aws_eip.outside.public_ip ]
  122. dns_info = var.dns_info
  123. providers = {
  124. aws.mdr-common-services-commercial = aws.mdr-common-services-commercial
  125. }
  126. }