Amazon Web Services 한국 블로그

AWS Systems Manager 신규 자동화 기능 출시 (서울 리전 포함)

AWS Systems Manager의 여러 AWS 서비스의 운영 데이터를 보고 AWS 리소스 전체의 운영 작업을 자동화할 수 있는 통합 사용자 인터페이스를 제공하는 서비스입니다. 클라우드 자원을 자동으로 생성 및 실행하고 팀 또는 조직 내부의 다른 사용자와 공유할 수 있는 새로운 자동화 기능이 추가됨에 따라 반복 가능하고 오류를 줄이는 방법으로 인프라를 관리할 수 있게 되었습니다.

AWS Systems Manager 콘솔 안의 탐색 메뉴를 보면 [Automation]이라는 이름의 항목이 있습니다. 이 메뉴 항목을 클릭하면 [Execute automation] 버튼이 표시됩니다.

이 버튼을 클릭하면 실행할 문서를 묻는 메시지가 표시됩니다. AWS가 제공하는 문서 라이브러리에서 문서를 선택할 수도 있지만 지금은 자체 문서를 작성할 것이므로 [Create document] 버튼을 클릭합니다.

그러면 새 화면으로 이동합니다. 이 화면에서 Python 또는 PowerShell 스크립트를 실행하는 문서(자동화 플레이북이라고도 함)를 생성할 수 있습니다.

콘솔에서 문서 편집에 사용할 수 있는 옵션은 두 가지입니다. YAML 편집기 또는 “빌더”인데 빌더는 각 워크플로 단계에 대한 설명서를 포함할 수 있는 가이드 방식의 단계별 사용자 인터페이스를 제공합니다.

단순한 자동화를 빌드하고 실행해 보겠습니다. 빌더 도구를 사용하여 문서를 생성할 때 필요한 첫 번째 요소는 문서 이름입니다.

다음으로 설명을 제공해야 합니다. 아래에 표시된 것과 같이 Markdown을 사용하여 설명 형식을 지정할 수 있습니다. 설명은 문서의 기능을 설명하기에 아주 좋은 기회입니다. 대부분의 사용자가 이러한 문서를 팀의 다른 사용자와 공유하고 문서 라이브러리를 빌드하여 일상적인 문제를 해결하려고 하므로 설명을 포함하는 것이 좋습니다.

필요한 경우 문서에 대한 파라미터를 제공할 수 있습니다. 나중에 생성할 모든 스크립트에서 이러한 파라미터를 사용할 수 있습니다. 이 예에서는 imageId, tagValueinstanceType의 3가지 파라미터를 생성했습니다. 이 문서를 실행할 때 이러한 파라미터에 대한 값을 제공하여 기존에 설정한 모든 기본값을 재정의할 수 있습니다.

다른 사람이 내 문서를 실행하면 스크립트가 실행되고 이러한 스크립트가 AWS 서비스와 상호 작용합니다. 대부분의 문서 작업은 사용자 권한으로 실행되며 필요에 따라 Assume 역할을 제공할 수 있습니다. 그러나 [Run a Script] 작업이 포함된 문서의 경우 스크립트에서 AWS API를 호출하려면 이 역할이 필요합니다.

빌더 도구에서 Assume 역할을 글로벌로 설정할 수 있지만 저는 assumeRole이라고 하는 파라미터를 문서에 추가하겠습니다. 이렇게 하면 이 문서를 실행하는 모든 사용자가 다른 역할을 제공할 수 있게 됩니다.

그런 다음 Assume 역할 속성 텍스트 상자에서 {{assumeRole}} 구문을 사용하여 이 파라미터를 글로벌 assumeRole에 연결합니다. 저는 파라미터 이름을 assumeRole로 지정했지만 원하는 이름을 지정할 수 있습니다. 이중 대괄호 안에 이름을 지정하면 됩니다(예: {{yourParamName}}).

문서가 설정되면 문서의 첫 번째 단계를 생성해야 합니다. 문서에는 1개 이상의 단계가 포함될 수 있습니다. 브랜치를 사용하면 파라미터 또는 단계 실패와 같은 것을 기준으로 정교한 워크플로를 생성할 수 있습니다. 이 예에서는 차례대로 실행되는 단계 3개를 생성하겠습니다. 여기서도 단계 이름 및 설명을 지정해야 합니다. 이 설명에도 Markdown을 포함할 수 있습니다. [Action Type]을 선택해야 하는데 이 예에서는 [Run a script]를 선택하겠습니다.

[Run a script] 작업 유형을 선택하는 경우 스크립트 실행을 위한 인프라 없이 Python 또는 PowerShell에서 스크립트를 실행할 수 있습니다. 이 스크립트는 EC2 인스턴스에서 실행되지 않는다는 점을 기억하시기 바랍니다. 이 스크립트는 관리형 컴퓨팅 환경에서 실행됩니다. 기본 설정 페이지에서 Amazon CloudWatch 로그 그룹을 구성하여 원하는 CloudWatch 로그 그룹으로 출력을 전송할 수 있습니다.

이 데모에서는 EC2 인스턴스를 생성하는 Python을 작성합니다. 이 스크립트에는 AWS SDK for Python이 사용됩니다. 파라미터 형식으로 스크립트로 전달되는 image_id, tag_valueinstance_type을 기반으로 인스턴스를 생성합니다.

파라미터를 스크립트로 전달하려면 [Additional Inputs] 섹션에서 InputPayload를 입력 유형으로 선택합니다. 그런 다음 [Input Value] 텍스트 상자에서 특정 YAML 형식을 사용하여 글로벌 파라미터를 스크립트에서 사용할 파라미터에 연결합니다. 보시다시피 이중 괄호 구문을 사용하여 글로벌 파라미터를 참조했습니다(예: {{imageId}}).

또한 [Outputs] 섹션에서 후속 단계에서 사용할 수 있는 출력 파라미터를 연결합니다.

다음으로 두 번째 단계를 문서에 추가하겠습니다. 이번에는 인스턴스를 폴링해 상태가 [ok]로 전환되었는지 확인하겠습니다. 이 코드에서 흥미로운 부분은 InstanceId인데, 이전 단계에서 스크립트로 전달되었습니다. 다음 예제는 실행 단계를 체인으로 연결하여 이전 단계의 출력을 사용하는 방법을 보여줍니다.

def poll_instance(events, context):
    import boto3
    import time

    ec2 = boto3.client('ec2')

    instance_id = events['InstanceId']

    print('[INFO] Waiting for instance to enter Status: Ok', instance_id)

    instance_status = "null"

    while True:
    res = ec2.describe_instance_status(InstanceIds=[instance_id])

    if len(res['InstanceStatuses']) == 0:
        print("Instance Status Info is not available yet")
        time.sleep(5)
        continue

    instance_status = res['InstanceStatuses'][0]['InstanceStatus']['Status']

    print('[INFO] Polling get status of the instance', instance_status)

    if instance_status == 'ok':
        break

    time.sleep(10)

    return {'Status': instance_status, 'InstanceId': instance_id}

파라미터를 두 번째 단계로 전달하기 위해 이중 괄호 구문을 사용하여 이전 단계의 출력을 참조한 것을 알 수 있습니다. [Input value] 텍스트 상자의 값인 {{launchEc2Instance.payload}}launchEc2Instance 단계의 이름과 payload 출력 파라미터의 이름입니다.

마지막으로 최종 단계를 추가하겠습니다. 이 단계는 PowerShell 스크립트를 실행하고 AWS Tools for PowerShell을 사용합니다. 이 단계는 순수하게 Python 대신 PowerShell을 사용할 수 있다는 것을 보여줄 목적으로 추가되었습니다.

첫 번째 줄을 보면 AWS 서비스와의 상호 작용을 시작하기 전에 AWSPowerShell.NetCore 모듈을 설치하고 -Force 스위치를 사용해야 한다는 것을 알 수 있습니다.

이 모든 단계가 수행하는 작업은 LaunchEc2Instance 단계에서 InstanceId 출력을 가져오고 이 출력을 사용하여 ECS 인스턴스의 InstanceType을 반환하는 것입니다.

여기서 주목할 점은 [Additional inputs]를 구성하여 LaunchEc2Instance 단계의 파라미터를 이 단계로 전달해야 한다는 것입니다.

이제 문서가 생성되었으니 실행할 수 있습니다. 메뉴의 [Actions & Change] 섹션으로 이동하고 [Automation]을 선택합니다. 이 화면에서 [Execute automation] 버튼을 클릭합니다. 그런 다음 실행하려는 문서를 선택합니다. 기존에 생성한 문서이므로 [Owned by me] 탭에서 찾을 수 있습니다.

이전에 생성한 LaunchInstance 문서를 클릭하면 문서 세부 정보 화면에 아까 추가한 설명이 표시됩니다. 적절한 형식으로 작성된 이 설명을 사용하여 문서에 대한 설명서를 생성하고 다른 사용자에게 문서의 목적을 알려줄 수 있습니다.

[Next]를 클릭하면 문서에 대한 입력 파라미터를 제공하는 화면이 표시됩니다. 이 자동화를 실행할 때 사용할 역할에 대한 imageId와 ARN을 추가합니다. 이 역할에는 스크립트가 요청하는 모든 서비스를 호출할 수 있는 권한이 있어야 합니다. 이 예에서는 EC2 인스턴스를 생성할 수 있는 권한이 있어야 함을 의미합니다.

문서가 실행되면 문서 단계와 각 단계의 소요 시간 및 성공 또는 실패에 관한 세부 정보가 표시되는 화면으로 이동합니다. 각 단계로 드릴다운하고 로그를 검사할 수도 있습니다. 보시다시피 문서의 3개 단계가 모두 성공적으로 완료되었습니다. Amazon Elastic Compute Cloud(EC2) 콘솔로 이동하면 LaunchedBySsmAutomation 태그를 사용하여 생성한 EC2 인스턴스가 표시됩니다.

오늘부터 모든 리전에서 AWS Systems Manager 콘솔을 통해 이 새로운 기능을 사용할 수 있으니 지금 바로 사용해 보십시오.

— Martin;