

• O AWS Systems Manager CloudWatch Dashboard não estará mais disponível a partir de 30 de abril de 2026. Os clientes podem continuar usando o console do Amazon CloudWatch para visualizar, criar e gerenciar os painéis do Amazon CloudWatch exatamente como fazem hoje. Para obter mais informações, consulte a [documentação do Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Dashboards.html). 

# Atualize uma AMI dourada usando Automation, AWS Lambda e Parameter Store
<a name="automation-tutorial-update-patch-golden-ami"></a>

O exemplo a seguir usa o modelo onde uma organização mantém suas próprias AMIs e aplica patches a elas periodicamente, em vez de se basear em AMIs do Amazon Elastic Compute Cloud (Amazon EC2).

O procedimento a seguir mostra como aplicar patches de sistema operacional (SO) automaticamente a uma AMI que já é considerada a AMI mais atualizada ou *mais recente*. No exemplo, o valor padrão do parâmetro `SourceAmiId` é definido por um parâmetro do AWS Systems Manager Parameter Store chamado `latestAmi`. O valor de `latestAmi` é atualizado por uma função AWS Lambda invocada no final da automação. Como resultado desse processo de automação, o tempo e o esforço gastos na aplicação de patches das AMIs são minimizados, pois o patch é sempre aplicado à AMI mais atualizada. O Parameter Store e o Automation são ferramentas do AWS Systems Manager.

**Antes de começar**  
Configure as funções do Automation e, opcionalmente, o Amazon EventBridge para Automation. Para obter mais informações, consulte [Configurar a automação](automation-setup.md).

**Topics**
+ [Tarefa 1: Criar um parâmetro no Systems Manager () Parameter Store](#create-parameter-ami)
+ [Tarefa 2: Criar uma função do IAM para o AWS Lambda](#create-lambda-role)
+ [Tarefa 3: Criar uma função do AWS Lambda](#create-lambda-function)
+ [Tarefa 4: Criar um runbook e aplicar patches à AMI](#create-custom-ami-update-runbook)

## Tarefa 1: Criar um parâmetro no Systems Manager () Parameter Store
<a name="create-parameter-ami"></a>

Crie um parâmetro de string no Parameter Store que use as seguintes informações:
+ **Nome**: `latestAmi`.
+ **Valor**: um ID de AMI. Por exemplo: .:` ami-188d6e0e`.

Para obter mais informações sobre como criar um parâmetro String usando o Parameter Store, consulte [Criar parâmetros do Parameter Store no Systems Manager](sysman-paramstore-su-create.md).

## Tarefa 2: Criar uma função do IAM para o AWS Lambda
<a name="create-lambda-role"></a>

Use o procedimento a seguir para criar uma função de serviço do IAM para o AWS Lambda. Essas políticas dão ao Lambda a permissão necessária para atualizar o valor do parâmetro `latestAmi` usando uma função do Lambda e do Systems Manager.

**Para criar uma função de serviço do IAM para o Lambda**

1. Faça login no Console de gerenciamento da AWS e abra o console do IAM em [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. No painel de navegação, selecione **Políticas** e, em seguida, **Criar política**.

1. Selecione a guia **JSON**.

1. Substitua os conteúdos padrão pela política a seguir. Substitua cada {{espaço reservado para recurso de exemplo}} por suas próprias informações.

------
#### [ 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. Escolha **Next: Tags**.

1. (Opcional) Adicione um ou mais pares de chave-valor de etiqueta para organizar, monitorar ou controlar acesso para essa política. 

1. Selecione **Próximo: revisar**.

1. Na página **Revisar política**, em **Nome**, digite um nome para a política em linha, como **amiLambda**.

1. Escolha **Criar política**.

1. Repita as etapas 2 e 3.

1. Cole a política a seguir. Substitua cada {{espaço reservado para recurso de exemplo}} por suas próprias informações.

------
#### [ 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. Escolha **Próximo: tags**.

1. (Opcional) Adicione um ou mais pares de chave-valor de etiqueta para organizar, monitorar ou controlar acesso para essa política. 

1. Escolha **Próximo: revisar**.

1. Na página **Revisar política**, em **Nome**, digite um nome para a política em linha, como **amiParameter**.

1. Escolha **Criar política**.

1. No painel de navegação, escolha **Perfis** e **Criar perfil**.

1. Em seguida, em **Caso de uso**, escolha **Lambda** e escolha **Próximo**.

1. Na página **Adicionar permissões**, use o campo **Pesquisar** para localizar as duas políticas criadas anteriormente.

1. Marque a caixa de seleção ao lado das políticas e, em seguida, escolha **Próximo**.

1. Em **Role name** (Nome da função), insira um nome para a nova função, como **lambda-ssm-role** ou outro nome que você preferir. 
**nota**  
Como várias entidades podem fazer referência à função, não é possível alterar o nome da função depois que ela é criada.

1. (Opcional) Adicione um ou mais pares chave-valor de etiquetas para organizar, acompanhar ou controlar o acesso a esse perfil e, em seguida, escolha **Criar perfil**.

## Tarefa 3: Criar uma função do AWS Lambda
<a name="create-lambda-function"></a>

Use o seguinte procedimento para criar uma função do Lambda que atualize automaticamente o valor do parâmetro `latestAmi`.

**Como criar uma função do Lambda**

1. Faça login no Console de gerenciamento da AWS e abra o console do AWS Lambda em [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. Escolha a opção **Criar função**.

1. Na página **Create function**, selecione **Author from scratch**.

1. Em **Function name** (Nome da função), insira **Automation-UpdateSsmParam**.

1. Em **Runtime**, selecione **Python 3.11**.

1. Em **Arquitetura**, selecione o tipo de processador de computador que o Lambda usará para executar a função, **x86\_64** ou **arm64**. 

1. Na seção **Permissões**, expanda **Alterar perfil de execução padrão**.

1. Selecione **Use an existing role** (Usar uma função existente) e escolha a função de serviço do Lambda criada na Tarefa 2.

1. Escolha a opção **Criar função**.

1. Na área **Origem do código**, na guia **lambda\_function**, exclua o código pré-preenchido no campo e cole a amostra de código a seguir.

   ```
   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. Escolha **Arquivo, Salvar**.

1. Para testar a função do Lambda, no menu **Teste**, escolha **Configurar evento de teste**.

1. Em **Event name (Nome do evento)**, insira um nome para o evento de teste, como **MyTestEvent**.

1. Substitua o texto existente pelo seguinte JSON. Substitua {{AMI ID}} (ID da AMI) por suas próprias informações para definir o valor do parâmetro `latestAmi`.

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

1. Escolha **Salvar**.

1. Selecione **Test (Testar)** para testar a função. Na guia **Resultado da execução**, o status deve ser informado como **Com êxito**, junto com outros detalhes sobre a atualização.

## Tarefa 4: Criar um runbook e aplicar patches à AMI
<a name="create-custom-ami-update-runbook"></a>

Use o procedimento a seguir para criar e executar um runbook que aplica patches à AMI especificada para o parâmetro **latestAmi**. Depois que a automação for concluída, o valor de **latestAmi** será atualizado com o ID da AMI que acabou de receber patch. As automações subsequentes usarão a AMI criada pela execução anterior.

**Para criar e executar o runbook**

1. Abra o console AWS Systems Manager em [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/).

1. No painel de navegação, escolha **Documents**.

1. Em **Criar documento**, escolha **Automation**.

1. Em **Nome**, digite **UpdateMyLatestWindowsAmi**.

1. Escolha a guia **Editor** e depois escolha **Edit (Editar)**.

1. Escolha **OK** quando solicitado.

1. No campo **Editor de documentos**, substitua o conteúdo padrão pelo conteúdo do runbook de amostra YAML apresentado a seguir.

   ```
   ---
   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. Escolha **Criar automação**.

1. No painel de navegação, selecione **Automation** e **Execute automation (Executar automação)**.

1. Na página **Choose document** (Escolher documento), escolha a guia **Owned by me** (Pertencem a mim).

1. Procure o runbook **UpdateMyLatestWindowsAmi** e selecione o botão no cartão **UpdateMyLatestWindowsAmi**.

1. Escolha **Próximo**.

1. Escolha **Simple execution (Execução simples)**.

1. Especificar valores para os parâmetro de entrada.

1. Clique em **Executar**.

1. Após a conclusão da automação, escolha **Parameter Store** no painel de navegação e confirme se o novo valor para `latestAmi` corresponde ao valor retornado pela automação. Você também pode verificar se o novo ID da AMI corresponde à saída do Automation na seção **AMIs** do console do Amazon EC2.