Autenticación de Terraform en Azure

Terraform habilita la definición, vista previa e implementación de la infraestructura en la nube. Con Terraform, se crean archivos de configuración mediante la sintaxis de HCL. La sintaxis de HCL permite especificar el proveedor de la nube, como Azure, y los elementos que componen la infraestructura de la nube. Después de crear los archivos de configuración, se crea un plan de ejecución que permite obtener una vista previa de los cambios de infraestructura antes de implementarlos. Una vez que compruebe los cambios, aplique el plan de ejecución para implementar la infraestructura.

Para usar comandos de Terraform en su suscripción de Azure, primero debe autenticar Terraform en esa suscripción. En este artículo se tratan algunos escenarios comunes para la autenticación en Azure.

En este artículo aprenderá a:

  • Comprender los escenarios comunes de autenticación de Terraform y Azure.
  • Autenticarse mediante una cuenta Microsoft desde Cloud Shell (con Bash o PowerShell).
  • Autenticarse mediante una cuenta Microsoft desde Windows (con Bash o PowerShell).
  • Crear una entidad de servicio con la CLI de Azure.
  • Creación de una entidad de servicio mediante Azure PowerShell
  • Especificar las credenciales de la entidad de servicio en las variables de entorno.
  • Especificar las credenciales de la entidad de servicio en un bloque de proveedor de Terraform.

1. Configurar su entorno

  • Suscripción de Azure: si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

2. Autenticación de Terraform en Azure

Escenarios de autenticación de Terraform y Azure

Terraform solo admite la autenticación en Azure a través de la CLI de Azure. No se admite la autenticación con Azure PowerShell. Por lo tanto, aunque puede usar el módulo de Azure PowerShell al realizar el trabajo de Terraform, primero debe autenticarse en Azure mediante la CLI de Azure.

En este artículo se explica cómo autenticar Terraform en Azure en los escenarios siguientes. Para más información sobre las opciones de autenticación de Terraform en Azure, consulte Autenticación mediante la CLI de Azure.

Autenticación en Azure mediante una cuenta Microsoft

Una cuenta Microsoft es un nombre de usuario (asociado a un correo electrónico y sus credenciales) que se usa para iniciar sesión en servicios de Microsoft, como Azure. Se puede asociar a una o varias suscripciones de Azure, una de las cuales es la predeterminada.

Los pasos siguientes muestran cómo:

  • Iniciar sesión en Azure de forma interactiva usando una cuenta de Microsoft
  • Enumerar las suscripciones de Azure asociadas a la cuenta (incluido el valor predeterminado)
  • Establezca la suscripción actual.
  1. Abra una línea de comandos que tenga acceso a la CLI de Azure.

  2. Ejecute az login sin parámetros y siga las instrucciones para iniciar sesión en Azure.

    az login
    

    Puntos clave:

    • Tras iniciar sesión correctamente, az login muestra una lista de las suscripciones de Azure asociadas a la cuenta Microsoft con la que ha iniciado sesión (se incluye la predeterminada).
  3. Para ver la suscripción actual de Azure, ejecute az account show.

    az account show
    
  4. Para ver todos los nombres de suscripción e identificadores de Azure de una cuenta Microsoft específica, ejecute az account list.

    az account list --query "[?user.name=='<microsoft_account_email>'].{Name:name, ID:id, Default:isDefault}" --output Table
    

    Puntos clave:

    • Reemplace el marcador de posición <microsoft_account_email> por la dirección de correo electrónico de la cuenta Microsoft cuyas suscripciones de Azure quiere mostrar.
    • Con una cuenta Live, como Hotmail o Outlook, puede que deba especificar la dirección de correo electrónico completa. Por ejemplo, si la dirección de correo electrónico es admin@hotmail.com, es posible que tenga que reemplazar el marcador de posición por live.com#admin@hotmail.com.
  5. Para usar una suscripción de Azure específica, ejecute az account set.

    az account set --subscription "<subscription_id_or_subscription_name>"
    

    Puntos clave:

    • Reemplace el marcador de posición <subscription_id_or_subscription_name> por el identificador o el nombre de la suscripción que quiere usar.
    • Una llamada a az account set no muestra los resultados del cambio a la suscripción de Azure especificada. Sin embargo, puede usar az account show para confirmar que la suscripción actual de Azure ha cambiado.
    • Si ejecuta el comando az account list del paso anterior, verá que la suscripción predeterminada de Azure ha cambiado a la suscripción que especificó con az account set.

Creación de una entidad de servicio

las herramientas automatizadas que usan los servicios de Azure, como Terraform, deberán tener siempre permisos restringidos. En lugar de que las aplicaciones inicien sesión como un usuario con todos los privilegios, Azure ofrece entidades de servicio.

El patrón más común es iniciar sesión de forma interactiva en Azure, crear una entidad de servicio, probarla y, luego, usarla en futuras autenticaciones (ya sea de forma interactiva o con los scripts).

  1. Para crear una entidad de servicio, inicie sesión en Azure. Después de autenticarse en Azure mediante una cuenta Microsoft, vuelva aquí.

  2. Si va a crear una entidad de servicio desde Git Bash, establezca la variable de entorno MSYS_NO_PATHCONV. (Este paso no es necesario si usa Cloud Shell).

    export MSYS_NO_PATHCONV=1    
    

    Puntos clave:

    • Puede establecer la variable de entorno MSYS_NO_PATHCONV globalmente (para todas las sesiones de terminal) o localmente (solo para la sesión actual). Como la creación de una entidad de servicio no es algo que se haga con frecuencia, en el ejemplo se establece el valor de la sesión actual. Para establecer esta variable de entorno globalmente, agregue la configuración al archivo ~/.bashrc.
  3. Para crear una entidad de servicio, ejecute az ad sp create-for-rbac.

    az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
    

    Puntos clave:

    • Puede reemplazar <service-principal-name> por un nombre personalizado para su entorno u omitir el parámetro por completo. Si omite el parámetro, el nombre de la entidad de seguridad de servicio se genera en función de la fecha y hora actuales.
    • Una vez finalizado correctamente, az ad sp create-for-rbac muestra varios valores. En el paso siguiente se usan los valores appId, password y tenant.
    • La contraseña no se puede recuperar si se pierde. Por lo tanto, debe almacenarla en un lugar seguro. Si olvida la contraseña, puede restablecer las credenciales de la entidad de servicio.
    • En este artículo, se usa una entidad de servicio con el rol Colaborador. Para más información sobre el control de acceso basado en rol (RBAC), consulte RBAC: roles integrados.
    • La salida de la creación de la entidad de servicio incluye credenciales confidenciales. Asegúrese de no incluirlas en el código ni en el control de código fuente.
    • Para más información sobre las opciones al crear una entidad de servicio con la CLI de Azure, consulte el artículo Creación de una entidad de servicio de Azure con la CLI de Azure.

Especificar las credenciales de la entidad de servicio en las variables de entorno.

Después de crear una entidad de servicio, puede especificar sus credenciales en Terraform mediante variables de entorno.

  1. Modifique el archivo ~/.bashrc agregando las siguientes variables de entorno.

    export ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
    export ARM_TENANT_ID="<azure_subscription_tenant_id>"
    export ARM_CLIENT_ID="<service_principal_appid>"
    export ARM_CLIENT_SECRET="<service_principal_password>"
    
  2. Para ejecutar el script ~/.bashrc, ejecute source ~/.bashrc (o su equivalente abreviado, . ~/.bashrc). También puede salir y volver a abrir Cloud Shell para que el script se ejecute automáticamente.

    . ~/.bashrc
    
  3. Una vez establecidas las variables de entorno, puede comprobar sus valores de la siguiente manera:

    printenv | grep ^ARM*
    

Puntos clave:

  • Al igual que con cualquier variable de entorno, para acceder a un valor de suscripción de Azure desde un script de Terraform, use la sintaxis siguiente: ${env.<environment_variable>}. Por ejemplo, para acceder al valor ARM_SUBSCRIPTION_ID, especifique ${env.ARM_SUBSCRIPTION_ID}.
  • Al crear y aplicar planes de ejecución de Terraform se realizan cambios en la suscripción de Azure asociada a la entidad de servicio. A veces, este hecho puede resultar confuso si ha iniciado sesión en una suscripción de Azure y las variables de entorno apuntan a una segunda suscripción de Azure. Echemos un vistazo al ejemplo siguiente para explicarlo. Supongamos que tiene dos suscripciones de Azure: SubA y SubB. Si la suscripción actual de Azure es SubA (determinada a través de az account show) mientras que las variables de entorno apuntan a SubB, los cambios realizados por Terraform se encuentran en SubB. Por lo tanto, tendría que iniciar sesión en su suscripción SubB para ejecutar los comandos de la CLI de Azure o de Azure PowerShell y ver los cambios.

Especificar las credenciales de la entidad de servicio en un bloque de proveedor de Terraform.

El bloque de proveedor de Azure define la sintaxis que permite especificar la información de autenticación de la suscripción de Azure.

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>2.0"
    }
  }
}

provider "azurerm" {
  features {}

  subscription_id   = "<azure_subscription_id>"
  tenant_id         = "<azure_subscription_tenant_id>"
  client_id         = "<service_principal_appid>"
  client_secret     = "<service_principal_password>"
}

# Your code goes here

Precaución

La posibilidad de especificar las credenciales de suscripción de Azure en un archivo de configuración de Terraform puede resultar práctica, especialmente durante las pruebas. Sin embargo, no es aconsejable almacenar las credenciales en un archivo de texto no cifrado que puedan ver usuarios que no son de confianza.

3. Comprobación de los resultados

Muestre la suscripción actual para comprobar que se ha autenticado en la suscripción de Azure.

Para confirmar la suscripción actual de Azure mediante la CLI de Azure, ejecute az account show.

az account show

Pasos siguientes