Ansible로 AWS EC2 컨트롤하기

Ansible은 왜 사용할까?

Ansible은 ssh를 이용하는 프로비저닝 자동화 도구입니다. Ansible은 ssh 접속을 통해 수십대, 수백대의 원격 서버에 접속해서 동일한 프로비저닝 작업을 동시에 수행할 수 있는 훌륭한 도구입니다. Ansible의 대표적인 장점이라면 아래와 같이 꼽을 수 있을 것 같습니다.

  • 에이전트가 필요 없음
  • yaml 언어로 쉽게 작성할 수 있는 플레이북
  • python으로 개발됨

Ansible은 원격 서버에 에이전트를 설치하지 않아도 Ansible에서 제공하는 기본 모듈만으로 정말 많은 작업을 수행할 수 있습니다. 그리고 비교적 쉬운 yaml 언어를 사용하기 때문에 Puppet과 같은 다른 도구에 비해 접근성이 매우 높습니다. 또한 python으로 개발되어 있기 때문에 만약 모듈을 직접 만들어서 사용하고 싶을 경우 python으로 쉽게 개발할 수 있는 것도 큰 장점이라고 할 수 있습니다.

인프라 관리에 필수적인 도구로 자리 잡은 Ansible, 그리고 클라우드 서비스의 대표 주자인 AWS가 만나면 어떻게 될까요? 

오늘 글에서는 인프라 관리에서 필수적인 도구로 자리 잡은 Ansible을 통해, 인프라 자원의 핵심인 AWS의 EC2를 관리할 수 있는 방법에 대해서 알아보겠습니다.

ec2_instance 모듈 사용하기

ec2_instance 모듈은 Ansible에서 기본으로 제공하는 amazon.aws 컬렉션 중의 하나로 ansible-galaxy collection list 명령어를 입력하여 확인해볼 수 있습니다. 혹시 별도로 설치해야 할 경우 ansible-galaxy collection install amazon.aws 명령어를 실행하면 됩니다.

이 모듈을 이용하면 EC2 인스턴스를 생성하고 관리할 수 있습니다. 이 모듈을 사용하려면 Ansible을 수행하는 작업 서버에 아래와 같이 설치되어 있어야 합니다.

  • python >= 3.6 
  • boto3 >= 1.15.0 
  • botocore >= 1.18.0 

환경변수를 가져오는 방식

AWS의 자원을 사용하기 위해서는 액세스 키가 필요합니다. 이러한 액세스 키는 외부에 노출되면 안 되기 때문에 보통은 환경변수로 저장하여 사용합니다. Ansible의 aws 모듈도 특별히 키를 지정하지 않을 경우 환경변수에서 해당 정보를 가져오게 되어 있습니다.

cli나 yaml 파일에 변수를 특별히 지정하지 않을 경우 aws 모듈에서 가져오는 환경변수는 아래와 같습니다.

  • AWS_URL, EC2_URL
  • AWS_PROFILE, AWS_DEFAULT_PROFILE
  • AWS_ACCESS_KEY_ID, AWS_ACCESS_KEY, EC2_ACCESS_KEY
  • AWS_SECRET_ACCESS_KEY, AWS_SECRET_KEY, EC2_SECRET_KEY
  • AWS_SECURITY_TOKEN, EC2_SECURITY_TOKEN
  • AWS_REGION, EC2_REGION
  • AWS_CA_BUNDLE

만약 환경변수에 위와 같은 변수들이 정의되어 있지 않을 경우 아래 경로에 저장되어 있는 AWS SDK 구성 파일에도 접근합니다.

  • ~/.aws/credentials

EC2 컨트롤을 위한 플레이북 작성

그럼 이제 실제 운영 환경에서 사용할 수 있는 예를 통해 Ansible의 ec2_instance 모듈을 사용하는 방법을 알아보겠습니다.

아래 예를 먼저 살펴보겠습니다.

- name: 인스턴스 id로 인스턴스 재시작하기
  amazon.aws.ec2_instance:
    state: started
    instance_ids:
      - i-12345678
      - i-12345679
    filters:
      instance-state-name: stopped

위의 예제는 특정 인스턴스를 지정하여 인스턴스를 스타트해주는 yaml 플레이북입니다. 위의 플레이북이 수행되는 원리를 아래와 같이 표현해보면 플레이북을 이해하는 데 도움이 될 수 있을 것 같습니다.

  1. 인스턴스 id가  ‘i-12345678’, ‘i-12345679’인 인스턴스 중에서
  2. ‘instance-state-name’이 ‘stopped’인 인스턴스를 선택하여
  3. 인스턴스의 ‘state’를 ‘started’로 변경

타겟 인스턴스 지정하기

예제에서는 두 가지 방법을 통해 어떤 인스턴스를 컨트롤할 건지 지정해줬습니다. 첫 번째는 인스턴스 id를 통해, 두 번째는 instance-state-name: stopped 필터링을 통해서입니다.

이와 같이 타겟이 되는 인스턴스를 선택하는 방법으로는 id를 지정하는 방법과 filters 변수를 사용하여 다양한 인스턴스 상태와 정보로 필터링을 하는 방법이 있습니다. 어떠한 상태와 정보를 필터링 조건으로 사용할 수 있는지는 아래 링크에서 확인할 수 있습니다.

인스턴스 상태 변경하기

인스턴스의 작동 상태는 state: started 라인을 추가하여 수행해주었습니다. ec2_instance 모듈을 이용하여 변경할 수 있는 인스턴스의 작동 상태는 아래와 같습니다.

  • state=present
    • 인스턴스가 존재하는지 확인하며, 인스턴스의 상태를 변경하지는 않는다.
  • state=running
    • state=present 기능 + 인스턴스를 running 상태로 변경한다.
  • state=started
    • state=present 기능 + wait=true 조건이 있을 경우 상태 체크가 ok 될 때까지 기다린다.
  • state=stopped
    • 인스턴스를 stopped 상태로 변경한다.
  • state=rebooted
    • 인스턴스를 stopped 상태로 변경 후 즉시 running 상태로 변경한다.
  • state=restarted
    • 인스턴스를 stopped 상태로 변경 후 즉시 started 상태로 변경한다.
  • state=terminated
    • 인스턴스를 terminated 상태로 변경한다.
  • state=absent
    • state=terminated와 동일한 기능을 한다.

마치며

오늘은 간단한 예제를 통해 EC2 인스턴스를 컨트롤하는 방법을 알아봤습니다. 이 모듈을 사용하면 인스턴스 상태 변경 뿐만 아니라 공인 ip 할당, EBS 추가, cpu 옵션 지정 등 상황에 따라 다양한 활용이 가능합니다. 본 모듈 관련 Ansible 공식 문서를 보시면 더 많은 예제를 확인할 수 있습니다.

Leave a Comment