Heroku Private Space 혹은 Heroku Shield Private Space에 애드온으로 설치된 Heroku Kafka는 별도의 설정 없이는 외부 네트워크에서 연결할 수 없는데, 외부에서 Kafka로의 연결이 필요하여 방법을 찾아보게 되었다.
설정환경
Heroku Private Space
Heroku Kafka (Private Standard 1)
Private Space의 Trusted IP Range를 활용하는 방법도 있으나, mTLS(Mutual TLS)를 적용할 경우 외부에서 Space의 다른 서비스에는 접근 못하고 Kafka에만 접근 가능하도록 설정할 수 있다고 한다. (심지어 Shield Private Space는 Trusted IP 등록이 아예 불가능하다!)
Heroku Dev Center의 글을 참고하였다.
mTLS을 Heroku Kafka에 적용하기 위해서는 다음과 같은 제약조건이 있다.
- Private Space 혹은 Shield Private Space
- Private 혹은 Shield Apache Kafka 애드온이 설치된 Space 내부의 Heroku App
Heroku CLI에 mTLS CLI 플러그인을 설치한다. Heroku CLI가 설치 안된 경우, 해당 링크를 참고하여 설치하자.
heroku plugins:install mtls
Kafka Cluster마다 60개의 ip block을 등록 가능하다. 허용하려는 외부 ip를 CLI 명령어를 사용하여 등록한다.
heroku data:mtls:ip-rules:create 카프카_애드온_이름 --app 앱_이름 \
--cidr "CIDR 블록" \
--description "설명"
CIDR 블록에 대해서는 해당 링크에서 더 자세히 확인할 수 있으며, CIDR 계산기를 사용하면 편하게 블록을 계산할 수 있다.
카프카 애드온 이름은 애드온 생성 시에 자동으로 부여되는 값(kafka-apple-1231와 같은)을 입력하면 되고, 앱 이름은 본인이 생성한 앱의 이름(앞에 입력한 kafka 애드온이 설치된 앱이어야 한다)을 입력하자.
필요한 정보를 입력하고 커맨드를 실행하면 아래와 같은 결과를 확인할 수 있다.
아래 커맨드를 사용하여 등록된 mTLS 규칙을 조회할 수 있으며,
heroku data:mtls:ip-rules 카프카_애드온_이름 --app 앱_이름
잘못 생성했거나 규칙을 삭제하고 싶은 경우 아래 커맨드로 규칙을 삭제할 수 있다.
heroku data:mtls:ip-rules:delete 카프카_애드온_이름 --id "규칙 ID 값" --app 앱_이름
등록 후 적용까지는 10~15분 정도 소요된다고 한다.
Private Space VPN을 사용한 내부 연결을 기대했는데 외부망을 거치는 것은 아쉽다곤 생각하지만.. 개수 제한이 있는 Trusted IP Range 설정과 별도로 외부 연결을 허용할 수 있다는 것은 큰 이점이라고 생각된다.