S3 스토리지에 영상 파일이 업로드될 경우 자동으로 영상 파일을 인코딩하기 위한 lambda 함수를 작성하였다.
먼저 AWS Lambda 에서 함수 생성을 선택하여 실행할 함수를 정의해준다.

런타임은 python3.10 으로 설정하였다.
역할 변경을 선택하고 기존의 역할을 사용하였다.
함수를 생성하였으면 S3 버킷에 파일을 업로드하였을 경우 lambda가 자동으로 생성되도록 트리거를 설정한다.

S3를 선택해주고 원하는 버킷을 선택해준다.
Event type은 object create events에서 PUT을 선택하여 업로드되었을 경우 실행하도록 설정한다.
Suffix에는 .webm 을 설정하여 .webm 확장자를 가진 파일이 업로드되었을 경우 실행되도록 설정한다.
그 후 Layer를 설정하여주는데 먼저 계층 항목에서 사용할 계층을 생성해준다.

계층 생성 버튼을 누르고 이름을 입력한다.
사용할 라이브러리 패키지 등을 업로드하여야 하는데 ffmpeg 패키지를 다운받아 업로드 하였다.
ffmpeg 패키지는
https://johnvansickle.com/ffmpeg/
에서 ffmpeg-release-amd64-static.tar.xz 를 다운 및 압축 해제 한 후 다시 zip 파일으로 압축하고 파일 이름을 ffmpeg로 설정하였다.
10MB 이상의 파일을 업로드할 경우 S3 버킷을 이용하여 업로드하여 준다.
S3 버킷을 이용하여 업로드할 경우 S3에 업로드한 파일의 url을 입력하면 된다.
호환 런타임은 python3.8, python3.9, python3.10, python3.11 등을 선택해주었다.
계층을 생성하고 다시 아까 만든 함수로 돌아와서 코드 에서 계층 항목의 Add a layer 를 선택한다.

사용자 지정 계층을 선택하고 방금 만든 계층을 선택하고 버전을 선택한 후 적용한다.
이제 ffmpeg를 사용할 코드를 작성하여 준다.
import subprocess
import boto3
import os
import shlex
from key import id, secret_key, region_name
def lambda_handler(event, context):
bucket_name = event['Records'][0]['s3']['bucket']['name']
bucket_name_new = 'new bucket'
object_key = event['Records'][0]['s3']['object']['key']
session = boto3.Session(
aws_access_key_id=id,
aws_secret_access_key=secret_key,
region_name=region_name
)
s3_client = session.client('s3')
try:
# S3 객체의 내용을 가져오기
response = s3_client.get_object(Bucket=bucket_name, Key=object_key)
s3_source_basename = os.path.splitext(os.path.basename(object_key))[0]
signed_url = s3_client.generate_presigned_url(
'get_object',
Params={
'Bucket': bucket_name,
'Key': object_key # S3 객체의 키 (파일 경로)
},
ExpiresIn=3600 # URL의 유효 기간 (초)
)
ffmpeg_cmd = "/opt/ffmpeg -i \"" + signed_url + "\" -r 30 -f mpegts -c:v copy -af aresample=async=1:first_pts=0 -"
command1 = shlex.split(ffmpeg_cmd)
p1 = subprocess.run(command1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
s3_destination_filename = s3_source_basename + "convert.mp4"
resp = s3_client.put_object(Body=p1.stdout, Bucket=bucket_name_new, Key=s3_destination_filename)
return {
'statusCode': 200,
'body': '성공적으로 변환 및 저장되었습니다.'
}
except Exception as e:
# 오류 처리
print("오류 발생:", e)
return {
'statusCode': 500,
'body': '새로운 파일로 저장하는 동안 오류가 발생했습니다.'
}
webm 파일이 업로드될 경우 해당 파일의 url 을 가져온 후 컨버팅한 후 mp4 파일으로 new bucket에 저장되도록 하였다.
만약 퍼블릭 액세스가 허용되어 있는 버킷이라면 aws_access_id, secret_id 등을 기입할 필요는 없다.
퍼블릭 액세스가 허용되어 있지 않은 버킷이라고 하더라도 access_id, secret_id를 직접 기입하는 것은 위험하니 임시 id 등을 사용하는 것이 좋다.
실행결과는 모니터링의 cloudwatch logs 보기 를 통해 조회할 수 있다.