Cloud Functions를 활용한 자동 인코딩 구현
    • PDF

    Cloud Functions를 활용한 자동 인코딩 구현

    • PDF

    Article Summary

    Classic/VPC 환경에서 이용 가능합니다.

    VOD Station은 Object Storage 버킷과 연동하여 인코딩을 수행하나 버킷에 파일이 업로드 되었는지 여부를 감지하여 자동 인코딩하는 기능을 제공하지 않습니다. 하지만 Object Storage의 이벤트 관리 기능과 Cloud Functions를 활용하여 유사한 기능을 구현할 수 있습니다.

    자동 인코딩 Flow

    자동 인코딩을 구현하는 순서는 다음과 같습니다.

    1. Object Storage 미디어 파일 업로드
    2. Object Storage에서 업로드 이벤트 트리거
    3. Cloud Functions를 통해 VOD Station 인코딩 API 요청
    4. VOD Station에서 인코딩 수행

    구현 가이드

    Object Storage와 Cloud Functions, VOD Station API를 이용하여 자동 인코딩을 구현하는 예시는 다음과 같습니다.

    1. Object Storage 원본 파일을 저장할 버킷에 이벤트 설정
      1. Object Storage > Bucket Management > 이벤트를 설정할 버킷의 이벤트 관리 메뉴 클릭
      2. 이벤트 관리 팝업 > 생성 버튼 클릭
      3. 버킷 이벤트 생성
        • 이벤트 이름 입력
        • 필터 설정: 객체에 대해서 이벤트를 필터링할 때 사용할 조건 입력
          • 정규 표현 식으로 입력해 주십시오.(<예시> 접두사 images/: ^images/)
          • 필터는 객체 경로에 적용되며, 미입력 시 모든 객체에 대해 이벤트가 발생합니다.
        • 이벤트 유형: 객체 생성(PUT)
          • 신규 파일 업로드는 POST와 PUT 두 가지 이벤트가 동시에 발생, 따라서 POST, PUT을 모두 선택하면 인코딩 액션 트리거가 두 번 될 수 있습니다.
          • 덮어쓰기는 PUT 이벤트만 발생합니다.
        • 대상: Cloud Functions
          • 미리 생성해둔 트리거가 없다면 트리거 생성 버튼을 클릭하여 트리거를 생성합니다.
            • 트리거 생성 팝업에서는 이름만 입력하여 생성 버튼 클릭합니다.
            • 트리거에 연결할 액션(수행할 로직)을 설정해야 하지만, 미리 액션을 만들어두지 않았다면 생략합니다.
          • 생성된 트리거를 선택
            • 이 단계에서 연결된 액션은 없어도 됩니다.
          • 재귀 호출 주의 안내를 확인한 후 체크합니다.
    2. Cloud Functions 에서 Action 설정
      1. Cloud Functions > Action > Action 생성 버튼 클릭
      2. Action 생성 페이지에서 트리거 조건 설정
        • 트리거 종류: Object Storage를 선택합니다.
        • 이름: 이전 단계에서 만들어둔 트리거 선택 후 추가 버튼을 클릭합니다.
        • 재귀 호출 주의 안내를 확인 후 체크합니다.
      3. Action의 로직 설정
        • 패키지: 원하는 패키지(그룹)을 선택, 없다면 신규 생성합니다.
        • 타입: 기본 (필요에 따라 시퀀스 선택 가능)
        • 이름: 생성할 액션의 이름을 입력합니다.
        • 소스코드: 생성할 액션에서 수행할 비즈니스 로직을 고객이 직접 구현해야하며, 본 가이드 하단에 소스코드 예시를 참고 부탁드립니다.
        • VPC 연결 정보 : 선택한 Platform이 VPC 환경일 경우 연결할 VPC와 Subnet을 선택, 없다면 신규 생성합니다.

    자동 인코딩 Action 소스 코드 설정

    Cloud Functions 설정 예시는 다음과 같습니다.

    참고

    예시 코드는 정상 동작을 보장하지 않기 때문에 실제 구현 시 참고 용도로 활용해 주십시오.

    • Example parameter
      • Default Parameter (JSON Object)
        • 아래와 같이 설정합니다.
        {
            "base_url": "https://vodstation.apigw.ntruss.com",
            "api_url": "/api/v2/category/{CATEGORY-ID}/add-files",
            "access_key": "{API-ACCESS-KEY}",
            "secret_key": "{API-SECRET-KEY}"
        }
        
        • {CATEGORY-ID}: 인코딩을 수행할 카테고리 ID 값으로 치환합니다.
        • {API-ACCESS-KEY}: 사용자의 Access Key 값으로 치환합니다.
        • {API-SECRET-KEY}: 사용자의 Secret Key 값으로 치환합니다.
    참고

    CATEGORY-ID카테고리 목록 조회 API를 통해 확인 가능하며, API-ACCESS-KEYAPI-SECRET-KEY인증키 관리에서 확인 가능합니다.

    • Example source code
      • 예시는 Python 3.7 에서 구현하였으며, 다른 언어로 구현할 수 있습니다.
      import hashlib
      import hmac
      import base64
      import requests
      import time
      import json
      
      
      def make_signature(url, timestamp, access_key, secret_key):
          timestamp = int(time.time() * 1000)
          timestamp = str(timestamp)
      
          secret_key = bytes(secret_key, "UTF-8")
      
          method = "PUT"
      
          message = method + " " + url + "\n" + timestamp + "\n" + access_key
          message = bytes(message, "UTF-8")
          sign_key = base64.b64encode(
              hmac.new(secret_key, message, digestmod=hashlib.sha256).digest()
          )
          print(sign_key)
          return sign_key
      
      
      def make_header(timestamp, access_key, sign_key):
          headers = {
              "Content-Type": "application/json; charset=utf-8",
              "x-ncp-apigw-timestamp": timestamp,
              "x-ncp-iam-access-key": access_key,
              "x-ncp-apigw-signature-v2": sign_key,
          }
          return headers
      
      
      def main(args):
          object_name = args.get("object_name")
          input_bucket_name = args.get("container_name")
      
          api_url = args["api_url"]
          full_url = f'{args["base_url"]}{api_url}'
          timestamp = str(int(time.time() * 1000))
      
          sign_key = make_signature(
              api_url, timestamp, args["access_key"], args["secret_key"]
          )
          headers = make_header(timestamp, args["access_key"], sign_key)
      
          try:
              res = requests.put(full_url, headers=headers, data=json.dumps({'bucketName' : input_bucket_name, 'pathList': [ object_name ] }))
      
              if res.status_code == 200:
                  return {"input_bucket": input_bucket_name, "object_path": object_name, "res": res.text, "done": True}
              else:
                  raise Exception({"done": False, "error_message": res.text})
      
          except Exception as e:
              raise Exception({"done": False, "error_message": str(e)})
      

    이 문서가 도움이 되었습니까?

    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.