연습: AMI 패치 적용 및 Auto Scaling 그룹 업데이트 - AWS Systems Manager

연습: AMI 패치 적용 및 Auto Scaling 그룹 업데이트

다음 예제는 새 패치가 적용된 AMI로 Auto Scaling 그룹을 업데이트하는 단계를 추가하여 연습: Automation AWS Lambda 및 Parameter Store를 사용하여 AMI 패치 적용 간소화 예제를 기반으로 빌드됩니다. 이 접근 방법을 통해 Auto Scaling 그룹을 사용하는 다양한 컴퓨팅 환경에서 새로운 이미지를 자동으로 사용할 수 있습니다.

이 예제에서 자동화 워크플로의 최종 단계에서는 AWS Lambda 함수를 사용하여 기존 시작 구성을 복사하고 AMI ID를 새 패치가 적용된 AMI로 설정합니다. 그러면 Auto Scaling 그룹이 새로운 시작 구성으로 업데이트됩니다. 이 유형의 Auto Scaling 시나리오에서 사용자는 Auto Scaling 그룹의 기존 인스턴스를 종료하여 새로운 이미지를 사용하는 새로운 인스턴스를 강제로 시작할 수 있습니다. 또는 사용자는 기다렸다가 축소 또는 확장 이벤트를 통해 더 새로운 인스턴스를 자연스럽게 시작할 수 있습니다.

시작하기 전에

이 예제를 시작하기 전에 다음 작업을 완료합니다.

  • 자동화에 대한 IAM 역할을 구성합니다. Systems Manager에서 자동화 워크플로를 처리하려면 인스턴스 프로파일 역할과 서비스 역할 ARN이 필요합니다. 자세한 정보는 Automation 시작하기 단원을 참조하십시오.

  • Lambda에 대해 잘 모르는 경우 AWS Lambda Developer Guide단순 Lambda 함수 생성 주제를 참조하여 간단한 Lambda 함수를 만드는 것이 좋습니다. 이 주제를 통해 Lambda 함수를 만드는 데 필요한 단계를 자세히 알 수 있습니다.

작업 1: AWS Lambda에 대한 IAM 역할 생성

다음 절차를 사용하여 AWS Lambda에 대한 IAM 서비스 역할을 생성합니다. 이 역할에는 AWSLambdaExecuteAutoScalingFullAccess 관리형 정책이 포함됩니다. 이 정책은 Lambda 함수를 사용하여 최신 패치가 적용된 AMI를 포함하는 새 Auto Scaling 그룹을 만들 수 있도록 Lambda 권한을 부여합니다.

IAM에 대한 Lambda 서비스 역할을 생성하는 방법

  1. Open the IAM console at https://console.aws.amazon.com/iam/.

  2. 탐색 창에서 역할을 선택한 후 역할 생성을 선택합니다.

  3. 신뢰할 수 있는 엔터티 유형 선택 페이지의 AWS 서비스에서 Lambda를 선택합니다.

  4. 사용 사례 선택 섹션에서 Lambda을 선택한 후 다음: 권한을 선택합니다.

  5. Attach permissions policy(권한 정책 연결) 페이지에서 AWSLambdaExecute를 검색한 다음 옆에 있는 옵션을 선택합니다. AutoScalingFullAccess를 검색한 다음 옆에 있는 옵션을 선택합니다.

  6. 다음: 검토를 선택합니다.

  7. 검토 페이지에서 AWSLambdaExecuteAutoScalingFullAccess정책 아래에 나열되어 있는지 확인합니다.

    
                                    샘플 코드를 lambda_function 필드에 붙여 넣기
  8. 역할 이름 상자에 이름을 입력한 후 설명을 입력합니다.

  9. 역할 생성을 선택합니다. 그러면 역할 페이지로 돌아갑니다.

작업 2: AWS Lambda 함수 생성

다음 절차를 사용하여 최신 패치가 적용된 AMI가 포함된 기존 Auto Scaling 그룹을 자동으로 업데이트하는 Lambda 함수를 만듭니다.

Lambda 함수를 만들려면

  1. Sign in to the AWS Management Console and open the AWS Lambda console at https://console.aws.amazon.com/lambda/.

  2. 함수 생성을 선택합니다.

  3. 새로 작성이 선택되어 있는지 확인합니다.

  4. 이름 필드에 Automation-UpdateAsg를 입력합니다.

  5. 런타임 목록에서 Python 2.7을 선택합니다.

  6. 역할 목록에서 기존 역할 선택이 선택되어 있는지 확인합니다.

  7. 기존 역할 목록에서 앞서 만든 역할을 선택합니다.

  8. 함수 생성을 선택합니다. Automation-UpdateSAsg의 구성 페이지 및 코드가 표시됩니다.

  9. 디자이너 섹션에서 아무 변경도 하지 않습니다.

  10. 함수 코드 섹션에서 lambda_function 필드에 미리 채워진 코드를 삭제하고 다음 코드 샘플을 붙여 넣습니다.

    
                                    샘플 코드를 lambda_function 필드에 붙여 넣기
    from __future__ import print_function import json import datetime import time import boto3 print('Loading function') def lambda_handler(event, context): print("Received event: " + json.dumps(event, indent=2)) # get autoscaling client client = boto3.client('autoscaling') # get object for the ASG we're going to update, filter by name of target ASG response = client.describe_auto_scaling_groups(AutoScalingGroupNames=[event['targetASG']]) if not response['AutoScalingGroups']: return 'No such ASG' # get name of InstanceID in current ASG that we'll use to model new Launch Configuration after sourceInstanceId = response.get('AutoScalingGroups')[0]['Instances'][0]['InstanceId'] # create LC using instance from target ASG as a template, only diff is the name of the new LC and new AMI timeStamp = time.time() timeStampString = datetime.datetime.fromtimestamp(timeStamp).strftime('%Y-%m-%d %H-%M-%S') newLaunchConfigName = 'LC '+ event['newAmiID'] + ' ' + timeStampString client.create_launch_configuration( InstanceId = sourceInstanceId, LaunchConfigurationName=newLaunchConfigName, ImageId= event['newAmiID'] ) # update ASG to use new LC response = client.update_auto_scaling_group(AutoScalingGroupName = event['targetASG'],LaunchConfigurationName = newLaunchConfigName) return 'Updated ASG `%s` with new launch configuration `%s` which includes AMI `%s`.' % (event['targetASG'], newLaunchConfigName, event['newAmiID'])
  11. 이 페이지의 나머지 구성 옵션을 지정합니다.

  12. 저장을 선택합니다.

  13. 테스트를 선택합니다.

  14. 테스트 이벤트 구성 페이지에서 새로운 테스트 이벤트 생성이 선택되어 있는지 확인합니다.

  15. 이벤트 템플릿 목록에서 Hello World가 선택되어 있는지 확인합니다.

  16. 이벤트 이름 필드에 이름을 입력합니다.

  17. 기존 샘플을 다음 JSON으로 바꿉니다. AMI ID 및 Auto Scaling 그룹을 입력합니다.

    { "newAmiID":"valid AMI ID", "targetASG":"name of your Auto Scaling group" }
  18. 저장을 선택합니다.

  19. 테스트를 선택합니다. 출력에는 새로운 시작 구성으로 Auto Scaling 그룹이 업데이트되었다는 내용이 표시됩니다.

작업 3: Automation 문서 생성, AMI에 패치 적용 및 Auto Scaling 그룹 업데이트

다음 절차를 사용하여 latestAmi 파라미터에 지정한 AMI에 패치를 적용하는 자동화 문서를 만들고 실행합니다. 그러면 자동화 워크플로를 통해 Auto Scaling 그룹이 최신 패치가 적용된 AMI를 사용하도록 업데이트됩니다.

자동화 문서를 생성하고 실행하는 방법

  1. https://console.aws.amazon.com/systems-manager/에서 AWS Systems Manager 콘솔을 엽니다.

  2. 탐색 창에서 Documents를 선택합니다.

    -또는-

    AWS Systems Manager 홈 페이지를 처음 여는 경우 메뉴 아이콘( )을 선택하여 탐색 창을 연 다음 탐색 창에서 문서를 선택합니다.

  3. Create automation(자동화 생성)을 선택합니다.

  4. 이름 필드에 PatchAmiandUpdateAsg를 입력합니다.

  5. 편집기 탭을 선택하고 편집 버튼을 선택합니다.

  6. 메시지가 표시되면 확인을 선택하고 문서 편집기 필드에서 자리표시자 콘텐츠를 삭제합니다.

  7. 문서 편집기 필드에서 다음 JSON 샘플 문서 콘텐츠를 붙여 넣습니다.

    참고

    이 샘플에 있는 assumeRoleIamInstanceProfileName 값을 Automation 시작하기에서 만든 서비스 역할 ARN 및 인스턴스 프로파일 역할로 바꿔야 합니다.

    { "description":"Systems Manager Automation Demo - Patch AMI and Update ASG", "schemaVersion":"0.3", "assumeRole":"the service role ARN you created", "parameters":{ "sourceAMIid":{ "type":"String", "description":"AMI to patch" }, "subnetId":{ "type":"String", "description":"The SubnetId where the instance is launched from the sourceAMIid." }, "targetAMIname":{ "type":"String", "description":"Name of new AMI", "default":"patchedAMI-{{global:DATE_TIME}}" }, "targetASG":{ "type":"String", "description":"Auto Scaling group to Update" } }, "mainSteps":[ { "name":"startInstances", "action":"aws:runInstances", "timeoutSeconds":1200, "maxAttempts":1, "onFailure":"Abort", "inputs":{ "ImageId":"{{ sourceAMIid }}", "InstanceType":"m3.large", "MinInstanceCount":1, "MaxInstanceCount":1, "IamInstanceProfileName":"the name of the instance IAM role you created", "SubnetId":"{{ subnetId }}" } }, { "name":"installMissingWindowsUpdates", "action":"aws:runCommand", "maxAttempts":1, "onFailure":"Continue", "inputs":{ "DocumentName":"AWS-InstallMissingWindowsUpdates", "InstanceIds":[ "{{ startInstances.InstanceIds }}" ], "Parameters":{ "UpdateLevel":"Important" } } }, { "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":"{{ targetAMIname }}", "NoReboot":true, "ImageDescription":"AMI created by EC2 Automation" } }, { "name":"terminateInstance", "action":"aws:changeInstanceState", "maxAttempts":1, "onFailure":"Continue", "inputs":{ "InstanceIds":[ "{{ startInstances.InstanceIds }}" ], "DesiredState":"terminated" } }, { "name":"updateASG", "action":"aws:invokeLambdaFunction", "timeoutSeconds":1200, "maxAttempts":1, "onFailure":"Abort", "inputs": { "FunctionName": "Automation-UpdateAsg", "Payload": "{\"targetASG\":\"{{targetASG}}\", \"newAmiID\":\"{{createImage.ImageId}}\"}" } } ], "outputs":[ "createImage.ImageId" ] }
  8. 문서 생성을 선택하여 문서를 저장합니다.

  9. 자동화를 선택한 후, 자동화 실행을 선택합니다.

  10. 자동화 문서 목록에서 PatchAmiandUpdateAsg를 선택합니다.

  11. 문서 세부 정보 섹션에서 문서 버전1로 설정되어 있는지 확인합니다.

  12. 실행 모드 섹션에서 한 번에 전체 자동화 실행을 선택합니다.

  13. 대상 및 속도 제어 옵션을 비활성 상태로 그대로 둡니다.

  14. sourceAMIid에 대한 Windows AMI ID, targetASG의 Auto Scaling 그룹 이름 및 subnetId 입력 파라미터 값을 지정합니다.

  15. 자동화 실행을 선택합니다.

  16. 실행이 완료된 후 Amazon EC2 콘솔에서 Auto Scaling를 선택한 후 시작 구성을 선택합니다. 새로운 시작 구성이 보이고 이 구성에서 새로운 AMI ID가 사용되는지 확인합니다.

  17. Auto Scaling를 선택한 후 Auto Scaling 그룹을 선택합니다. Auto Scaling 그룹이 새로운 시작 구성을 사용하는지 확인합니다.

  18. Auto Scaling 그룹에서 하나 이상의 인스턴스를 종료합니다. 대체 인스턴스가 새로운 AMI ID를 사용하여 시작됩니다.

참고

인스턴스를 안전하게 종료하도록 Lambda 함수를 편집하여 새로운 AMI 배포를 한층 더 자동화할 수 있습니다. 또한 고유의 Lambda 함수를 호출하고 AWS CloudFormation의 기능을 활용하여 Auto Scaling 그룹을 업데이트할 수도 있습니다. 자세한 정보는 UpdatePolicy 속성을 참조하십시오.