Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

하는 데 의의를 둬春

Clound Function 업로드 시 VOD Station로 자동 인코딩 하기 + 파일 권한 지정 및 원본 파일 삭제 본문

기타

Clound Function 업로드 시 VOD Station로 자동 인코딩 하기 + 파일 권한 지정 및 원본 파일 삭제

Shonir00ng 2023. 2. 28. 14:41

[이렇게 사용하세요!] 동영상 서비스 자동화 .. : 네이버블로그 (naver.com)

 

[이렇게 사용하세요!] 동영상 서비스 자동화 하기 : 네이버 클라우드 플랫폼 VOD Station + Cloud Functio

안녕하세요, 누구나 쉽게 시작하는 클라우드 네이버 클라우드 플랫폼 ncloud.com 입니다. 온라인 쇼핑 후 ...

blog.naver.com

 

Cloud Function - VOD Station 자동 인코딩은 위 블로그를 참조하여 구현했다.

트리거에 시퀀스만 등록해야하는걸 액션까지 등록해놓고 왜 안되지 이러고 있었던 나는 바보일까...?

 

자동 인코딩을 위해선 동영상을 업로드하고 이벤트를 발생시킬 input bucket과 인코딩 후 파일을 저장할 output bucket이 필요하다. 하나의 bucket을 사용하면 재귀 호출이 일어나므로 절대 하지 말 것. 그렇게 경고했는데도 하나로 넣었다가 큰일날 뻔 했다.

 

인코딩 후 기존 업로드 파일과 썸네일 일부를 삭제하고 싶어 파이썬으로 액션을 만들었다.

virtual environment와 함께 패키징 하는 것도 위의 링크 참조했음.

cloud function에 접근하려면 boto3 모듈이 필요하므로 패키징 해야 했다.

 

 

https://guide.ncloud-docs.com/docs/storage-storage-8-2

 

 

Python용 AWS SDK (Boto3)

 

guide.ncloud-docs.com

(☝🏻 파이썬으로 Object Storage 사용하는 예제)

 

 

 

아 boto3 인스톨 할 때 pyjoke 대신 이거 넣으면 됨

그리고 파워쉘 쓰지마세요... cmd 쓰세요...

(virtualenv) c:\WorkingDir> pip install boto3==1.6.19

 

 

 

썸네일 삭제 액션은 output bucket에 이미지 파일이 생성(PUT)될 때

원본 파일 삭제 액션은 output bucket에 인코딩 된 동영상 파일이 생성(PUT) 때 실행하도록 한다.

(파일 업로드 -> 썸네일 추출 -> 인코딩 순서로 진행됨)

 

이미지 파일 관련 __main__.py

import requests
import json
import sys
import boto3
import time

def main(args):
    print("Thumbnail uploaded :::::::::::::::::::::", time.strftime('%c', time.localtime(time.time())))
    access_key = args["NCLOUD_ACCESS_KEY"]
    secret_key = args["NCLOUD_SECRET_KEY"]
    category_name = args["CATEGORY_NAME"]
    service_name = args["SERVICE_NAME"]
    endpoint_url = args["ENDPOINT_URL"]
    region_name = args["REGION_NAME"]

    input_bucket = args["INPUT_BUCKET"]
    output_bucket = args["OUTPUT_BUCKET"]

    object_name = args["object_name"]
    
    s3 = boto3.client(service_name, endpoint_url=endpoint_url, aws_access_key_id=access_key, aws_secret_access_key=secret_key)

    # 권한 부여
    s3.put_object_acl(Bucket=output_bucket, Key=object_name, ACL='public-read')

    # 02~10.jpg 포함되면 이미지 삭제
    for i in range(2, 11):
        if i < 10:
            num = str(i).zfill(2)
        else:
            num = str(i)
        thumb_suffix = "_" + num + ".jpg"
        if object_name.find(thumb_suffix) > -1: 
            s3.delete_object(Bucket=output_bucket, Key=object_name)
            print("Thumbnail", object_name, "has been deleted from", output_bucket, ":::", time.strftime('%c', time.localtime(time.time())))

    return {"result" : "true"}

 

동영상 파일 관련 __main__.py

import requests
import json
import sys
import boto3
import time

def main(args):
    print("Encoding file uploaded :::::::::::::::::::::", time.strftime('%c', time.localtime(time.time())))
    access_key = args["NCLOUD_ACCESS_KEY"]
    secret_key = args["NCLOUD_SECRET_KEY"]
    service_name = args["SERVICE_NAME"]
    endpoint_url = args["ENDPOINT_URL"]
    region_name = args["REGION_NAME"]

    input_bucket = args["INPUT_BUCKET"]
    output_bucket = args["OUTPUT_BUCKET"]

    object_name = args["object_name"]
    prefix = object_name.replace("_default.mp4", "")    
    
    s3 = boto3.client(service_name, endpoint_url=endpoint_url, aws_access_key_id=access_key, aws_secret_access_key=secret_key)

    # 파일 권한 설정
    try:
        s3.put_object_acl(Bucket=output_bucket, Key=object_name, ACL='public-read')
    except Exception as e:
        print("Exception occured from put_object_acl", e)

    # 원본파일 삭제
    objects_to_delete = s3.list_objects(Bucket=input_bucket, Prefix=prefix)

    delete_keys = {'Objects' : []}
    delete_keys['Objects'] = [{'Key' : k} for k in [obj['Key'] for obj in objects_to_delete.get('Contents', [])]]

    s3.delete_objects(Bucket=input_bucket, Delete=delete_keys)
    for key in delete_keys:
        print("Original", key, "has been deleted from :::", time.strftime('%c', time.localtime(time.time())))

    return {"result" : "true"}

'기타' 카테고리의 다른 글

[Tomcat] 리눅스에서 tomcat 포트번호가 충돌날 때  (0) 2023.03.13
Comments