Azure Terraform, создание пользователя mysql

Вопрос или проблема

Я создал гибкую базу данных MySQL на Azure с использованием Terraform, используя следующий скрипт

resource "azurerm_mysql_flexible_server" "mysql" {
  name                   = var.db-name
  resource_group_name    = azurerm_resource_group.rg.name
  location               = azurerm_resource_group.rg.location
  administrator_login    = var.db-root-username
  administrator_password = var.db-root-password
  sku_name               = var.db-sku
  version                = "8.0.21"
  
  storage {
    size_gb = var.db-storage
  }
}

Я хочу создать еще одного пользователя, отличного от пользователя root, с ограниченными привилегиями. Я пробовал много методов, но всегда возникает ошибка

Первый метод, который я использовал, выглядит следующим образом:

# Создание конфигурации администратора MySQL для разрешения скриптов создания пользователей
resource "azurerm_mysql_flexible_server_configuration" "require_secure_transport" {
  name                = "require_secure_transport"
  resource_group_name = azurerm_resource_group.rg.name
  server_name         = azurerm_mysql_flexible_server.mysql.name
  value               = "OFF"
}

    resource "null_resource" "mysql_user" {
      triggers = {
        server_id = azurerm_mysql_flexible_server.mysql.id
      }
    
      provisioner "local-exec" {
        command = <<-EOT
          az mysql flexible-server execute \
            --name ${azurerm_mysql_flexible_server.mysql.name} \
            --resource-group ${azurerm_resource_group.rg.name} \
            --admin-user ${var.db-root-username} \
            --admin-password '${var.db-root-password}' \
            --database-name ${var.db-schema-name} \
            --querytext "CREATE USER IF NOT EXISTS '${var.db-root-username}'@'%%' IDENTIFIED BY '${var.db-user-password}'; 
            GRANT ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, REFERENCES, 
            SHOW VIEW, TRIGGER, UPDATE, SELECT 
            ON ${var.db-schema-name}.* TO '${var.db-root-username}'@'%%';"
        EOT
      }
    
      depends_on = [
        azurerm_mysql_flexible_server.mysql
      ]
    }

Другой скрипт, который я использовал, выглядит так:

resource "null_resource" "mysql_user" {
  triggers = {
    server_id = azurerm_mysql_flexible_server.mysql.id
  }

  provisioner "local-exec" {
    command = <<-EOT
      mysql -h ${azurerm_mysql_flexible_server.mysql.fqdn} \
            -u ${var.db-root-username} \
            -p ${var.db-root-password} \
            -e "CREATE USER IF NOT EXISTS '${var.db-user-username}'@'%' IDENTIFIED BY '${var.vsauser_password}'; \
                GRANT SELECT, INSERT, UPDATE, DELETE ON ${var.db-schema-name}.* TO '${var.db-user-username}'@'%';"
    EOT
  }

  depends_on = [
    azurerm_mysql_flexible_server.mysql,
    azurerm_mysql_flexible_server_configuration.require_secure_transport
  ]
}

Ничего не работает.

Есть какие-либо предложения, пожалуйста?

Ответ или решение

Вопрос: Как создать пользователя MySQL с ограниченными привилегиями в Azure с помощью Terraform?

Ваша задача корректно создать пользователя MySQL и назначить ему определенные привилегии, используя Terraform и Azure. Хочу обратить ваше внимание на несколько важных аспектов, которые могли бы помочь вам преодолеть возникшие проблемы с созданием пользователя и назначением привилегий.

1. Правильный синтаксис и логика

Ваши скрипты содержат сложности, которые требуют оптимизации. Давайте рассмотрим каждый из ваших подходов и предложим решение.

Метод 1: Использование az mysql flexible-server execute

Вы указали, что использовали команду az mysql flexible-server execute, однако не привели явных ошибок. Для создания пользователя и назначения привилегий шаги должны быть разбиты на два отдельных запроса, так как они не должны выполняться в одном запросе.

resource "null_resource" "mysql_user" {
  triggers = {
    server_id = azurerm_mysql_flexible_server.mysql.id
  }

  provisioner "local-exec" {
    command = <<-EOT
      az mysql flexible-server execute \
        --name ${azurerm_mysql_flexible_server.mysql.name} \
        --resource-group ${azurerm_resource_group.rg.name} \
        --admin-user ${var.db-root-username} \
        --admin-password '${var.db-root-password}' \
        --database-name ${var.db-schema-name} \
        --querytext "CREATE USER IF NOT EXISTS '${var.db-user-username}'@'%' IDENTIFIED BY '${var.db-user-password}';"
    EOT
  }

  depends_on = [
    azurerm_mysql_flexible_server.mysql
  ]
}

resource "null_resource" "mysql_user_grant" {
  triggers = {
    server_id = azurerm_mysql_flexible_server.mysql.id
    user_created = null_resource.mysql_user.id
  }

  provisioner "local-exec" {
    command = <<-EOT
      az mysql flexible-server execute \
        --name ${azurerm_mysql_flexible_server.mysql.name} \
        --resource-group ${azurerm_resource_group.rg.name} \
        --admin-user ${var.db-root-username} \
        --admin-password '${var.db-root-password}' \
        --database-name ${var.db-schema-name} \
        --querytext "GRANT SELECT, INSERT, UPDATE, DELETE ON ${var.db-schema-name}.* TO '${var.db-user-username}'@'%';"
    EOT
  }

  depends_on = [
    null_resource.mysql_user
  ]
}

2. Проверка настроек безопасности

Также проверьте, разрешают ли ваши настройки MySQL выполнение удаленных запросов. Установите параметр require_secure_transport в OFF, как вы делали, но убедитесь, что он применяется корректно и без конфликтов.

3. Локальные зависимости и порядок выполнения

Ограничьте зависимости так, чтобы создание пользователя и предоставление привилегий выполнялись последовательно. В первом методе это уже было частично реализовано через зависимости.

4. Диагностика ошибок

Если ваши команды не работают, обратите внимание на сообщения об ошибках, которые вы получаете при выполнении. Попробуйте вручную выполнить ваши команды в консоли Azure для диагностики.

5. Убедитесь в правильности переменных

Проверьте, правильно ли указаны все переменные, такие как ${var.db-root-username}, ${var.db-schema-name} и ${var.db-user-username}. Ошибки в переменных могут привести к сбоям при выполнении скриптов.

Заключение

Следуя приведённым советам и корректировкам, вы должны успешно создать нового пользователя MySQL на Azure с нужными привилегиями через Terraform. Если у вас все еще возникают проблемы, предоставьте детали ошибок и дополнительные конфигурации, чтобы можно было предложить более конкретные рекомендации.

Оцените материал
Добавить комментарий

Капча загружается...