

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Création d'une AMI personnalisée avec Terraform
<a name="tutorial-create-ami-terraform"></a>

Lors de l'utilisation AWS ParallelCluster, vous ne payez que pour les AWS ressources créées lorsque vous créez ou mettez à jour AWS ParallelCluster des images et des clusters. Pour de plus amples informations, veuillez consulter [AWS services utilisés par AWS ParallelCluster](aws-services-v3.md).

**Conditions préalables**
+  Terraform v1.5.7\$1 est installé. 
+ [AWS ParallelCluster API](api-reference-v3.md)La version 3.8.0\$1 est déployée sur votre compte. Consultez [Création d'un cluster avec Terraform](tutorial-create-cluster-terraform.md). 
+ Rôle IAM autorisé à invoquer l' ParallelCluster API. Consultez [Autorisations requises](tutorial-create-ami-terraform-permissions.md).

# Définir un projet Terraform
<a name="tutorial-create-ami-terraform-define"></a>

Dans ce didacticiel, vous allez définir un projet Terraform simple pour déployer une ParallelCluster AMI personnalisée.

1. Créez un répertoire appelé`my-amis`. 

   Tous les fichiers que vous créez se trouveront dans ce répertoire.

1. Créez le fichier `terraform.tf` pour importer le ParallelCluster fournisseur.

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

1. Créez le fichier `providers.tf` pour configurer les AWS fournisseurs ParallelCluster et.

   ```
   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. Créez le fichier `main.tf` pour définir les ressources à l'aide du ParallelCluster module.

   Pour consulter les propriétés de l'image que vous pouvez définir au sein de l'`image_configuration`élément, voir[Créez des fichiers de configuration d'image](image-builder-configuration-file-v3.md).

   Pour consulter les options que vous pouvez définir pour la création d'images, par exemple`rollback_on_failure`, `image_id` et voir[`pcluster build-image`](pcluster.build-image-v3.md). 

   ```
   data "aws-parallelcluster_list_official_images" "parent_image" {
     region = var.region
     os = var.os
     architecture = var.architecture
   }
   
   resource "aws-parallelcluster_image" "demo01" {
     image_id            = "demo01"
     image_configuration = yamlencode({
       "Build":{
         "InstanceType": "c5.2xlarge",
         "ParentImage": data.aws-parallelcluster_list_official_images.parent_image.official_images[0].amiId,
         "UpdateOsPackages": {"Enabled": false}
       }
     })
     rollback_on_failure = false
   }
   ```

1. Créez le fichier `variables.tf` pour définir les variables qui peuvent être injectées pour ce projet.

   ```
   variable "region" {
     description = "The region the ParallelCluster API is deployed in."
     type        = string
     default     = "us-east-1"
   }
   
   variable "profile" {
     type        = string
     description = "The AWS profile used to deploy the clusters."
     default     = null
   }
   
   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."
   }
   
   variable "os" {
     type        = string
     description = "The OS of the ParallelCluster image."
   }
   
   variable "architecture" {
     type        = string
     description = "The architecture of the ParallelCluster image."
   }
   ```

1. Créez le fichier `terraform.tfvars` pour définir vos valeurs arbitraires pour les variables. 

   Dans le fichier ci-dessous, déployez l'AMI personnalisée `us-east-1` basée sur l'architecture Amazon Linux 2 pour x86\$164, en utilisant l' ParallelCluster API 3.11.1 existante qui est déjà déployée avec le nom de la pile. `us-east-1` `MyParallelClusterAPI-3111`

   ```
   region = "us-east-1"
   api_stack_name = "MyParallelClusterAPI-3111"
   api_version = "3.11.1"
   
   os = "alinux2"
   architecture = "x86_64"
   ```

1. Créez le fichier `outputs.tf` pour définir les sorties renvoyées par ce projet.

   ```
   output "parent_image" {
     value = data.aws-parallelcluster_list_official_images.parent_image.official_images[0]
   }
   
   output "custom_image" {
     value = aws-parallelcluster_image.demo01
   }
   ```

   Le répertoire du projet est le suivant :

   ```
   my-amis
   ├── 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.
   ```

# Déployer l'AMI
<a name="tutorial-create-ami-terraform-deploy"></a>

Pour déployer l'AMI, exécutez les commandes Terraform standard dans l'ordre.

1. Générez le projet :

   ```
   terraform init
   ```

1. Définissez le plan de déploiement :

   ```
   terraform plan -out tfplan
   ```

1. Déployez le plan :

   ```
   terraform apply tfplan
   ```

# Autorisations requises
<a name="tutorial-create-ami-terraform-permissions"></a>

Vous avez besoin des autorisations suivantes pour déployer une AMI personnalisée avec Terraform :
+ assumer le rôle d' ParallelCluster API, qui est chargé d'interagir avec l' ParallelCluster API
+ décrire la CloudFormation pile de l' ParallelCluster API, pour vérifier son existence et récupérer ses paramètres et ses sorties

------
#### [ 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"
        }
    ]
}
```

------