

• El panel de AWS Systems Manager CloudWatch dejará de estar disponible después del 30 de abril de 2026. Los clientes pueden seguir utilizando la consola de Amazon CloudWatch para ver, crear y administrar sus paneles de Amazon CloudWatch, tal y como lo hacen actualmente. Para obtener más información, consulte la [documentación del panel de Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Dashboards.html). 

# Actualice un golden AMI mediante la Automation, AWS Lambda, y Parameter Store
<a name="automation-tutorial-update-patch-golden-ami"></a>

El siguiente ejemplo utiliza el modelo en el que una organización mantiene sus propias AMIs propietarias y les aplica revisiones de forma periódica, en lugar de basarse en las AMIs de Amazon Elastic Compute Cloud (Amazon EC2).

En el siguiente procedimiento se muestra cómo aplicar de forma automática las revisiones de sistema operativo (SO) a una AMI que ya se considera la AMI más actualizada o la *más reciente*. En el ejemplo, el valor predeterminado, el parámetro `SourceAmiId` se define mediante un parámetro de AWS Systems Manager Parameter Store que se denomina `latestAmi`. El valor de `latestAmi` se actualiza mediante una función de AWS Lambda invocada al final de la automatización. Como resultado de este proceso de Automatización, se reducen el tiempo y el esfuerzo empleados en la aplicación de revisiones a las AMIs, ya que las revisiones siempre se aplican a la AMI más actualizada. Parameter Store y Automatización son herramientas de AWS Systems Manager.

**Antes de empezar**  
Configure los roles de Automation y, si así lo desea, Amazon EventBridge para Automation. Para obtener más información, consulte [Configuración de Automation](automation-setup.md).

**Topics**
+ [Tarea 1: crear un parámetro en Systems Manager Parameter Store](#create-parameter-ami)
+ [Tarea 2: crear un rol de IAM para AWS Lambda](#create-lambda-role)
+ [Tarea 3: crear una función de AWS Lambda](#create-lambda-function)
+ [Tarea 4: crear un manual de procedimientos y aplicar revisiones a la AMI](#create-custom-ami-update-runbook)

## Tarea 1: crear un parámetro en Systems Manager Parameter Store
<a name="create-parameter-ami"></a>

Cree un parámetro de cadena en Parameter Store que utilice la siguiente información:
+ **Nombre**: `latestAmi`.
+ **Valor**: un ID de AMI. Por ejemplo: .:` ami-188d6e0e`.

Para obtener información sobre cómo crear un parámetro de cadena de Parameter Store, consulte [Creación de parámetros de Parameter Store en Systems Manager](sysman-paramstore-su-create.md).

## Tarea 2: crear un rol de IAM para AWS Lambda
<a name="create-lambda-role"></a>

Utilice el siguiente procedimiento para crear un rol de servicio de IAM para AWS Lambda. Estas políticas conceden permiso a Lambda para que actualice el valor del parámetro `latestAmi` con una función de Lambda y Systems Manager.

**Para crear un rol de servicio de IAM para Lambda**

1. Inicie sesión en la Consola de administración de AWS y abra la consola de IAM en [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. En el panel de navegación, seleccione **Políticas** y, a continuación, **Crear política**.

1. Seleccione la pestaña **JSON**.

1. Reemplace el contenido predeterminado por la siguiente política. Reemplace cada *example resource placeholder* por su propia información.

------
#### [ 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. Elija **Siguiente: etiquetas**.

1. (Opcional) Agregue uno o varios pares de valor etiqueta-clave para organizar, realizar un seguimiento o controlar el acceso a esta política. 

1. Elija **Siguiente: Revisar**.

1. En la página **Review Policy (Revisar política)**, en **Name (Nombre)**, escriba un nombre para la política insertada, como **amiLambda**.

1. Elija **Crear política**.

1. Repita los pasos 2 y 3.

1. Pegue la política siguiente. Reemplace cada *example resource placeholder* por su propia información.

------
#### [ 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. Elija **Siguiente: etiquetas**.

1. (Opcional) Agregue uno o varios pares de valor etiqueta-clave para organizar, realizar un seguimiento o controlar el acceso a esta política. 

1. Elija **Siguiente: Revisar**.

1. En la página **Review Policy (Revisar política)**, en **Name (Nombre)**, escriba un nombre para la política insertada, como **amiParameter**.

1. Elija **Crear política**.

1. En el panel de navegación, seleccione **Roles** y luego seleccione **Crear rol**.

1. Inmediatamente debajo de **Caso de uso**, seleccione **Lambda** y, a continuación, **Siguiente**.

1. En la página **Agregar permisos**, utilice el campo **Buscar** para localizar las dos políticas que ha creado anteriormente.

1. Elija la casilla de verificación situada junto a las políticas y, a continuación, elija **Siguiente**.

1. En **Role name (Nombre del rol)**, escriba un nombre para el rol nuevo (por ejemplo, **lambda-ssm-role** o el nombre que prefiera). 
**nota**  
Dado que varias entidades pueden hacer referencia al rol, no puede cambiar el nombre del rol después de crearla.

1. (Opcional) Agregue uno o varios pares clave-valor de etiqueta para organizar o controlar el acceso a este rol o realizar su seguimiento y, a continuación, elija **Crear rol**.

## Tarea 3: crear una función de AWS Lambda
<a name="create-lambda-function"></a>

Utilice el siguiente procedimiento para crear una función de Lambda que actualice automáticamente el valor del parámetro `latestAmi`.

**Cómo crear una función de Lambda**

1. Inicie sesión en la Consola de administración de AWS y abra la consola AWS Lambda en [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. Seleccione **Creación de función**.

1. En la página **Crear función**, elija **Diseñar desde cero**.

1. En **Nombre de la función**, introduzca **Automation-UpdateSsmParam**.

1. En **Tiempo de ejecución**, seleccione **Python 3.11**.

1. En **Arquitectura**, seleccione el tipo de procesador de equipo que Lambda utilizará para ejecutar la función, **x86\$164** o **arm64**, 

1. En la sección **Permisos**, expanda **Cambiar rol de ejecución predeterminado**.

1. Elija **Use an existing role** (Usar un rol existente) y, a continuación, elija el rol de servicio para Lambda que creó en la tarea 2.

1. Seleccione **Creación de función**.

1. En la sección **Origen de código** de la pestaña **lambda\$1function**, elimine el código existente en el campo y, a continuación, pegue el siguiente código de ejemplo.

   ```
   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. Elija **Archivo, Guardar**.

1. Para probar la función de Lambda, en el menú **Prueba**, elija **Configurar eventos de prueba**.

1. En **Event Name** (Nombre del evento), escriba un nombre para el evento de prueba, como **MyTestEvent**.

1. Reemplace el texto existente por el código JSON siguiente. Reemplace *AMI ID* con su propia información para establecer el valor del parámetro `latestAmi`.

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

1. Seleccione **Save**.

1. Elija **Test (Probar)** para probar la función. En la pestaña **Resultado de la ejecución**, el estado debe indicarse como **Correcto**, junto con otros detalles sobre la actualización.

## Tarea 4: crear un manual de procedimientos y aplicar revisiones a la AMI
<a name="create-custom-ami-update-runbook"></a>

Utilice el siguiente procedimiento para crear y ejecutar un manual de procedimientos que aplique revisiones a la AMI que ha especificado en el parámetro **latestAmi**. Después de que se complete la automatización, el valor de **latestAmi** se actualiza con el ID de la AMI a la cual se acaba de aplicar revisiones. Las automatizaciones posteriores utilizan la AMI creada con la ejecución anterior.

**Para crear y ejecutar el manual de procedimientos**

1. Abra la consola de AWS Systems Manager en [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/).

1. En el panel de navegación, elija **Documentos**.

1. Para **Crear documento**, seleccione **Automatización**.

1. En **Nombre**, escriba **UpdateMyLatestWindowsAmi**.

1. Elija la pestaña **Editor** y después elija **Edit (Editar)**.

1. Elija **Aceptar** cuando se le solicite.

1. En el campo **Editor de documentos**, reemplace el contenido predeterminado con el siguiente manual de procedimientos YAML de muestra.

   ```
   ---
   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. Elija **Create automation (Crear automatización)**.

1. En el panel de navegación, elija **Automatización** y, después, seleccione **Ejecutar automatización**.

1. En la página **Choose document** (Elegir documento), seleccione la pestaña **Owned by me** (De mi propiedad).

1. Busque el manual de procedimientos **UpdateMyLatestWindowsAmi** y seleccione el botón en la tarjeta **UpdateMyLatestWindowsAmi**.

1. Elija **Siguiente**.

1. Elija **Simple execution (Ejecución sencilla)**.

1. Especifique los valores de los parámetros de entrada.

1. Elija **Ejecutar**.

1. Una vez que se complete la automatización, elija **Parameter Store** en el panel de navegación y confirme que el nuevo valor de `latestAmi` coincide con el valor que devuelve la automatización. También puede verificar que el nuevo ID de AMI coincida con la salida de Automation en la sección **AMIs** de la consola de Amazon EC2.