웹훅 대상 호스팅

이 가이드에서는 Cloud Run 서비스에서 웹훅 대상을 호스팅하는 방법을 보여줍니다.

Cloud Functions와 Cloud Run 비교

Cloud Functions 및 Cloud Run은 모두 웹훅 대상 호스팅에 적합한 솔루션을 제공합니다. 일반적으로 Cloud Functions는 설정이 빠르고 프로토타입 제작에 적합하며 소량의 워크플로에 이상적입니다. Cloud Run은 더 많은 유연성을 제공하며 동시 실행으로 더 큰 볼륨을 처리할 수 있습니다.

다음과 같은 경우에 Cloud Run을 사용합니다.

  • Cloud Functions에서 지원되지 않는 언어 또는 런타임을 사용하는 경우
  • 더 긴 요청 제한 시간을 원할 경우(최대 15분)
  • 많은 양이 예상되며 동시 실행이 필요한 경우(인스턴스당 동시 요청 80건)

Cloud Run에서 웹훅 대상 만들기

Cloud Run을 사용하면 원하는 언어로 웹훅 대상을 정의할 수 있습니다. 데이터를 수락할 수 있는 HTTP 엔드포인트만 만들면 됩니다. 일반적으로 이 작업은 POST를 사용하여 수행됩니다. 예를 들면 다음과 같습니다.

@app.route('/', methods=['POST'])
def index():
    data = request.get_json()

위의 예시에서 URL의 색인 페이지는 POST 요청만 수락하도록 구성되며 JSON 페이로드를 통해 데이터가 전달될 것으로 기대합니다.

웹훅 제공업체와 통합

HTTP 콜백을 제공하는 대부분의 서비스는 URL 소유권을 확인해야 합니다. 일반적으로 일종의 토큰, 메시지, 보안 비밀을 전송하고 유효한 응답을 기대합니다. 서비스 제공업체로부터 이러한 요구사항을 받아야 합니다. 위와 동일한 예시를 사용하면 다음과 같이 표시됩니다.

def index():
    data = request.get_json()
    return data['challenge']

제공업체에서 소유권을 확인한 후에는 사용자 측의 승인도 추가해야 합니다.

요청 승인

웹훅 대상은 공개 URL입니다. 대부분의 서비스는 수신 요청이 승인된 서비스에서부터 시작되는지 확인하기 위해 토큰 또는 보안 비밀을 제공합니다. URL이 공개 상태이므로 웹훅 대상으로 데이터를 전송하려는 악의적인 시도를 방지할 수 없습니다. 하지만 토큰이나 보안 비밀을 사용하면 승인된 출처의 데이터만 처리할 수 있습니다.

요청을 확인하려면 보안 비밀 사본을 환경 변수로 저장하거나 특정 유형의 키 관리 시스템을 사용해야 합니다. 각 요청에는 요청 헤더나 JSON 페이로드에 보안 비밀이나 토큰이 있어야 하며 소스가 유효한지 확인해야 합니다.

def index():
    request_secret = request.headers['Secret']
    if request_secret != os.environ['SECRET']:
        return ('Unauthorized', 401)

웹훅 제공업체가 보안 비밀 또는 기타 인증 메커니즘을 지원하지 않는 경우 웹훅 대상의 URL이 있는 모든 사용자가 메시지를 보낼 수 있습니다. 이 경우 웹훅 구현이 공개 인터넷에 안전하게 노출되어야 합니다.

요청에 응답

대부분의 서비스는 서비스에서 지정한 대로 일정 시간 내에 요청에 응답해야 합니다. 일부 웹훅에는 HTTP 상태 코드 4xx 또는 5xx와 같은 오류 응답이 있는 경우 재시도 메서드가 내장되어 있으므로, 성공적인 상태 코드(2xx)를 반환하여 이벤트가 정상적으로 처리되었음을 서비스에 알려야 합니다.

def index():
    data = request.get_json()
    return ('', 200)

시간 제한

Cloud Run과 웹훅 제공업체에는 모두 시간 제한이 있으며, 둘 중 더 짧은 시간이 애플리케이션에 적용됩니다. 데이터 처리가 Cloud Run 또는 웹훅 제공업체에 할당된 시간을 초과하면 Pub/Sub 또는 Cloud Tasks와 같이 비동기식으로 처리를 완료할 수 있는 제품을 사용해야 합니다. 이러한 제품을 사용하면 데이터를 신속하게 전송하고, 웹훅 제공업체에 성공 응답을 즉시 반환하며, 시간 제한에 대한 우려 없이 처리를 계속할 수 있습니다. 또한 실패 및 재시도를 처리하는 데 적합한 옵션입니다.

일반적인 웹훅 패턴

유형 예시
데이터 릴레이 웹훅이 호출될 때마다 Firebase 클라우드 메시징을 통해 알림을 전송합니다.
데이터 저장 나중에 분석할 수 있도록 BigQuery에 데이터를 저장합니다.
작업 트리거 Dialogflow에서 작업을 수행하고, Twitter에 답글을 게시하거나 새 코드가 GitHub에서 커밋될 때마다 스테이징 환경으로 푸시합니다.

다음 단계