EMD Blog

Cloud Function을 배포하고 Pub/Sub으로 호출했을때 Push 안되는 이슈 본문

Public Cloud/GCP

Cloud Function을 배포하고 Pub/Sub으로 호출했을때 Push 안되는 이슈

EmaDam 2022. 9. 4. 07:37

Cloud Function을 HTTP 트리거로 생성함. 구독의 서비스 계정에는 해당 함수에 대한 호출자 역할을 부여하였으며 인증을 위해 서비스 계정 토큰 생성자 역할을 부여하였음. Cloud Function은 외부 호출을 허용 해놓은 상태. Publish하면 구독이 메세지를 받아오긴 하나 Push가 되지 않음. Cloud Logging으로 쿼리해보았지만 나오는 로그도 없음. 일단 문서 추가로 확인해보고 케이스에 등록할 예정.

도저히 모르겠음. 해당 내용 케이스로 등록함.

================== 케이스 등록 내용 =================

Cloud Function을 HTTP 트리거로 배포해 Pub/Sub으로 호출하려 합니다. 현재 아래처럼 구성하였습니다.

Cloud Function
- HTTP 트리거
- 인증 필요
- HTTPS 필요
- 모든 트래픽 허용

Pub/sub
- Push 구성
- 위에서 생성된 엔드포인트 적용
- 서비스 계정에 roles/cloudfunctions.invoker, roles/iam.serviceAccountTokenCreator 역할 부여

확인된 사항
- Cloud Functions에서 제공하는 테스트 수행 -> 배포된 코드는 정상
- 본인계정으로 직접 함수 호출 -> 정상적으로 호출됨
- 메세지를 게시하면 구독에서 잘 받음.(Push만 실패) -> 구독 정상

구독에서 Push에 실패하는데 Cloud Function이나 구독이나 둘 다 로그 확인이 되지 않아 원인을 찾기가 힘든 상황입니다.
혹시 따로 로그를 확인하거나 Push에 대한 응답을 확인할 수 있는 방법이 있을까요?

-----------

추가로 확인된 부분이 있어 코멘트 남깁니다.
인증을 사용하지 않는 함수는 Pub/Sub으로도 호출이 잘되는 것을 확인했습니다. 
그러면 인증이 문제인가 싶어서 해당 서비스 계정으로 로컬에서 테스트 해보았더니 호출이 잘됩니다. (인증 문제는 아닌듯 합니다.)

관련 정보 이미지로 첨부 드리오니 참고바랍니다.
(이미지는 회사 관련 정보가 포함되어있어 생략)

생각해보니 Cloud Function은 이벤트 트리거 방식으로 Pub/Sub과의 연계를 지원해주고 있기 때문에 굳이 구독 Push에서 인증 토큰을 만들어줘야 할 이유는 없어보임.(Push가 Cloud Functions만을 위한 것은 아니므로) 만약에 이런 문제가 맞다면 네이밍을 포기하고 이벤트 트리거를 사용하던가 인증을 대신할 다른 방법을 찾던가 해야함.

GCP에서 Push 했을 때 ack에 실패해서 무한 재시도로 인해 정체된 것으로 보인다는 답변을 받음. 일단 지금은 정상적으로 호출됨을 확인함. 하지만 의문이 드는 것이 몇 가지 있는데

  1. 구독 별로 별도의 큐를 가지고 있을 텐데 왜 인증되지 않은 함수 3개 전체가 먹통이였는지? 그 와중에 인증을 필요로 하지않는 함수만 호출된 이유는? 함수 소스코드 문제는 아닌 것이 함수 3개 중 2개는 함수 생성 시 기본으로 제공해주는 hello world 출력 소스코드 였음. 문제가 발생할 이유가 없었으며 테스트 시에도 정상이였음. → 테스트 필요
  2. Cloud Function를 인증 호출할 시 반드시 인증 토큰이 필요한 것으로 알고 있음. 그런데 구독의 엔드포인트 Push로 호출이 된다는 것은 내부적으로 토큰을 만드는 것인지? 아니면 다른 인증 방법이 존재하는 것인지? 만약에 토큰을 내부적으로 생성해서 요청한다면 이벤트 기반의 Pub/Sub트리거가 존재해야할 이유는 무엇인지? (이벤트 기반도 내부적으로 구독을 만들어 엔드포인트로 호출함. 인증 방식만 다름.) → Cloud Functions를 GCP 내부에서 호출할 때는 서비스 계정과 역할만 있으면 됨. 이벤트 트리거는 정말로 편의를 위한 것인 듯?
  3. 구독에서 Push 실패시 실패에 대한 확인은 어떻게 하는 것인지? → Monitoring 페이지에서 Metrics explorer를 통해 확인 가능. subscription/num_undelivered_messages 나 subscription/oldest_unacked_message_age등의 metric을 확인하시면 아직 진행되지 않은 메시지 수를 확인. 또한 메시지가 전송이 실패한 경우에는 console에서 subscription 페이지에서도 상황 확인 가능. (아래 세 문서 참고)

https://cloud.google.com/pubsub/docs/monitoring

https://cloud.google.com/pubsub/docs/monitoring#monitoring_the_backlog

https://cloud.google.com/pubsub/docs/monitoring#monitoring_push_subscriptions