

• Le AWS Systems Manager CloudWatch tableau de bord ne sera plus disponible après le 30 avril 2026. Les clients peuvent continuer à utiliser CloudWatch la console Amazon pour consulter, créer et gérer leurs CloudWatch tableaux de bord Amazon, comme ils le font aujourd'hui. Pour plus d'informations, consultez la [documentation Amazon CloudWatch Dashboard](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Dashboards.html). 

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.

# Mettez à jour un golden AMI à l'aide de l'automatisation AWS Lambda, et Parameter Store
<a name="automation-tutorial-update-patch-golden-ami"></a>

L'exemple suivant utilise le modèle où une organisation gère et applique périodiquement des correctifs sur leurs propres AMIs propriétaires plutôt que de s'appuyer sur des AMIs Amazon Elastic Compute Cloud (Amazon EC2).

La procédure suivante montre comment appliquer automatiquement des correctifs de système d'exploitation à une AMI qui est déjà considérée comme la plus à jour ou à l'AMI *la plus récente*. Dans l'exemple, la valeur par défaut du paramètre `SourceAmiId` est définie par un AWS Systems Manager Parameter Store paramètre appelé`latestAmi`. La valeur de `latestAmi` est mise à jour par une AWS Lambda fonction invoquée à la fin de l'automatisation. Comme résultat de ce processus d’automatisation, le temps et les efforts consacrés à appliquer des correctifs d’AMIs sont minimisés, car les correctifs sont toujours appliqués à l’AMI la plus récente. Parameter Store et Automation sont des outils de AWS Systems Manager.

**Avant de commencer**  
Configurez les rôles d'automatisation et, éventuellement, Amazon EventBridge for Automation. Pour de plus amples informations, veuillez consulter [Configuration d'Automation](automation-setup.md).

**Topics**
+ [Tâche 1 : créer un paramètre dans Systems Manager Parameter Store](#create-parameter-ami)
+ [Tâche 2 : créer un rôle IAM pour AWS Lambda](#create-lambda-role)
+ [Tâche 3 : créer une AWS Lambda fonction](#create-lambda-function)
+ [Tâche 4 : créer un runbook et corriger l'AMI](#create-custom-ami-update-runbook)

## Tâche 1 : créer un paramètre dans Systems Manager Parameter Store
<a name="create-parameter-ami"></a>

Créez un paramètre dans Parameter Store qui utilise les informations suivantes :
+ **Nom** : `latestAmi`.
+ **Valeur** : Un ID d'AMI. Par exemple :` ami-188d6e0e`.

Pour de plus amples informations sur la création d'un paramètre de chaîne Parameter Store, consultez [Création de paramètres Parameter Store dans Systems Manager](sysman-paramstore-su-create.md).

## Tâche 2 : créer un rôle IAM pour AWS Lambda
<a name="create-lambda-role"></a>

Utilisez la procédure suivante pour créer un rôle de service IAM pour AWS Lambda. Ces politiques autorisent Lambda à mettre à jour la valeur du paramètre `latestAmi` à l'aide d'une fonction Lambda et Systems Manager.

**Pour créer un rôle de service IAM pour Lambda**

1. Connectez-vous à la console IAM AWS Management Console et ouvrez-la à [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)l'adresse.

1. Dans le volet de navigation, sélectionnez **Politiques**, puis **Créer une politique**.

1. Sélectionnez l'onglet **JSON**.

1. Remplacez les contenus par défaut par la politique suivante. Remplacez chaque {{example resource placeholder}} par vos propres informations.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "logs:CreateLogGroup",
               "Resource": "arn:aws:logs:{{us-east-1}}:{{111122223333}}:*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "logs:CreateLogStream",
                   "logs:PutLogEvents"
               ],
               "Resource": [
                   "arn:aws:logs:{{us-east-1}}:{{111122223333}}:log-group:/aws/lambda/{{function name}}:*"
               ]
           }
       ]
   }
   ```

------

1. Choisissez **Suivant : Balises**.

1. (Facultatif) Ajoutez une ou plusieurs paires clé-valeur d'identification afin d'organiser, de suivre ou de contrôler l'accès pour cette politique. 

1. Choisissez **Suivant : Vérification**.

1. Sur la page **Examiner une politique**, dans le champ **Nom**, saisissez un nom pour la politique en ligne, tel que **amiLambda**.

1. Sélectionnez **Créer une politique**.

1. Répétez les étapes 2 et 3.

1. Collez la politique suivante. Remplacez chaque {{example resource placeholder}} par vos propres informations.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "ssm:PutParameter",
               "Resource": "arn:aws:ssm:{{us-east-1}}:{{111122223333}}:parameter/{{latestAmi}}"
           },
           {
               "Effect": "Allow",
               "Action": "ssm:DescribeParameters",
               "Resource": "*"
           }
       ]
   }
   ```

------

1. Choisissez **Suivant : Balises**.

1. (Facultatif) Ajoutez une ou plusieurs paires clé-valeur d'identification afin d'organiser, de suivre ou de contrôler l'accès pour cette politique. 

1. Choisissez **Suivant : Vérification**.

1. Sur la page **Examiner une politique**, dans le champ **Nom**, saisissez un nom pour la politique en ligne, tel que **amiParameter**.

1. Sélectionnez **Créer une politique**.

1. Dans le volet de navigation, sélectionnez **Rôles**, puis **Créer un rôle**.

1. Directement sous **Cas d'utilisation**, choisissez **Lambda**, puis **Suivant**.

1. Sur la page **Ajouter des autorisations** utilisez le champ **Recherche** pour localiser les deux politiques que vous avez créées précédemment.

1. Cochez la case à côté des politiques, puis sélectionnez **Suivant**.

1. Pour **Role name (Nom du rôle)**, entrez un nom pour votre nouveau rôle, par exemple **lambda-ssm-role** ou autre, en fonction de vos préférences. 
**Note**  
Différentes entités peuvent référencer le rôle et il n'est donc pas possible de modifier son nom après sa création.

1. (Facultatif) Ajoutez une ou plusieurs paires clé-valeur de balise afin d'organiser, de suivre ou de contrôler l'accès pour ce rôle, puis sélectionnez **Créer le rôle**.

## Tâche 3 : créer une AWS Lambda fonction
<a name="create-lambda-function"></a>

Utilisez la procédure suivante pour créer une fonction Lambda qui met à jour automatiquement la valeur du paramètre `latestAmi`.

**Pour créer une fonction Lambda**

1. Connectez-vous à la AWS Lambda console AWS Management Console et ouvrez-la à l'adresse [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. Choisissez **Créer une fonction**.

1. Sur la page **Create function**, sélectionnez **Author from scratch**.

1. Sous **Nom de la fonction**, saisissez **Automation-UpdateSsmParam**.

1. Pour **Runtime**, choisissez **Python 3.11**.

1. Dans **Architecture**, sélectionnez le type de processeur informatique que Lambda doit utiliser pour exécuter la fonction, **x86\_64** ou **arm64**, 

1. Sous **Autorisations**, développez **Modifier le rôle d'exécution par défaut**.

1. Sélectionnez **Use an existing role (Utiliser un rôle existant)**, puis le rôle de service Lambda que vous avez créé lors de la tâche 2.

1. Choisissez **Créer une fonction**.

1. Dans la section **Code source**, dans l'onglet **lambda\_function**, supprimez le code prérempli dans le champ, puis collez l'exemple de code suivant.

   ```
   from __future__ import print_function
   
   import json
   import boto3
   
   print('Loading function')
   
   
   #Updates an SSM parameter
   #Expects parameterName, parameterValue
   def lambda_handler(event, context):
       print("Received event: " + json.dumps(event, indent=2))
   
       # get SSM client
       client = boto3.client('ssm')
   
       #confirm  parameter exists before updating it
       response = client.describe_parameters(
          Filters=[
             {
              'Key': 'Name',
              'Values': [ event['parameterName'] ]
             },
           ]
       )
   
       if not response['Parameters']:
           print('No such parameter')
           return 'SSM parameter not found.'
   
       #if parameter has a Description field, update it PLUS the Value
       if 'Description' in response['Parameters'][0]:
           description = response['Parameters'][0]['Description']
           
           response = client.put_parameter(
             Name=event['parameterName'],
             Value=event['parameterValue'],
             Description=description,
             Type='String',
             Overwrite=True
           )
       
       #otherwise just update Value
       else:
           response = client.put_parameter(
             Name=event['parameterName'],
             Value=event['parameterValue'],
             Type='String',
             Overwrite=True
           )
           
       responseString = 'Updated parameter %s with value %s.' % (event['parameterName'], event['parameterValue'])
           
       return responseString
   ```

1. Choisissez **Fichier, Enregistrer**.

1. Pour tester la fonction Lambda, dans le menu **Test**, sélectionnez **Configurer des événements de test**.

1. Pour **Event name (Nom d'événement)**, saisissez un nom pour l'événement de test, tel que **MyTestEvent**.

1. Remplacez le texte existant par le code JSON suivant. {{AMI ID}}Remplacez-le par vos propres informations pour définir la valeur de votre `latestAmi` paramètre.

   ```
   {
      "parameterName":"latestAmi",
      "parameterValue":"{{AMI ID}}"
   }
   ```

1. Choisissez **Enregistrer**.

1. Sélectionnez **Test** pour tester la fonction. Dans l'onglet **Résultat de l'exécution**, le statut doit être indiqué comme **Réussi**, avec d'autres détails concernant la mise à jour.

## Tâche 4 : créer un runbook et corriger l'AMI
<a name="create-custom-ami-update-runbook"></a>

Utilisez la procédure suivante pour créer un runbook qui applique des correctifs à l'AMI que vous avez spécifiée pour le paramètre **latestAmi**. Une fois le flux de travail d'automatisation terminé, la valeur **latestAmi** est mise à jour avec l'ID de l'AMI nouvellement corrigée. Les automatisations suivantes utilisent l'AMI créée par la précédente exécution.

**Pour créer et exécuter le runbook**

1. Ouvrez la AWS Systems Manager console à l'adresse [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/).

1. Dans le panneau de navigation, cliquez sur **Documents**.

1. Pour **Créer un document**, choisissez **Automation**.

1. Pour **Nom**, saisissez **UpdateMyLatestWindowsAmi**.

1. Sélectionnez l'onglet **Éditeur**, puis **Modifier**.

1. Choisissez **OK** lorsque vous y êtes invité.

1. Remplacez le contenu par défaut dans le champ **Éditeur de document** avec l'exemple de runbook YAML suivant.

   ```
   ---
   description: Systems Manager Automation Demo - Patch AMI and Update ASG
   schemaVersion: '0.3'
   assumeRole: '{{ AutomationAssumeRole }}'
   parameters:
     AutomationAssumeRole:
       type: String
       description: '(Required) The ARN of the role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to execute this document.'
       default: ''
     SourceAMI:
       type: String
       description: The ID of the AMI you want to patch.
       default: '{{ ssm:latestAmi }}'
     SubnetId:
       type: String
       description: The ID of the subnet where the instance from the SourceAMI parameter is launched.
     SecurityGroupIds:
       type: StringList
       description: The IDs of the security groups to associate with the instance that's launched from the SourceAMI parameter.
     NewAMI:
       type: String
       description: The name of of newly patched AMI.
       default: 'patchedAMI-{{global:DATE_TIME}}'
     InstanceProfile:
       type: String
       description: The name of the IAM instance profile you want the source instance to use.
     SnapshotId:
       type: String
       description: (Optional) The snapshot ID to use to retrieve a patch baseline snapshot.
       default: ''
     RebootOption:
       type: String
       description: '(Optional) Reboot behavior after a patch Install operation. If you choose NoReboot and patches are installed, the instance is marked as non-compliant until a subsequent reboot and scan.'
       allowedValues:
         - NoReboot
         - RebootIfNeeded
       default: RebootIfNeeded
     Operation:
       type: String
       description: (Optional) The update or configuration to perform on the instance. The system checks if patches specified in the patch baseline are installed on the instance. The install operation installs patches missing from the baseline.
       allowedValues:
         - Install
         - Scan
       default: Install
   mainSteps:
     - name: startInstances
       action: 'aws:runInstances'
       timeoutSeconds: 1200
       maxAttempts: 1
       onFailure: Abort
       inputs:
         ImageId: '{{ SourceAMI }}'
         InstanceType: m5.large
         MinInstanceCount: 1
         MaxInstanceCount: 1
         IamInstanceProfileName: '{{ InstanceProfile }}'
         SubnetId: '{{ SubnetId }}'
         SecurityGroupIds: '{{ SecurityGroupIds }}'
     - name: verifyInstanceManaged
       action: 'aws:waitForAwsResourceProperty'
       timeoutSeconds: 600
       inputs:
         Service: ssm
         Api: DescribeInstanceInformation
         InstanceInformationFilterList:
           - key: InstanceIds
             valueSet:
               - '{{ startInstances.InstanceIds }}'
         PropertySelector: '$.InstanceInformationList[0].PingStatus'
         DesiredValues:
           - Online
       onFailure: 'step:terminateInstance'
     - name: installPatches
       action: 'aws:runCommand'
       timeoutSeconds: 7200
       onFailure: Abort
       inputs:
         DocumentName: AWS-RunPatchBaseline
         Parameters:
           SnapshotId: '{{SnapshotId}}'
           RebootOption: '{{RebootOption}}'
           Operation: '{{Operation}}'
         InstanceIds:
           - '{{ startInstances.InstanceIds }}'
     - name: stopInstance
       action: 'aws:changeInstanceState'
       maxAttempts: 1
       onFailure: Continue
       inputs:
         InstanceIds:
           - '{{ startInstances.InstanceIds }}'
         DesiredState: stopped
     - name: createImage
       action: 'aws:createImage'
       maxAttempts: 1
       onFailure: Continue
       inputs:
         InstanceId: '{{ startInstances.InstanceIds }}'
         ImageName: '{{ NewAMI }}'
         NoReboot: false
         ImageDescription: Patched AMI created by Automation
     - name: terminateInstance
       action: 'aws:changeInstanceState'
       maxAttempts: 1
       onFailure: Continue
       inputs:
         InstanceIds:
           - '{{ startInstances.InstanceIds }}'
         DesiredState: terminated
     - name: updateSsmParam
       action: aws:invokeLambdaFunction
       timeoutSeconds: 1200
       maxAttempts: 1
       onFailure: Abort
       inputs:
           FunctionName: Automation-UpdateSsmParam
           Payload: '{"parameterName":"latestAmi", "parameterValue":"{{createImage.ImageId}}"}'
   outputs:
   - createImage.ImageId
   ```

1. Sélectionnez **Create automation (Créer une automatisation)**.

1. Dans le panneau de navigation, sélectionnez **Automation** (Automatisation), puis **Execute automation** (Exécuter l'automatisation).

1. Dans la page **Choose document** (Choisir un document), choisissez l'onglet **Owned by me** (Possédé par moi).

1. Recherchez le **UpdateMyLatestWindowsAmi**runbook, puis sélectionnez le bouton sur la **UpdateMyLatestWindowsAmi**carte.

1. Choisissez **Suivant**.

1. Sélectionnez **Exécution simple**.

1. Spécifiez les valeurs des paramètres d'entrée.

1. Sélectionnez **Execute (Exécuter)**.

1. Une fois l'automatisation terminée, sélectionnez **Parameter Store** dans le panneau de navigation et vérifiez que la nouvelle valeur de `latestAmi` correspond à celle renvoyée par l'automatisation. Vous pouvez également vérifier que l'ID de la nouvelle AMI correspond à la sortie de l'automatisation dans la section **AMI** de la console Amazon EC2.