연습: Automation AWS Lambda 및 Parameter Store를 사용하여 AMI 패치 적용 간소화 - AWS Systems Manager

연습: Automation AWS Lambda 및 Parameter Store를 사용하여 AMI 패치 적용 간소화

다음 예제는 연습: Windows Server AMI에 패치 적용에서 설명하는 Windows AMI를 업데이트하는 방법을 확장한 것입니다. 이 예제에는 조직이 Amazon EC2 AMI에서 빌드하는 대신 자체 소유 AMI를 유지 관리하고 정기적으로 패치를 적용하는 모델을 사용합니다.

다음 절차에서는 이미 최신 AMI로 간주되는 Windows AMI에 OS(운영 체제) 패치를 자동으로 적용하는 방법을 보여줍니다. 이 예제에서 SourceAmiId 파라미터의 기본값은 latestAmi라는 Systems Manager Parameter Store 파라미터로 정의됩니다. latestAmi 값은 자동화 워크플로가 끝날 때 호출되는 AWS Lambda 함수를 통해 업데이트됩니다. 이 자동화 프로세스의 결과로 최신 AMI에 패치가 항상 적용되기 때문에 AMI에 패치를 적용하는 데 소비되는 시간과 노력이 최소화됩니다.

시작하기 전에

자동화 역할 및 자동화를 위한 CloudWatch Events(선택 사항)를 구성합니다. 자세한 정보는 Automation 시작하기 단원을 참조하십시오.

작업 1: Systems Manager Parameter Store에서 파라미터 생성

다음 정보를 사용하는 문자열 파라미터를 Parameter Store에 생성

  • 이름: latestAmi.

  • : Windows AMI ID. 예: ami-188d6e0e.

Parameter Store 문자열 파라미터를 생성하는 방법에 대한 자세한 정보는 Systems Manager 파라미터 생성 단원을 참조하십시오.

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

다음 절차를 사용하여 AWS Lambda에 대한 IAM 서비스 역할을 생성합니다. 이 역할은 AWSLambdaExecuteAmazonSSMFullAccess 관리형 정책을 포함합니다. 이 정책은 Lambda 함수와 Systems Manager를 사용하여 latestAmi 파라미터의 값을 업데이트할 Lambda 권한을 부여합니다.

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

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

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

  3. JSON 탭을 선택합니다.

  4. 기본 내용을 다음으로 바꿉니다. us-west-2123456789012를 사용하려는 리전 및 계정으로 바꾸십시오. updateAmiFunction을 Lambda 함수의 이름으로 바꿉니다.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:us-west-2:123456789012:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:us-west-2:123456789012:log-group:/aws/lambda/updateAmiFunction:*" ] } ] }
  5. [Review policy]를 선택합니다.

  6. Review policy(정책 검토) 페이지에서 Name(이름)에 인라인 정책 이름을 입력합니다(예: amiLambda)

  7. 정책 생성을 선택합니다.

  8. 2단계와 3단계를 반복합니다.

  9. 기본 내용을 다음으로 바꿉니다. us-west-2123456789012를 사용하려는 리전 및 계정으로 바꾸십시오.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ssm:PutParameter", "Resource": "arn:aws:ssm:us-west-2:123456789012:parameter/latestAmi" }, { "Effect": "Allow", "Action": "ssm:DescribeParameters", "Resource": "*" } ] }
  10. [Review policy]를 선택합니다.

  11. Review policy(정책 검토) 페이지에서 Name(이름)에 인라인 정책 이름을 입력합니다(예: amiParameter)

  12. 정책 생성을 선택합니다.

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

  14. Choose the service that will use this role(이 역할을 사용할 서비스 선택)에서 즉시 Lambda를 선택한 후 다음: 권한을 선택합니다.

  15. Attach permissions policies(권한 정책 연결) 페이지의 Search(검색) 필드를 사용하여 앞서 만든 두 정책을 찾습니다.

  16. 정책 옆 확인란을 선택한 다음 Next: Tags(다음: 태그)를 선택합니다.

  17. (선택 사항) 이 역할에 대해 구성, 추적 또는 액세스를 제어할 태그 키-값 페어를 하나 이상 추가한 후 Next: Review(다음: 검토)를 선택합니다.

  18. 역할 이름에 새 역할의 이름(예: lambda-ssm-role 또는 다른 선호 이름)을 입력합니다.

    참고

    다양한 주체가 역할을 참조할 수 있기 때문에 역할이 생성된 후에는 역할 이름을 변경할 수 없습니다.

  19. 역할 생성을 선택합니다.

작업 3: AWS Lambda 함수 생성

다음 절차를 사용하여 latestAmi 파라미터의 값을 자동으로 업데이트하는 Lambda 함수를 만듭니다.

Lambda 함수를 만들려면

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

  2. [Create function]을 선택합니다.

  3. [Create function] 페이지에서 [Author from scratch]를 선택합니다.

  4. 함수 이름Automation-UpdateSsmParam을 입력합니다.

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

  6. 권한 섹션에서 Choose or create an execution role(실행 역할 선택 또는 생성)을 확장합니다.

  7. Use an existing role(기존 역할 사용)을 선택하고 작업 2에서 생성한 Lambda에 대한 서비스 역할을 선택합니다.

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

  9. Function code(함수 코드) 영역의 lambda_function 탭에서 필드에 미리 채워진 코드를 삭제하고 다음 코드 샘플을 붙여 넣습니다.

    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 ) reponseString = 'Updated parameter %s with value %s.' % (event['parameterName'], event['parameterValue']) return reponseString
  10. Save를 선택합니다.

  11. Lambda 함수를 테스트하려면 Select a test event(테스트 이벤트 선택) 메뉴에서 테스트 이벤트 구성을 선택합니다.

  12. 이벤트 이름에 테스트 이벤트의 이름을 입력합니다(예: MyTestEvent).

  13. 기존 텍스트를 다음 JSON으로 바꿉니다. your-ami-idlatestAmi 파라미터 값으로 설정할 새 AMI의 ID로 바꿉니다.

    { "parameterName":"latestAmi", "parameterValue":"your-ami-id" }
  14. Create를 선택합니다.

  15. 함수를 테스트하려면 테스트를 선택합니다. 출력에는 파라미터가 성공적으로 업데이트되었다는 내용과 업데이트에 대한 세부 정보가 포함되어야 합니다. 예를 들면, "ami-123456 값으로 latestAmi 파라미터를 업데이트했습니다"라는 내용이 표시될 수 있습니다.

작업 4: Automation 문서 생성 및 AMI에 패치 적용

다음 절차를 사용하여 latestAmi 파라미터에 지정한 AMI에 패치를 적용하는 자동화 문서를 만들고 실행합니다. 자동화 워크플로가 완료되면 latestAmi 값이 새 패치가 적용된 AMI의 ID로 업데이트됩니다. 이후 실행은 이전 실행에서 생성된 AMI를 사용합니다.

자동화 문서를 생성하고 AMI에 패치를 적용하는 방법

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

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

    -또는-

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

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

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

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

  6. 문서 편집기 필드의 기본 콘텐츠를 다음 JSON 샘플 문서로 바꿉니다.

    참고

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

    { "description":"Systems Manager Automation Demo – Patch AMI and Update SSM Param", "schemaVersion":"0.3", "assumeRole":"the role ARN you created", "parameters":{ "sourceAMIid":{ "type":"String", "description":"AMI to patch", "default":"{{ssm:latestAmi}}" }, "targetAMIname":{ "type":"String", "description":"Name of new AMI", "default":"patchedAMI-{{global:DATE_TIME}}" } }, "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 IAM role you created" } }, { "name":"installMissingWindowsUpdates", "action":"aws:runCommand", "maxAttempts":1, "onFailure":"Continue", "inputs":{ "DocumentName":"AWS-InstallWindowsUpdates", "InstanceIds":[ "{{ startInstances.InstanceIds }}" ], "Parameters":{ "SeverityLevels":"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":"updateSsmParam", "action":"aws:invokeLambdaFunction", "timeoutSeconds":1200, "maxAttempts":1, "onFailure":"Abort", "inputs":{ "FunctionName":"Automation-UpdateSsmParam", "Payload":"{\"parameterName\":\"latestAmi\", \"parameterValue\":\"{{createImage.ImageId}}\"}" } } ], "outputs":[ "createImage.ImageId" ] }
  7. Create automation(자동화 생성)을 선택하여 문서를 저장합니다.

  8. 탐색 창에서 자동화를 선택한 후 자동화 실행을 선택합니다.

  9. Choose document(문서 선택) 페이지에서 내 소유 탭을 선택한 다음 UpdateMyLatestWindowsAmi 카드에서 버튼을 선택합니다.

  10. 문서 세부 정보 섹션에서 문서 버전1(기본값)로 설정되어 있는지 확인합니다.

  11. [Next]를 선택합니다.

  12. Simple execution(단순 실행)을 선택합니다.

  13. 실행을 선택합니다.

  14. 실행이 완료된 후 탐색 창에서 Parameter Store를 선택하고 latestAmi의 새 값이 자동화 워크플로우에서 반환된 값과 일치하는지 확인합니다. 새 AMI ID가 Amazon EC2 콘솔의 AMI 섹션에 있는 자동화 출력과 일치하는지도 확인할 수도 있습니다.