Atualize uma AMI dourada usando Automation, AWS Lambda e Parameter Store - AWS Systems Manager

Atualize uma AMI dourada usando Automation, AWS Lambda e Parameter Store

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 patch das AMIs são minimizados, pois o patch é sempre aplicado à AMI mais atualizada. O Parameter Store e o Automation são recursos do AWS Systems Manager.

Antes de começar

Configure as funções do Automation e, opcionalmente, o Amazon EventBridge para Automation. Para ter mais informações, consulte Configurar a automação.

Tarefa 1: Criar um parâmetro no Systems Manager (Parameter Store)

Crie um parâmetro de string no Parameter Store que use as seguintes informações:

  • Name (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.

Tarefa 2: Criar uma função do IAM para o AWS Lambda

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 AWS Management Console e abra o console do IAM em https://console.aws.amazon.com/iam/.

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

  3. Selecione a guia JSON.

  4. 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.

    { "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:*" ] } ] }
  5. Escolha Próximo: etiquetas.

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

  7. Selecione Next: Review (Próximo: revisar).

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

  9. Escolha Criar política.

  10. Repita as etapas 2 e 3.

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

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ssm:PutParameter", "Resource": "arn:aws:ssm:region:123456789012:parameter/latestAmi" }, { "Effect": "Allow", "Action": "ssm:DescribeParameters", "Resource": "*" } ] }
  12. Escolha Próximo: etiquetas.

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

  14. Selecione Next: Review (Próximo: revisar).

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

  16. Escolha Criar política.

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

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

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

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

  21. 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.

  22. (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

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

Criar uma função do Lambda
  1. Faça login no AWS Management Console e abra o console do AWS Lambda em https://console.aws.amazon.com/lambda/.

  2. Escolha a opção Criar função.

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

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

  5. Em Runtime, escolha Python 3.8.

  6. Em Arquitetura, selecione o tipo de processador de computador que o Lambda usará para executar a função, x86_64 ou arm64.

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

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

  9. Escolha a opção Criar função.

  10. 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
  11. Escolha Arquivo, Salvar.

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

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

  14. 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" }
  15. Escolha Salvar.

  16. 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

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 do AWS Systems Manager em https://console.aws.amazon.com/systems-manager/.

  2. No painel de navegação, escolha Documents.

  3. Em Criar documento, escolha Automation.

  4. Em Nome, digite UpdateMyLatestWindowsAmi.

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

  6. Escolha OK quando solicitado.

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

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

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

  11. Procure o runbook UpdateMyLatestWindowsAmi e selecione o botão no cartão UpdateMyLatestWindowsAmi.

  12. Escolha Próximo.

  13. Escolha Simple execution (Execução simples).

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

  15. Clique em Executar.

  16. 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.