keycloak-vm.tf 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. # Define a Keycloak image-id
  2. data "yandex_compute_image" "kc_image" {
  3. name = var.values.keycloak.image_name
  4. folder_id = var.values.keycloak.image_folder_id
  5. }
  6. # Create Service Account (SA) for Keycloak VM
  7. resource "yandex_iam_service_account" "kc_sa" {
  8. name = "${var.values.keycloak.subdomain}-sa"
  9. folder_id = var.values.folder_id
  10. description = "for using on Keycloak's VM"
  11. }
  12. # Grant SA access to download certificates from Certificate Manager (CM)
  13. resource "yandex_resourcemanager_folder_iam_member" "cm_cert_download" {
  14. folder_id = var.values.folder_id
  15. role = "certificate-manager.certificates.downloader"
  16. member = "serviceAccount:${yandex_iam_service_account.kc_sa.id}"
  17. }
  18. # Grant SA access to Keycloak's VM metadata
  19. resource "yandex_resourcemanager_folder_iam_member" "rm_viewer" {
  20. folder_id = var.values.folder_id
  21. role = "resource-manager.viewer"
  22. member = "serviceAccount:${yandex_iam_service_account.kc_sa.id}"
  23. }
  24. resource "yandex_resourcemanager_folder_iam_member" "compute_viewer" {
  25. folder_id = var.values.folder_id
  26. role = "compute.viewer"
  27. member = "serviceAccount:${yandex_iam_service_account.kc_sa.id}"
  28. }
  29. # Generate Keycloak admin password
  30. resource "random_string" "keycloak_admin_password" {
  31. length = 12
  32. upper = true
  33. lower = true
  34. numeric = true
  35. special = true
  36. override_special = "!@%&*()-_=+[]{}<>:?"
  37. }
  38. # Create Keycloak VM
  39. resource "yandex_compute_instance" "kc_vm" {
  40. folder_id = var.values.folder_id
  41. name = var.values.keycloak.subdomain
  42. hostname = var.values.keycloak.subdomain
  43. platform_id = "standard-v3"
  44. zone = "ru-central1-a"
  45. service_account_id = yandex_iam_service_account.kc_sa.id
  46. resources {
  47. cores = 2
  48. memory = 8
  49. }
  50. boot_disk {
  51. initialize_params {
  52. image_id = data.yandex_compute_image.kc_image.id
  53. type = "network-ssd"
  54. size = 80
  55. }
  56. }
  57. network_interface {
  58. subnet_id = yandex_vpc_subnet.kc_subnet.id
  59. nat = true
  60. nat_ip_address = yandex_vpc_address.kc_pub_ip.external_ipv4_address[0].address
  61. security_group_ids = [yandex_vpc_security_group.kc_sg.id]
  62. }
  63. metadata = {
  64. user-data = templatefile("${path.module}/templates/kc-vm-init.tpl", {
  65. ADMIN_NAME = "${var.values.keycloak.vm_username}"
  66. ADMIN_SSH_KEY = "${chomp(var.values.ssh_pub_key)}"
  67. KC_FQDN = "${var.values.keycloak.subdomain}.${var.values.domain}"
  68. KC_PORT = "${var.values.keycloak.port}"
  69. KC_ADM_USER = "${var.values.keycloak.admin_user}"
  70. KC_ADM_PASS = "${random_string.keycloak_admin_password.result}"
  71. PG_DB_HOST = "${var.values.pg_fqdn}"
  72. PG_DB_NAME = "${var.values.postgres.db_kc_name}"
  73. PG_DB_USER = "${var.values.postgres.db_user}"
  74. PG_DB_PASS = "${var.values.pg_pass}"
  75. KC_CERT_NAME = "${var.values.keycloak.le_cert_name}"
  76. KC_CERT_PUB = "le-cert-pub-chain.pem"
  77. KC_CERT_PRIV = "le-cert-priv-key.pem"
  78. KC_CERT_PUB_DATA = "${base64encode(local_file.kc_pub_chain.content)}"
  79. KC_CERT_PRIV_DATA = "${base64encode(local_file.kc_private_key.content)}"
  80. })
  81. }
  82. }