

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Creación de un clúster con Terraform
<a name="tutorial-create-cluster-terraform"></a>

Al usarlo AWS ParallelCluster, solo paga por los AWS recursos que se crean al crear o actualizar AWS ParallelCluster imágenes y clústeres. Para obtener más información, consulte [AWS servicios utilizados por AWS ParallelCluster](aws-services-v3.md).

**Requisitos previos**
+ Está instalado Terraform v1.5.7\$1. 
+ [AWS ParallelCluster API](api-reference-v3.md) v3.8.0\$1 está implementada en su cuenta. Consulte [Implemente ParallelCluster la API con Terraform](tutorial-deploy-terraform.md). 
+ Función de IAM con los permisos para invocar la ParallelCluster API. Consulte [Permisos necesarios]

# Definición de un proyecto de Terraform
<a name="tutorial-create-cluster-terraform-define"></a>

En este tutorial, definirá un proyecto sencillo de Terraform para implementar un clúster.

1. Cree un directorio denominado `my-clusters`. 

   Todos los archivos que cree estarán dentro de este directorio.

1. Cree el archivo `terraform.tf` para importar el ParallelCluster proveedor.

   ```
   terraform {
     required_version = ">= 1.5.7"
     required_providers {
       aws-parallelcluster = {
         source  = "aws-tf/aws-parallelcluster"
         version = "~> 1.0"
       }
     }
   }
   ```

1. Cree el archivo `providers.tf` para configurar los AWS proveedores ParallelCluster y.

   ```
   provider "aws" {
     region  = var.region
     profile = var.profile
   }
   
   provider "aws-parallelcluster" {
     region         = var.region
     profile        = var.profile
     api_stack_name = var.api_stack_name
     use_user_role  = true
   }
   ```

1. Cree el archivo `main.tf` para definir los recursos mediante el ParallelCluster módulo.

   ```
   module "pcluster" {
     source  = "aws-tf/parallelcluster/aws"
     version = "1.1.0"
   
     region                = var.region
     api_stack_name        = var.api_stack_name
     api_version           = var.api_version
     deploy_pcluster_api   = false
   
     template_vars         = local.config_vars
     cluster_configs       = local.cluster_configs
     config_path           = "config/clusters.yaml"
   }
   ```

1. Cree el archivo `clusters.tf` para definir varios clústeres como variables locales de Terraform. 
**nota**  
Puede definir varios clústeres dentro del elemento `cluster_config`. Para cada clúster, puede definir explícitamente las propiedades del clúster dentro de las variables locales (consulte `DemoCluster01`) o hacer referencia a un archivo externo (consulte `DemoCluster02`).

   Para revisar las propiedades del clúster que puede establecer en el elemento de configuración, consulte [Configuración del clúster](cluster-configuration-file-v3.md).

   Para revisar las opciones que puede configurar para la creación de clústeres, consulte [`pcluster create-cluster`](pcluster.create-cluster-v3.md).

   ```
   locals {
     cluster_configs = {
       DemoCluster01 : {
         region : local.config_vars.region
         rollbackOnFailure : false
         validationFailureLevel : "WARNING"
         suppressValidators : [
           "type:KeyPairValidator"
         ]
         configuration : {
           Region : local.config_vars.region
           Image : {
             Os : "alinux2"
           }
           HeadNode : {
             InstanceType : "t3.small"
             Networking : {
               SubnetId : local.config_vars.subnet
             }
             Iam : {
               AdditionalIamPolicies : [
                 { Policy : "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore" }
               ]
             }
           }
           Scheduling : {
             Scheduler : "slurm"
             SlurmQueues : [{
               Name : "queue1"
               CapacityType : "ONDEMAND"
               Networking : {
                 SubnetIds : [local.config_vars.subnet]
               }
               Iam : {
                 AdditionalIamPolicies : [
                   { Policy : "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore" }
                 ]
               }
               ComputeResources : [{
                 Name : "compute"
                 InstanceType : "t3.small"
                 MinCount : "1"
                 MaxCount : "4"
               }]
             }]
             SlurmSettings : {
               QueueUpdateStrategy : "TERMINATE"
             }
           }
         }
       }
       DemoCluster02 : {
         configuration : "config/cluster_config.yaml"
       }
     }
   }
   ```

1. Cree el archivo `config/clusters.yaml` para definir varios clústeres como configuración de YAML.

   ```
   DemoCluster03:
     region: ${region}
     rollbackOnFailure: true
     validationFailureLevel: WARNING
     suppressValidators:
       - type:KeyPairValidator
     configuration: config/cluster_config.yaml
   DemoCluster04:
     region: ${region}
     rollbackOnFailure: false
     configuration: config/cluster_config.yaml
   ```

1. Cree el archivo`config/cluster_config.yaml`, que es un archivo de ParallelCluster configuración estándar en el que se pueden insertar variables de Terraform.

   Para revisar las propiedades del clúster que puede establecer en el elemento de configuración, consulte [Configuración del clúster](cluster-configuration-file-v3.md).

   ```
   Region: ${region}
   Image:
    Os: alinux2
   HeadNode:
    InstanceType: t3.small
    Networking:
      SubnetId: ${subnet}
    Iam:
      AdditionalIamPolicies:
        - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
   Scheduling:
    Scheduler: slurm
    SlurmQueues:
      - Name: queue1
        CapacityType: ONDEMAND
        Networking:
          SubnetIds:
            - ${subnet}
        Iam:
          AdditionalIamPolicies:
            - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
        ComputeResources:
          - Name: compute
            InstanceType: t3.small
            MinCount: 1
            MaxCount: 5
    SlurmSettings:
      QueueUpdateStrategy: TERMINATE
   ```

1. Cree el archivo `clusters_vars.tf` para definir las variables que se pueden inyectar en las configuraciones del clúster.

   Este archivo le permite definir valores dinámicos que se pueden usar en las configuraciones de clúster, como la región y la subred.

   En este ejemplo, los valores se recuperan directamente de las variables del proyecto, pero es posible que necesite utilizar una lógica personalizada para determinarlos.

   ```
   locals {
     config_vars = {
       subnet = var.subnet_id
       region = var.cluster_region
     }
   }
   ```

1. Cree el archivo `variables.tf` para definir las variables que se pueden inyectar en este proyecto.

   ```
   variable "region" {
     description = "The region the ParallelCluster API is deployed in."
     type        = string
     default     = "us-east-1"
   }
   
   variable "cluster_region" {
     description = "The region the clusters will be deployed in."
     type        = string
     default     = "us-east-1"
   }
   
   variable "profile" {
     type        = string
     description = "The AWS profile used to deploy the clusters."
     default     = null
   }
   
   variable "subnet_id" {
     type        = string
     description = "The id of the subnet to be used for the ParallelCluster instances."
   }
   
   variable "api_stack_name" {
     type        = string
     description = "The name of the CloudFormation stack used to deploy the ParallelCluster API."
     default     = "ParallelCluster"
   }
   
   variable "api_version" {
     type        = string
     description = "The version of the ParallelCluster API."
   }
   ```

1. Cree el archivo `terraform.tfvars` para establecer valores arbitrarios para las variables. 

   El siguiente archivo despliega los clústeres `eu-west-1` dentro de la subred`subnet-123456789`, utilizando la ParallelCluster API 3.11.1 existente, que ya está implementada con el nombre de la pila. `us-east-1` `MyParallelClusterAPI-3111`

   ```
   region = "us-east-1"
   api_stack_name = "MyParallelClusterAPI-3111"
   api_version = "3.11.1"
   
   cluster_region = "eu-west-1"
   subnet_id = "subnet-123456789"
   ```

1. Cree el archivo `outputs.tf` para definir los resultados devueltos por este proyecto.

   ```
   output "clusters" {
     value = module.pcluster.clusters
   }
   ```

   El directorio del proyecto es el siguiente:

   ```
   my-clusters
   ├── config
   │   ├── cluster_config.yaml - Cluster configuration, where terraform variables can be injected..
   │   └── clusters.yaml - File listing all the clusters to deploy.
   ├── clusters.tf - Clusters defined as Terraform local variables.
   ├── clusters_vars.tf - Variables that can be injected into cluster configurations.
   ├── main.tf - Terraform entrypoint where the ParallelCluster module is configured.
   ├── outputs.tf - Defines the cluster as a Terraform output.
   ├── providers.tf - Configures the providers: ParallelCluster and AWS.
   ├── terraform.tf - Import the ParallelCluster provider.
   ├── terraform.tfvars - Defines values for variables, e.g. region, PCAPI stack name.
   └── variables.tf - Defines the variables, e.g. region, PCAPI stack name.
   ```

# Implementación del clúster
<a name="tutorial-create-cluster-terraform-deploy"></a>

Para implementar el clúster, ejecute los comandos estándar de Terraform en orden.

**nota**  
En este ejemplo, se supone que ya has implementado la ParallelCluster API en tu cuenta.

1. Compile el proyecto:

   ```
   terraform init
   ```

1. Defina el plan de implementación:

   ```
   terraform plan -out tfplan
   ```

1. Implemente el plan:

   ```
   terraform apply tfplan
   ```

## Implementa la ParallelCluster API con clústeres
<a name="tutorial-create-cluster-terraform-deploy-api"></a>

Si no has implementado la ParallelCluster API y quieres implementarla con los clústeres, cambia los siguientes archivos:
+ `main.tf`

  ```
  module "pcluster" {
    source  = "aws-tf/aws/parallelcluster"
    version = "1.0.0"
  
    region                = var.region
    api_stack_name        = var.api_stack_name
    api_version           = var.api_version
    deploy_pcluster_api   = true
    parameters = {
      EnableIamAdminAccess = "true"
    }
    
    template_vars         = local.config_vars
    cluster_configs       = local.cluster_configs
    config_path           = "config/clusters.yaml"
  }
  ```
+ `providers.tf`

  ```
  provider "aws-parallelcluster" {
    region   = var.region
    profile  = var.profile
    endpoint = module.pcluster.pcluster_api_stack_outputs.ParallelClusterApiInvokeUrl
    role_arn = module.pcluster.pcluster_api_stack_outputs.ParallelClusterApiUserRole
  }
  ```

# Permisos necesarios
<a name="tutorial-create-cluster-terraform-permissions"></a>

Necesita los siguientes permisos para implementar un clúster con Terraform:
+ asuma la función de ParallelCluster API, que se encarga de interactuar con la ParallelCluster API
+ describa la CloudFormation pila de la ParallelCluster API para verificar su existencia y recuperar sus parámetros y resultados

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:sts::111122223333:role/PCAPIUserRole-*",
            "Effect": "Allow",
            "Sid": "AssumePCAPIUserRole"
        },
        {
            "Action": [
                "cloudformation:DescribeStacks"
            ],
            "Resource": "arn:aws:cloudformation:us-east-1:111122223333:stack/*",
            "Effect": "Allow",
            "Sid": "CloudFormation"
        }
    ]
}
```

------