Terraform과 Ansible로 AWS에 Pulsar 클러스터 배포하기

Terraform과 Ansible로 AWS에 Pulsar 클러스터 배포하기

AWS에서 Pulsar 클러스터를 띄우는 가장 쉬운 방법 중 하나는 Terraform과 Ansible을 함께 쓰는 거예요. Terraform이 EC2 인스턴스와 네트워킹 같은 AWS 리소스를 만들고, Ansible이 그 위에 Pulsar를 설치·실행하죠. 이 글에서는 사전 준비부터 SSH 설정, Terraform 리소스 생성, Ansible 플레이북 실행, 클러스터 접근까지 전체 흐름을 단계별로 안내해 드릴게요.

출처: 문서

본문

Terraform과 Ansible을 사용하지 않고 단일 Pulsar 클러스터를 수동으로 배포하는 방법은 바메탈에 Pulsar 클러스터 배포를 보세요. 다중 클러스터 Pulsar 인스턴스를 수동으로 배포하는 방법은 바메탈에 Pulsar 인스턴스 배포를 보세요.

Amazon Web Services(AWS)에서 Pulsar 클러스터를 실행하는 가장 쉬운 방법 중 하나는 Terraform 인프라 프로비저닝 도구와 Ansible 서버 자동화 도구를 사용하는 거예요. Terraform은 Pulsar 클러스터를 실행하는 데 필요한 리소스(EC2 인스턴스, 네트워킹 및 보안 인프라 등)를 만들 수 있고, Ansible은 프로비저닝된 리소스에 Pulsar를 설치하고 실행할 수 있어요.

AWS에 Pulsar 클러스터를 배포하려면 다음 단계를 완료하세요.

요구 사항 및 설정

Terraform과 Ansible을 사용해 AWS에 Pulsar 클러스터를 설치하려면 다음을 준비해야 해요:

  • AWS 계정과 aws 명령줄 도구
  • Python과 pip
  • Ansible이 Terraform 아티팩트를 사용할 수 있게 해주는 terraform-inventory 도구

또한 aws 도구로 현재 AWS 계정에 로그인되어 있는지 확인해야 해요:

aws configure

1단계: 설치

Linux나 macOS에서 pip로 Ansible을 설치할 수 있어요.

pip install ansible

Terraform은 여기의 지침에 따라 설치할 수 있어요.

또한 로컬 머신에 Pulsar용 Terraform과 Ansible 구성이 있어야 해요. 그것들은 Pulsar의 GitHub 저장소에서 찾을 수 있으며, Git 명령으로 받을 수 있어요:

git clone https://github.com/apache/pulsar
cd pulsar/deployment/terraform-ansible/aws

2단계: SSH 설정

이미 SSH 키가 있고 그 키를 사용하고 싶다면, SSH 키 생성 단계를 건너뛰고 ansible.cfg 파일의 private_key_file 설정과 terraform.tfvars 파일의 public_key_path 설정을 갱신할 수 있어요. 예를 들어 ~/.ssh/pulsar_aws에 개인 SSH 키가 있고 ~/.ssh/pulsar_aws.pub에 공개 키가 있다면 다음 단계를 따르세요:

  1. ansible.cfg를 다음 값으로 갱신해요:

private_key_file=~/.ssh/pulsar_aws

  1. terraform.tfvars를 다음 값으로 갱신해요:

public_key_path=~/.ssh/pulsar_aws.pub

Terraform으로 필요한 AWS 리소스를 만들려면 SSH 키를 만들어야 해요. 다음 명령을 입력해 ~/.ssh/id_rsa에 개인 SSH 키와 ~/.ssh/id_rsa.pub에 공개 키를 만들어요:

ssh-keygen -t rsa

반드시 비밀번호를 입력하지 마세요 (프롬프트가 나오면 Enter를 누르세요). 다음 명령으로 키가 생성됐는지 확인해요:

ls ~/.ssh
id_rsa               id_rsa.pub

3단계: Terraform으로 AWS 리소스 만들기

Terraform으로 AWS 리소스 구축을 시작하려면 모든 Terraform 의존성을 설치해야 해요. 다음 명령을 입력해요:

terraform init
# This will create a .terraform folder

그런 다음 기본 Terraform 구성에 이 명령을 적용할 수 있어요:

terraform apply

그러면 다음과 같은 프롬프트가 보여요:

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:

yes를 입력하고 Enter를 눌러요. 구성을 적용하는 데 몇 분이 걸릴 수 있어요. 구성 적용이 끝나면 생성된 리소스 수를 포함한 다른 정보와 함께 Apply complete!를 볼 수 있어요.

비기본 구성 적용

terraform.tfvars 파일의 값을 변경해 비기본 Terraform 구성을 적용할 수 있어요. 사용 가능한 변수는 다음과 같아요:

변수 이름 설명 기본값
public_key_path 생성한 공개 키의 경로 ~/.ssh/id_rsa.pub
region Pulsar 클러스터가 실행되는 AWS 리전 us-west-2
availability_zone Pulsar 클러스터가 실행되는 AWS 가용 영역 us-west-2a
aws_ami 클러스터가 사용하는 Amazon Machine Image (AMI) ami-9fa343e7
num_zookeeper_nodes ZooKeeper 클러스터의 ZooKeeper 노드 수 3
num_bookie_nodes 클러스터에서 실행되는 bookie 수 3
num_broker_nodes 클러스터에서 실행되는 Pulsar 브로커 수 2
num_proxy_nodes 클러스터에서 실행되는 Pulsar 프록시 수 1
base_cidr_block 클러스터의 네트워크 자산이 사용하는 루트 CIDR 10.0.0.0/16
instance_types 사용할 EC2 인스턴스 유형. 이 변수는 두 키를 가진 맵이에요: ZooKeeper 인스턴스용 zookeeper, BookKeeper bookies용 bookie, Pulsar 브로커·프록시용 brokerproxy t2.small (ZooKeeper), i3.xlarge (BookKeeper), c5.2xlarge (Brokers/Proxies)

참고 이 Terraform/Ansible 레시피는 ZooKeeper를 메타데이터 저장소로 프로비저닝해요. 새 클러스터에는 Oxia가 권장 메타데이터 저장소예요. Oxia 문서를 따라 별도로 배포하고, 메타데이터 저장소 구성에 설명된 대로 브로커와 bookie가 그 저장소를 가리키게 하세요.

설치되는 것

Ansible 플레이북을 실행하면 다음 AWS 리소스가 사용돼요:

  • Red Hat Enterprise Linux (RHEL) 7.4를 실행하는 ami-9fa343e7 Amazon Machine Image (AMI)에서 실행되는 총 9개의 Elastic Compute Cloud (EC2) 인스턴스. 기본적으로 다음을 포함해요: ZooKeeper용 소형 VM 3개(t3.small 인스턴스), BookKeeper bookies용 대형 VM 3개(i3.xlarge 인스턴스), Pulsar 브로커용 대형 VM 2개(c5.2xlarge 인스턴스), Pulsar 프록시용 대형 VM 1개(c5.2xlarge 인스턴스)
  • EC2 보안 그룹
  • 보안을 위한 가상 사설 클라우드 (VPC)
  • 외부 세계로부터의 연결을 위한 API Gateway
  • Pulsar 클러스터 VPC용 라우트 테이블
  • VPC용 서브넷

클러스터의 모든 EC2 인스턴스는 us-west-2 리전에서 실행돼요.

Pulsar 연결 URL 가져오기

명령 terraform apply를 입력해 Terraform 구성을 적용하면 Terraform이 pulsar_service_url의 값을 출력해요. 그 값은 다음과 비슷해 보여요:

pulsar://pulsar-elb-1800761694.us-west-2.elb.amazonaws.com:6650

terraform output pulsar_service_url 명령을 입력하거나 terraform.tstate 파일(파일명이 그렇지 않아도 JSON이에요)을 파싱하면 언제든 그 값을 가져올 수 있어요:

cat terraform.tfstate | jq .modules[0].outputs.pulsar_service_url.value

클러스터 파괴

언제든 Terraform의 destroy 명령으로 클러스터와 연결된 모든 AWS 리소스를 파괴할 수 있어요:

terraform destroy

4단계: 디스크 설정

Pulsar 플레이북을 실행하기 전에 bookie 노드의 올바른 디렉터리에 디스크를 마운트해야 해요. 머신 유형마다 디스크 레이아웃이 다르므로, terraform 구성에서 instance_types를 변경한 후에는 setup-disk.yaml 파일에 정의된 작업을 갱신해야 해요.

bookie 노드에 디스크를 설정하려면 다음 명령을 입력해요:

ansible-playbook \
--user='ec2-user' \
--inventory=`which terraform-inventory` \
setup-disk.yaml

Terraform 0.12 이상 버전을 사용할 때 terraform-inventory가 "Error reading tfstate file" 오류를 던지면, ansible-playbook 명령 앞에 TF_STATE=./를 추가하세요.

TF_STATE=./ \
ansible-playbook \
--user='ec2-user' \
--inventory=`which terraform-inventory` \
setup-disk.yaml

그러면 디스크가 저널 디스크로 /mnt/journal에, ledger 디스크로 /mnt/storage에 마운트돼요. 이 명령을 딱 한 번만 실행해야 한다는 점을 기억하세요. Pulsar 플레이북을 실행한 후 이 명령을 다시 실행하면 디스크가 다시 지워져 bookies가 시작되지 못할 수 있어요.

5단계: Pulsar 플레이북 실행

Terraform으로 필요한 AWS 리소스를 만든 후에는 Ansible을 사용해 Terraform이 만든 EC2 인스턴스에 Pulsar를 설치하고 실행할 수 있어요.

(선택) 내장 IO 커넥터를 사용하고 싶다면, deploy-pulsar.yaml 파일의 Download Pulsar IO packages 작업을 편집해 사용하려는 커넥터의 주석을 해제하세요.

플레이북을 실행하려면 다음 명령을 입력해요:

ansible-playbook \
--user='ec2-user' \
--inventory=`which terraform-inventory` \
../deploy-pulsar.yaml

개인 SSH 키를 ~/.ssh/id_rsa가 아닌 다른 위치에 만들었다면, 다음 명령에서 --private-key 플래그로 다른 위치를 지정할 수 있어요:

ansible-playbook \
--user='ec2-user' \
--inventory=`which terraform-inventory` \
--private-key="~/.ssh/some-non-default-key" \
../deploy-pulsar.yaml

6단계: 클러스터 접근

이제 의 지침에 따라 얻은 클러스터 고유의 Pulsar 연결 URL로 실행 중인 Pulsar에 접근할 수 있어요.

클러스터 접근을 빠르게 시연하기 위해 Python용 Pulsar 클라이언트와 Python 셸을 사용해 볼게요. 먼저 pip로 Pulsar Python 모듈을 설치해요:

pip install pulsar-client

이제 python 명령으로 Python 셸을 열어요:

python

셸 안에서 다음 명령을 입력해요:

>>> import pulsar
>>> client = pulsar.Client('pulsar://pulsar-elb-1800761694.us-west-2.elb.amazonaws.com:6650')
# Make sure to use your connection URL
>>> producer = client.create_producer('persistent://public/default/test-topic')
>>> producer.send('Hello world')
>>> client.close()

이 모든 명령이 성공하면 이제 Pulsar 클라이언트가 여러분의 클러스터를 사용할 수 있어요!

더 알아보기 (Learn more)