* S3 버킷 및 람다함수 모두 서울 리전으로 적용 가능하오니 참고 부탁드립니다
위 링크는 구축 방법에 대해 영문으로 설명되어 있으며, 링크에 나온 방법을 활용하여 적어놓았습니다.
회사 서비스에 동영상 스트리밍이 들어갈것 같아 이것저것 찾아보던중 aws cloudfront+s3+mediaconvert를 결합하는 방법을 찾아내었다.
위 Flow를 설명하자면 다음과 같습니다.
1. 동영상을 S3버킷에 특정 디렉토리에 업로드
2. Lambda edge가 트리거 이벤트를 발생시켜서 원본 이미지를 MediaConvert에 전달
3. 전달받은 MediaConvert는 HLS(Http Live Streaming) 확장자 파일을 생성 후 해당 S3버킷에 저장
4. 동영상 시청자는 HLS 확장자로 시청 (3초간격 실시간 스트리밍)
5. 첫 시청시간만큼 CloudFront는 캐싱 처리함
6. 이후 시청하는 시청자는 CloudFront에서 캐싱한 스트리밍 동영상을 시청함
이 구조로 스트리밍을 하게되면 동영상 스트리밍 트래픽 부하를 효과적으로 줄일 수 있을거 같았고, 구축까지 해보았습니다.
이 글에선 구축 방법을 다시 한번 정리해보도록 하겠습니다.
* 현재 Lambda edge가 서울을 지원하지 않기 때문에 버지니아 북부 (us-east-1) 기준으로 설정하였습니다.
1. AWS S3 버킷 생성
* 버킷을 생성시 Lambda @edge를 버지니아 북부 (us-east-1)에 생성해야 하고 버킷도 같은 리전이어야 하기 때문에 리전을 Lambda @edge 리전과 동일하게 맞추셔야 합니다.
* 버킷 권한 설정
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::YOUR-BUCKETNAME/*"
}
]
}
* 버킷 CORS 권한 설정
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
2. 역할1 만들기 (MediaConvert 정책 만들기)
- MediaConvert 사례를 클릭하여 다음 클릭
- 기본 설정된 값으로 "다음" 클릭
- 역할 이름은 'MediaConvertRole'로 정의 및 생성 합니다.
3. 역할2 만들기 (Lambda 정책 만들기)
* 람다 함수 관련한 역할 및 정책을 신규 생성합니다.
- 역할 사례 지정
- 권한 정책 연결
- 역할 이름을 "VODLambdaRole"로 정의 후 생성합니다.
- 생성한 "VODLambdaRole" 검색 및 클릭 후 정책 연결 클릭
- 정책 생성 클릭
- 정책 JSON 소스 적용하기 (* IAM접근식별번호는 별도로 기입해주세요!)
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*",
"Effect": "Allow",
"Sid": "Logging"
},
{
"Action": [
"iam:PassRole"
],
"Resource": [
"arn:aws:iam::IAM접근고유번호:role/MediaConvertRole"
],
"Effect": "Allow",
"Sid": "PassRole"
},
{
"Action": [
"mediaconvert:*"
],
"Resource": [
"*"
],
"Effect": "Allow",
"Sid": "MediaConvertService"
},
{
"Action": [
"s3:*"
],
"Resource": [
"*"
],
"Effect": "Allow",
"Sid": "S3Service"
}
]
}
4. Lambda @edge 함수 생성
- 람다 서비스 접속 및 버지니아 북부로 Lamda 함수 생성
- 함수 정보 기입
- github 소스를 다운로드 받음
- convert.py, job.json 파일 zip파일로 압축 및 생성
- 함수 코드 .zip 파일 업로드 변경 및 zip파일 업로드 후 핸들러 명을 convert.handler로 수정
- "+트리거 추가" 클릭 후 S3 검색 및 지정
- 트리거 환경 설정 (이벤트 유형 , 접두사 기입)
ex) S3 버킷에 inputs 경로에 PUT 이벤트가 발생 할 경우 자동으로 Lambda @edge 및 MediaConvert 처리가 발생함
* 필자는 convert.py 소스에 112~113 라인을 삭제하였습니다.
- 테스트 코드 작성
{
"Records": [
{
"eventVersion": "2.0",
"eventTime": "2017-08-08T00:19:56.995Z",
"requestParameters": {
"sourceIPAddress": "54.240.197.233"
},
"s3": {
"configurationId": "90bf2f16-1bdf-4de8-bc24-b4bb5cffd5b2",
"object": {
"eTag": "2fb17542d1a80a7cf3f7643da90cc6f4-18",
"key": "vodconsole/TRAILER.mp4",
"sequencer": "005989030743D59111",
"size": 143005084
},
"bucket": {
"ownerIdentity": {
"principalId": ""
},
"name": "rodeolabz-us-west-2",
"arn": "arn:aws:s3:::rodeolabz-us-west-2"
},
"s3SchemaVersion": "1.0"
},
"responseElements": {
"x-amz-id-2": "K5eJLBzGn/9NDdPu6u3c9NcwGKNklZyY5ArO9QmGa/t6VH2HfUHHhPuwz2zH1Lz4",
"x-amz-request-id": "E68D073BC46031E2"
},
"awsRegion": "us-west-2",
"eventName": "ObjectCreated:CompleteMultipartUpload",
"userIdentity": {
"principalId": ""
},
"eventSource": "aws:s3"
}
]
}
- 결과 아래 코드에서 확인
Response:
{
"body": "",
"headers": {
"Access-Control-Allow-Origin": "*",
"Content-Type": "application/json"
},
"statusCode": 200
}
- S3 버킷 inputs 경로에 mp4 파일 업로드 해보기
- MediaConvert 서비스 이동 후 작업에 해당 파일 처리 확인
- S3 버킷 폴더 생성 확인 (HLS, MP4, Thumbnails)
- HLS 파일이 화질에 따라 자동 생성 되었음을 확인
5. CloudFront 생성 및 버킷 연결
- Create Distribution 클릭
- Web으로 생성
- CloudFront 설정 (Origin Domain Name은 해당 버킷 선택하면 됨)
- Whitelist Headers Add 후 생성
'개발 기록 > AWS' 카테고리의 다른 글
Lambda@Edge 기반 CloudFront QRCode 생성기 만들기 (0) | 2022.08.19 |
---|---|
AWS API Gateway - WebSocket API와 HTTP API 연동하기 PART-2 (0) | 2021.09.24 |
AWS API Gateway - WebSocket API와 HTTP API 연동하기 PART-1 (0) | 2021.09.23 |
AWS CodeDeploy 권한 설정 (0) | 2020.12.09 |
AWS EC2(Ubuntu) EFS(Elastic File System) 연동하기 (0) | 2020.05.14 |