ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Ansible] AWS EC2 인스턴스의 태그 일괄 관리하기
    개발자 라이프 2021. 11. 21. 22:55
    반응형

    들어가며

    AWS의 EC2는 태그 기능을 제공하며, 그것을 통해 그 인스턴스의 상태, 목적 등을 표현할 수 있습니다. 그래서 앤서블을 이용하여 EC2 인스턴스를 일괄적으로 관리할 때 태그 기능을 사용하면, 동작 목적에 따른 인스턴스들을 쉽게 분리할 수 있습니다. 

    이번 글은 앤서블의 AWS 컬렉션에 포함된 태그 관련 모듈을 이용하여 EC2 태그를 관리하는 방법과 스크립트를 구성할 때의 팁에 대해 알아봅니다.

    AWS EC2 인스턴스의 태그 일괄 관리하기

    태그 관리를 위한 환경 구성과 예제 살펴보기

    AWS는 앤서블 스크립트 내에서 AWS의 자원을 관리할 수 있도록 컬렉션을 제공하고 있습니다. 물론 앤서블 커뮤니티에서도 비슷한 기능을 하는 컬렉션을 제공하고 있지만, 이번 글에서 다루는 컬렉션은 AWS에서 관리하는 컬렉션을 사용합니다. 아래와 같이 requirements.yml 파일을 구성하고 ansible-galaxy 명령어로 컬렉션을 다운로드합니다. 

    # requirements.yml
    collections:
      - name: amazon.aws
      
    # 의존성 다운로드 명령어
    $ ansible-galaxy install -r requirements.yml

    컬렉션 다운로드가 완료되면 플레이북 혹은 롤의 태스크 내에서 사용할 수 있습니다. EC2 인스턴스의 태그 관리는 amazon.aws.ec2_tag 모듈을 이용하여 할 수 있습니다. 주요한 설정 파라미터는 아래와 같습니다.

    • region : EC2가 위치한 리전을 설정합니다.
    • resource : EC2의 인스턴스의 아이디를 지정합니다.
    • tags : 관리할 태그의 키와 값 페어를 설정합니다.
    • state : tags에 설정된 태그의 상태(생성/삭제)를 설정합니다.

    위 설정 값을 이용한 예제 태스크는 아래와 같습니다.

    - name: 하나 이상의 태그를 생성(혹은 수정)합니다.
      amazon.aws.ec2_tag:
        region: eu-west-1
        resource: i-xxxxxxxxxxxxxxxxx
        tags:
          Name: ubervol
          env: prod
        state: present
    
    - name: Env 태그를 삭제합니다.
      amazon.aws.ec2_tag:
        region: eu-west-1
        resource: i-xxxxxxxxxxxxxxxxx
        tags:
          Env:
        state: absent
    
    - name: Env 태그가 'development'인 태그를 삭제합니다.
      amazon.aws.ec2_tag:
        region: eu-west-1
        resource: i-xxxxxxxxxxxxxxxxx
        tags:
          Env: development
        state: absent

    첫 번째 예제는 state 속성이 present 값을 가짐으로써 특정 인스턴스에 설정된 태그가 존재하도록 설정합니다. 이로 인해 없었던 태그가 생성되거나, 같은 키로 설정되어 있던 태그 값이 변경될 수 있습니다. 그리고 두, 세 번째 예제와 같이 state 설정이 absent로 설정된다면 대상이 되는 태그를 제거합니다.

    태그 관리 스크립트 작성을 위한 팁 알아보기

    EC2 인스턴스의 아이디 정보 확인하기

    태그를 관리하기 위해선 resource 속성에 인스턴스의 아이디를 입력해줘야 합니다. 하지만 앤서블을 실행하는 컨트롤러 노드가 해당 정보를 모두 코드로써 관리할 수 없습니다. 따라서 매니지드 노드가 스스로 어떤 인스턴스인지 메타데이터 정보를 구성할 수 있도록 해야 합니다. 이를 위해 amazon.aws 컬렉션에서 ec2_metadata_facts 모듈을 제공하고 있습니다. 아래와 같이 task 단계에서 모듈을 호출하면 각각의 매니지드 노드의 메타데이터가 로드되고, 다양한 변수를 호출하여 사용할 수 있습니다. 

    # 메타데이터 로드
    - amazon.aws.ec2_metadata_facts: 
    
    # resource 속성에서 메타데이터 변수 중 하나인 ansible_ec2_instance_id를 호출하여 사용합니다.
    - name: 하나 이상의 태그를 생성(혹은 수정)합니다.
      amazon.aws.ec2_tag:
        region: eu-west-1
        resource: "{{ ansible_ec2_instance_id }}"
        tags:
          Name: ubervol
          env: prod
        state: present

    동적인 키에 대한 태그 정보 관리하기

    태그 관리를 위한 스크립트를 작성하다보면 동적인 키로 구성된 태그 페어를 관리해야 할 수 있습니다. 예를 들어, 재사용성을 고려한 롤을 구성할 때, 입력 파라미터에 따른 태그 키가 변경되어야 하는 상황이 있습니다. 하지만 앤서블의 yml 문법에선 키에 변수를 입력할 수 없습니다. 따라서 동적인 키를 관리하기 위해선 동적인 키에 대한 변수를 한번 선언해서 사용해야 합니다. 아래와 같이 json 형태의 문자열로 태그의 키, 값 페어를 변수로 구성합니다. 그리고 tags 속성에 값으로 설정함으로써 동적인 키에 대한 태그를 관리할 수 있습니다.

    - name: 동적 키에 대한 태그를 변수로 설정합니다.
      set_fact:
        tagging_fact: "{'{{ tagging_key }}': '{{ tagging_value }}'}"
        
    - name: 동적으로 생성된 태크 페어를 생성합니다.
      amazon.aws.ec2_tag:
        region: eu-west-1
        resource: i-xxxxxxxxxxxxxxxxx
        tags: "{{ tagging_fact }}"
        state: present

    매니지드 노드에 불필요한 환경 설정 피하기

    앤서블은 구성된 스크립트를 기반으로 컨트롤러 노드가 매니지드 노드에 원격으로 실행을 요청하는 구조입니다. 그런데 태그 관리를 위한 모듈 실행에는 아래와 같은 환경 설정이 필요합니다.

    • 파이썬 3.6 이상
    • boto3 설치
    • 태그 관리를 위한 권한

    하지만 매니지드 노드에 위 환경을 구성하기 위해선 추가적인 노력이 필요합니다. 또한 권한의 경우 매니지드 노드가 불필요한 권한을 가지므로, 이는 보안상 위험을 초래할 수 있습니다. 따라서 매니지드 노드의 불필요한 환경 설정을 피하기 위해 delegate_to 모듈을 사용합니다. 

    delegate_to 모듈은 특정 호스트를 지정하여 작업 처리를 위임하는 모듈입니다. 따라서 아래와 같이 구성하면, 컨트롤러 노드가 매니지드 노드가 아닌 스스로에게 작업을 위임하여 동작합니다.

    - name: 하나 이상의 태그를 생성(혹은 수정)합니다.
      amazon.aws.ec2_tag:
        region: eu-west-1
        resource: i-xxxxxxxxxxxxxxxxx
        tags:
          Name: ubervol
          env: prod
        state: present
        delegate_to: 127.0.0.1    # <- 컨트롤러 노드에서 작업하도록 설정합니다.

    이렇게 컨트롤러 노드가 스스로에게 작업을 위임하면, 작업을 위한 의존성과 권한을 한 곳에서 관리할 수 있는 이점이 있습니다. 

    delegate_to 모듈을 사용하지 않았을 때(좌)와 사용했을 때(우)의 작업 처리 차이

    마무리

    이번 글을 통해서 amazon.aws 컬렉션의 태그 모듈과 관련된 스크립트를 작성할 때 미리 알아두면 좋은 팁을 알아봤습니다. AWS의 태그는 리소스를 운영, 관리하는 과정에서 다양한 이점을 줍니다. 그렇기에 관련된 작업을 하시는 분들에게 많은 도움이 되었으면 좋겠습니다.

    참고

     

    GitHub - ansible-collections/amazon.aws: Ansible Collection for Amazon AWS

    Ansible Collection for Amazon AWS. Contribute to ansible-collections/amazon.aws development by creating an account on GitHub.

    github.com

     

    반응형

    댓글

Designed by Tistory.