

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.

# Utilisation d'EC2 Image Builder pour créer des AMI Amazon personnalisées ECS-optimized
<a name="image-builder-tutorial"></a>

AWS vous recommande d'utiliser les ECS-optimized AMI Amazon car elles sont préconfigurées avec les exigences et les recommandations pour exécuter vos charges de travail de conteneur. Il peut arriver que vous deviez personnaliser votre AMI pour ajouter des logiciels supplémentaires. Vous pouvez utiliser EC2 Image Builder pour la création, la gestion et le déploiement de vos images de serveur. Vous restez propriétaire des images personnalisées créées dans votre compte. Vous pouvez utiliser les pipelines EC2 Image Builder pour automatiser les mises à jour et les correctifs système pour vos images, ou utiliser une commande autonome pour créer une image avec les ressources de configuration que vous avez définies.

Vous créez une recette pour votre image. La recette inclut une image parent et tous les composants supplémentaires. Vous créez également un pipeline qui distribue votre AMI personnalisée.

Vous créez une recette pour votre image. Une recette Image Builder est un document qui définit l’image de base et les composants à appliquer à l’image de base pour produire la configuration souhaitée pour l’image AMI en sortie. Vous créez également un pipeline qui distribue votre AMI personnalisée. Pour plus d’informations, consultez la section [Fonctionnement d’EC2 Image Builder](https://docs.aws.amazon.com/imagebuilder/latest/userguide/how-image-builder-works.html) dans le *Guide de l’utilisateur d’EC2 Image Builder*.

Nous vous recommandons d'utiliser l'une des ECS-optimized AMI Amazon suivantes comme « image parent » dans EC2 Image Builder :
+ Linux
  + Amazon ECS-optimized AL2023 x86
  + AMI ECS-optimized Amazon Amazon Linux 2023 (arm64)
  + Amazon ECS-optimized Amazon Linux 2, noyau, 5 (AMI)
  + AMI ECS-optimized Amazon Linux 2 x86
+ Windows
  + Amazon ECS-optimized Windows 2022 complet x86
  + Amazon ECS-optimized Windows 2022 Core x86
  + Amazon ECS-optimized Windows 2019 complet x86
  + Amazon ECS-optimized Windows 2019 Core x86
  + Amazon ECS-optimized Windows 2016 complet x86

Nous vous recommandons également de sélectionner « Utiliser la dernière version disponible du système d’exploitation ». Le pipeline utilisera la gestion des versions sémantique pour l’image parent, ce qui permet de détecter les mises à jour des dépendances dans les tâches planifiées automatiquement. Pour plus d’informations, consultez la section [Gestion des versions sémantique](https://docs.aws.amazon.com/imagebuilder/latest/userguide/ibhow-semantic-versioning.html) dans le *Guide de l’utilisateur EC2 Image Builder*.

AWS met régulièrement à jour les images Amazon ECS-optimized AMI avec des correctifs de sécurité et la nouvelle version de l'agent de conteneur. Lorsque vous utilisez un ID AMI comme image parent dans votre recette d’image, vous devez vérifier régulièrement les mises à jour de l’image parent. S’il y a des mises à jour, vous devez créer une nouvelle version de votre recette avec l’AMI mise à jour. Cela garantit que vos images personnalisées incorporent la dernière version de l’image parent. Pour plus d’informations sur la création d’un flux de travail pour mettre à jour automatiquement vos instances EC2 dans votre cluster Amazon ECS avec les nouvelles AMI, consultez la section [Comment créer un pipeline de renforcement des AMI et automatiser les mises à jour de votre flotte d’instances ECS](https://aws.amazon.com/blogs/security/how-to-create-an-ami-hardening-pipeline-and-automate-updates-to-your-ecs-instance-fleet/).

Vous pouvez également spécifier le Amazon Resource Name (ARN) d’une image parent publiée via un pipeline EC2 Image Builder géré. Amazon publie régulièrement des images Amazon ECS-optimized AMI via des pipelines gérés. Ces images sont publiquement accessibles. Vous devez disposer des autorisations nécessaires pour accéder à l’image. Lorsque vous utilisez un ARN d’image au lieu d’une AMI dans votre recette Image Builder, votre pipeline utilise automatiquement la version la plus récente de l’image parent à chaque exécution. Cette approche élimine le besoin de créer manuellement de nouvelles versions de recettes pour chaque mise à jour. 

## Nettoyez l' ECS-optimized AMI Amazon
<a name="cleanup-ecs-optimized-ami"></a>

Lorsque vous utilisez une ECS-optimized AMI Amazon comme image parent, vous devez nettoyer l'image pour éviter les problèmes transitoires. L' ECS-optimized AMI Amazon est préconfigurée pour que l'agent Amazon ECS démarre et s'enregistre automatiquement en tant qu'instance de conteneur auprès d'Amazon ECS. Son utilisation comme image de base sans nettoyage approprié peut entraîner des problèmes dans votre AMI personnalisée.

Pour nettoyer l’image en vue d’une utilisation future, créez un composant qui exécute les commandes suivantes pour arrêter le package ecs-init et les processus Docker :

```
sudo systemctl stop ecs
sudo systemctl stop docker
```

Supprimez tous les fichiers journaux de l’instance actuelle pour éviter de les conserver lors de l’enregistrement de l’image. Utilisez l’exemple de script de la section [Pratiques exemplaires en matière de sécurité pour EC2 Image Builder](https://docs.aws.amazon.com/imagebuilder/latest/userguide/security-best-practices.html) pour nettoyer les différents fichiers de l’instance.

Pour nettoyer les données spécifiques d’Amazon ECS, exécutez les commandes suivantes :

```
sudo rm -rf /var/log/ecs/*
sudo rm /var/lib/ecs/data/agent.db
```

Pour plus d'informations sur la création d' ECS-optimized AMI Amazon personnalisées, consultez [Comment créer une AMI personnalisée à partir d'une ECS-optimized AMI Amazon ?](https://forums.aws.amazon.com/knowledge-center/ecs-create-custom-amis/) dans le AWS Knowledge Center.

## Utilisation de l’ARN d’image avec l’infrastructure en tant que code (IaC)
<a name="infrastructure-as-code-arn"></a>

Vous pouvez configurer la recette à l'aide de la console EC2 Image Builder, de l'infrastructure sous forme de code (par exemple CloudFormation) ou AWS du SDK. Lorsque vous spécifiez une image parent dans votre recette, vous pouvez spécifier un ID d'AMI EC2, un ARN d'image Image Builder, un identifiant de AWS Marketplace produit ou une image de conteneur. AWS publie publiquement les identifiants AMI et les ARN des images Image Builder des ECS-Optimized AMI Amazon. Le format de l’ARN d’image est le suivant :

```
arn:${Partition}:imagebuilder:${Region}:${Account}:image/${ImageName}/${ImageVersion}
```

L’`ImageVersion` a le format suivant. Remplacez{{major}}, {{minor}} et {{patch}} par les dernières valeurs.

```
<{{major}}>.<{{minor}}>.<{{patch}}>
```

Vous pouvez remplacer `major`, `minor` et `patch` par des valeurs spécifiques ou utiliser l’ARN sans version d’une image, afin que votre pipeline reste à jour avec la dernière version de l’image parent. Un ARN sans version utilise le format générique « x.x.x » pour représenter la version de l’image. Cette approche permet au service Image Builder de résoudre automatiquement la version la plus récente de l’image. L’utilisation d’un ARN sans version garantit que votre référence pointe toujours vers la dernière image disponible, ce qui rationalise le processus de mise à jour des images dans votre déploiement. Lorsque vous créez une recette avec la console, EC2 Image Builder identifie automatiquement l’ARN de votre image parent. Lorsque vous utilisez l’IaC pour créer la recette, vous devez identifier l’ARN et sélectionner la version d’image souhaitée ou utiliser un ARN sans version pour indiquer la dernière image disponible. Nous vous recommandons de créer un script automatique pour filtrer et n’afficher que les images correspondant à vos critères. Le script Python suivant montre comment récupérer une liste d' ECS-optimized AMI Amazon. 

Le script accepte deux arguments facultatifs : `owner` et `platform`, avec les valeurs par défaut « Amazon » et « Windows » respectivement. Les valeurs valides pour l’argument du propriétaire sont : `Self`, `Shared`, `Amazon` et `ThirdParty`. Les valeurs valides pour l’argument de plateforme sont `Windows` et `Linux`. Par exemple, si vous exécutez le script avec les `owner` arguments set to `Amazon` et `platform` set to`Linux`, le script génère une liste d'images publiées par Amazon, y compris les ECS-Optimized images Amazon.

```
import boto3
import argparse

def list_images(owner, platform):
    # Create a Boto3 session
    session = boto3.Session()
    
    # Create an EC2 Image Builder client
    client = session.client('imagebuilder')

    # Define the initial request parameters
    request_params = {
        'owner': owner,
        'filters': [
            {
                'name': 'platform',
                'values': [platform]
            }
        ]
    }

    # Initialize the results list
    all_images = []

    # Get the initial response with the first page of results
    response = client.list_images(**request_params)

    # Extract images from the response
    all_images.extend(response['imageVersionList'])

    # While 'nextToken' is present, continue paginating
    while 'nextToken' in response and response['nextToken']:
        # Update the token for the next request
        request_params['nextToken'] = response['nextToken']

        # Get the next page of results
        response = client.list_images(**request_params)

        # Extract images from the response
        all_images.extend(response['imageVersionList'])

    return all_images

def main():
    # Initialize the parser
    parser = argparse.ArgumentParser(description="List AWS images based on owner and platform")
    
    # Add the parameters/arguments
    parser.add_argument("--owner", default="Amazon", help="The owner of the images. Default is 'Amazon'.")
    parser.add_argument("--platform", default="Windows", help="The platform type of the images. Default is 'Windows'.")

    # Parse the arguments
    args = parser.parse_args()

    # Retrieve all images based on the provided owner and platform
    images = list_images(args.owner, args.platform)

    # Print the details of the images
    for image in images:
        print(f"Name: {image['name']}, Version: {image['version']}, ARN: {image['arn']}")

if __name__ == "__main__":
    main()
```

## Utilisation de l'ARN de l'image avec CloudFormation
<a name="arn-with-cloudformation"></a>

Une recette d’image Image Builder est un plan qui spécifie l’image parent et les composants nécessaires pour obtenir la configuration prévue de l’image de sortie. Vous utilisez la ressource `AWS::ImageBuilder::ImageRecipe`. Définissez la valeur `ParentImage` sur l’ARN d’image. Utilisez l’ARN sans version de l’image souhaitée pour vous assurer que votre pipeline utilise toujours la version la plus récente de l’image. Par exemple, `arn:aws:imagebuilder:us-east-1:aws:image/amazon-linux-2023-ecs-optimized-x86/x.x.x`. La définition de `AWS::ImageBuilder::ImageRecipe` ressource suivante utilise un ARN d’image géré par Amazon :

```
ECSRecipe:
    Type: AWS::ImageBuilder::ImageRecipe
    Properties:
      Name: MyRecipe
      Version: '1.0.0'
      Components:
        - ComponentArn: [<The component arns of the image recipe>]
      ParentImage: "arn:aws:imagebuilder:us-east-1:aws:image/amazon-linux-2023-ecs-optimized-x86/x.x.x"
```

Pour plus d’informations sur la ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagerecipe.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagerecipe.html), consultez le *Guide de l’utilisateur AWS CloudFormation *.

Vous pouvez automatiser la création de nouvelles images dans votre pipeline en définissant la propriété `Schedule` de la ressource `AWS::ImageBuilder::ImagePipeline`. Le calendrier inclut une condition de départ et une expression cron. Pour plus d’informations, consultez [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagepipeline.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagepipeline.html) dans le *Guide de l’utilisateur AWS CloudFormation *.

 Dans l’exemple `AWS::ImageBuilder::ImagePipeline` suivant, le pipeline exécute une construction à 10 h 00, heure universelle coordonnée (UTC) tous les jours. Définissez les valeurs `Schedule` suivantes :
+ Définissez `PipelineExecutionStartCondition` sur `EXPRESSION_MATCH_AND_DEPENDENCY_UPDATES_AVAILABLE`. Le build ne démarre que si des ressources dépendantes telles que l’image parent ou les composants, qui utilisent le caractère générique « x » dans leurs versions sémantiques, sont mises à jour. Cela garantit que la version intègre les dernières mises à jour de ces ressources.
+  ScheduleExpression Défini sur l'expression `(0 10 * * ? *)` cron.

```
ECSPipeline:
    Type: AWS::ImageBuilder::ImagePipeline
    Properties:
      Name: my-pipeline
      ImageRecipeArn: <arn of the recipe you created in previous step>
      InfrastructureConfigurationArn: <ARN of the infrastructure configuration associated with this image pipeline>
      Schedule:
        PipelineExecutionStartCondition: EXPRESSION_MATCH_AND_DEPENDENCY_UPDATES_AVAILABLE
        ScheduleExpression: 'cron(0 10 * * ? *)'
```

## Utilisation de l’ARN d’image avec Terraform
<a name="arn-with-terraform"></a>

L’approche pour spécifier l’image parent et le calendrier de votre pipeline dans Terraform s’aligne sur celle de AWS CloudFormation. Vous utilisez la ressource `aws_imagebuilder_image_recipe`. Définissez la valeur `parent_image` sur l’ARN d’image. Utilisez l’ARN sans version de l’image souhaitée pour vous assurer que votre pipeline utilise toujours la version la plus récente de l’image. Pour plus d’informations, consultez la section [https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/imagebuilder_image_recipe#argument-reference](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/imagebuilder_image_recipe#argument-reference) dans la documentation Terraform. 

Dans le bloc de configuration du calendrier de la `aws_imagebuilder_image_pipeline resource`, définissez la valeur de l’argument `schedule_expression` sur une expression cron de votre choix pour spécifier la fréquence d’exécution du pipeline, puis définissez la valeur de `pipeline_execution_start_condition` sur `EXPRESSION_MATCH_AND_DEPENDENCY_UPDATES_AVAILABLE`. Pour plus d’informations, consultez la section [https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/imagebuilder_image_pipeline#argument-reference](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/imagebuilder_image_pipeline#argument-reference) dans la documentation Terraform. 