Actualice un golden AMI mediante la Automation, AWS Lambda, y Parameter Store
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 Automation, 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 Automation son capacidades 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.
Contenido
Tarea 1: crear un parámetro en Systems Manager Parameter Store
Cree un parámetro de cadena en Parameter Store que utilice la siguiente información:
-
Name (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.
Tarea 2: crear un rol de IAM para AWS Lambda
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
Inicie sesión en AWS Management Console Management Console y abra la consola IAM en https://console.aws.amazon.com/iam/
. -
En el panel de navegación, seleccione Políticas y, a continuación, Crear política.
-
Seleccione la pestaña JSON.
-
Reemplace el contenido predeterminado por la siguiente política. Reemplace cada
example resource placeholder
por su propia información.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:
region
:123456789012
:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:region
:123456789012
:log-group:/aws/lambda/function name
:*" ] } ] } -
Elija Siguiente: etiquetas.
-
(Opcional) Agregue uno o varios pares de valor etiqueta-clave para organizar, realizar un seguimiento o controlar el acceso a esta política.
-
Elija Siguiente: Revisar.
-
En la página Review Policy (Revisar política), en Name (Nombre), escriba un nombre para la política insertada, como
amiLambda
. -
Elija Crear política.
-
Repita los pasos 2 y 3.
-
Pegue la política siguiente. Reemplace cada
example resource placeholder
por su propia información.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ssm:PutParameter", "Resource": "arn:aws:ssm:
region
:123456789012
:parameter/latestAmi" }, { "Effect": "Allow", "Action": "ssm:DescribeParameters", "Resource": "*" } ] } -
Elija Siguiente: etiquetas.
-
(Opcional) Agregue uno o varios pares de valor etiqueta-clave para organizar, realizar un seguimiento o controlar el acceso a esta política.
-
Elija Siguiente: Revisar.
-
En la página Review Policy (Revisar política), en Name (Nombre), escriba un nombre para la política insertada, como
amiParameter
. -
Elija Crear política.
-
En el panel de navegación, seleccione Roles y luego seleccione Crear rol.
-
Inmediatamente debajo de Caso de uso, seleccione Lambda y, a continuación, Siguiente.
-
En la página Agregar permisos, utilice el campo Buscar para localizar las dos políticas que ha creado anteriormente.
-
Elija la casilla de verificación situada junto a las políticas y, a continuación, elija Siguiente.
-
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.
-
(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
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
Inicie sesión en la AWS Management Console y abra la consola AWS Lambda en https://console.aws.amazon.com/lambda/
. -
Elija Crear función.
-
En la página Crear función, elija Diseñar desde cero.
-
En Nombre de la función, introduzca
Automation-UpdateSsmParam
. -
En Tiempo de ejecución, seleccione Python 3.8.
-
En Arquitectura, seleccione el tipo de procesador de equipo que Lambda utilizará para ejecutar la función, x86_64 o arm64,
-
En la sección Permisos, expanda Cambiar rol de ejecución predeterminado.
-
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.
-
Elija Crear función.
-
En la sección Origen de código de la pestaña lambda_function, 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
-
Elija Archivo, Guardar.
-
Para probar la función de Lambda, en el menú Prueba, elija Configurar eventos de prueba.
-
En Event Name (Nombre del evento), escriba un nombre para el evento de prueba, como
MyTestEvent
. -
Reemplace el texto existente por el código JSON siguiente. Reemplace
AMI ID
con su propia información para establecer el valor del parámetrolatestAmi
.{ "parameterName":"latestAmi", "parameterValue":"
AMI ID
" } -
Seleccione Guardar.
-
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
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
Abra la consola de AWS Systems Manager en https://console.aws.amazon.com/systems-manager/
. En el panel de navegación, elija Documentos.
-
Para Crear documento, seleccione Automatización.
-
En Nombre, escriba
UpdateMyLatestWindowsAmi
. -
Elija la pestaña Editor y después elija Edit (Editar).
-
Elija Aceptar cuando se le solicite.
-
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
-
Elija Create automation (Crear automatización).
-
En el panel de navegación, elija Automatización y, después, seleccione Ejecutar automatización.
-
En la página Choose document (Elegir documento), seleccione la pestaña Owned by me (De mi propiedad).
-
Busque el manual de procedimientos UpdateMyLatestWindowsAmi y seleccione el botón en la tarjeta UpdateMyLatestWindowsAmi.
-
Elija Siguiente.
-
Elija Simple execution (Ejecución sencilla).
-
Especifique los valores de los parámetros de entrada.
-
Elija Ejecutar.
-
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.