동영상을 보면 화질별로 감상할 수 있는데 그게 한파일을 여러개로 보이는게 아니라 여러개로 Convert 한 것이다. 그래서 이번 설정은 S3에 영상을 올리면 설정해둔 화질에 맞게 Convert하여 저장하는 것을 다룬다. 그래서 실질적으로 진행되는 것은 다음과 같다
S3에 영상을 올리면 -> Lambda로 mediaConver를 사용해 화질을 분리한다.
총 3개의 단계로 구성된다.
1. IAM 역할 만들기
2. S3 설정하기
3. Lambda 만들기
그럼 시작
# IAM 역할 만들기
역할을 2개 만들어야 한다.
1. MediaConvertRole
2. VodLambdaRole(labmda를 실행할 권한)
역할 1 생성(MediaConvertRole)
2개의 권한이 검색되어 있다
이름을 MediaConvertRole 로 설정하고 생성
검색해서 해당 역할을 찾은 후 상세보기를 한다. ARN 의 내용을 메모장에 복사해야 하는데 추후 Lambda 환경변수 값을 넣기 위해서다. Lambda 실행할 때 MediaConver의 권한을 쓰기 때문.
역할 2 생성 (VodLambdaRole)
이번엔 Lambda를 생성한다
다음 권한을 검색해서 체크, 다음을 누른다
VODLambdaBasicExec 이름으로 생성한다.
갓 만든 역할을 찾아 상세보기로 들어간 다음 인라인 정책 추가를 클릭한다.
JSON을 클릭한다음 다음을 추가한다.
Resource 부분에 이전에 MediaConverRole에서 복사한 ARN을 삽입한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*",
"Effect": "Allow",
"Sid": "Logging"
},
{
"Action": ["iam:PassRole"],
"Resource": ["이전에 생성한 MediaConvertRole의 ARN"],
"Effect": "Allow",
"Sid": "PassRole"
},
{
"Action": ["mediaconvert:*"],
"Resource": ["*"],
"Effect": "Allow",
"Sid": "MediaConvertService"
},
{
"Action": ["s3:*"],
"Resource": ["*"],
"Effect": "Allow",
"Sid": "S3Service"
}
]
}
다음처럼 4개의 권한이 보인다. 이름을 넣고 다음을 누른다.
다음처럼 추가되어 있다.
# S3 설정
이제 S3 버킷을 만든다. 버킷은 총 2개를 등록하라고 권장한다. 하나는 원본이 저장될 버킷(input), 그리고 하나는 변형후 저장될(output) 버킷이다. 이렇게 만드는 이유는 lambda를 만드는 도중에 다음과 같은 경고메시지 때문이다. 재귀호출로 인한 비용이 늘어날 수 있음을 경고.
그래도 일단 여기선 1개의 버킷으로 할 예정이며 다만 input/ 과 output/을 등록하여 저장하도록 하겠다.
input/ 원본 저장 경로
output/ 결과물 저장 버킷
버킷을 생성한 후에는 원본을 저장할 버킷(mytest-vod-input) 에 들어가 권한탭을 클릭해 버킷 정책을 다음으로 삽입한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[버킷이름]/*"
}
]
}
행여 다음의 에러가 날 수 있는데 엑세스 설정때문이다.
이것은 버킷의 정책이 해당 정책을 수용하지 못해서 그런데 퍼블릭 액세스 차단 설정으로 가서 3번째 설정인 '새 퍼블릭 버킷 또는 액세스 지점 정책을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단'의 체크를 푼다.
그리고 다시 가서 정책을 설정한다.
그럼 이제 lambda 함수를 생성하자.(업로드시 MediaConvert를 수행할 lambda)
# Lambda 생성하기
함수생성을 클릭한다. 이후 파이썬 3.8 버전을 선택한다. 이름을 등록하고 실행 역할은 위에서 만든 VODLambdaBasicExec 를 등록한 후 함수를 생성한다.
함수에 등록할 코드를 다음 github에 들어가 코드를 다운받는다.
https://github.com/aws-samples/aws-media-services-vod-automation
다운받은 파일 압축을 해제한 후 MediaConvert-WorkflowWatchFolderAndNotification 폴더에 들어가면 convert.py 와 job.json 파일이 있다.
이 두 파일을 zip으로 압축한 뒤 람다에 등록한다.
혹시모르니 둘을 합친 압축파일을 여기 추가.
다음처럼 코드가 등록된다.
그리고 런타임 설정을 해줘야한다. 런타임 핸들러에 규칙은 [파일명].[메서드명] 인데 업로드한 파일에서 convert.py 가 그 역할을 할 것이고 그 안에 handler 를 호출할 것이기 때문에 다음처럼 설정한다
convert.handler
그럼 트리거를 등록하기 전에 테스트를 진행하는게 좋은데 그러기위해선 2가지를 해야한다.
1. 환경변수 설정
2. 테스트 등록
1번을 우선 진행해보자.
구성 -> 환경변수에 들어가 다음처럼 설정한다.
DestinationBucket, MediaConvertRole, Application을 입력한다.
Application = VOD
MediaConvertRole = [위에서 등록한 MediaConvertRole의 ARN]
DestinationBucket = [output 버킷이름]
참고로 DestinationBucket를 입력할때 output/ 경로에 저장할 것이기 때문에 [버킷이름]/output/ 으로 등록했다. 그리고 경로가 겹치면(대체로 파일명이겠지만) 이전 파일을 덮어쓰게 된다. 주의.
이제 테스트 탭으로 들어가 다음을 입력하여 진행한다.
테스트의 내용을 아래 내용으로 채운다.
{
"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"
}
]
}
테스트 버튼을 클릭한다.
실행 결과가 성공으로 뜬다 하더라도 세부정보를 꼭 확인해야 한다. 여기서 성공은 lambda의 실행을 의미하는 것이지 해당 프로세스가 수행되었다는 의미는 아니다.
세부정보에서 statusCode가 200 으로 온것을 확인하면 된다.
이제 S3에 접속해서 실제로 생성되었는지 확인해보자.
수행이 잘 되었음을 확인했다.
이제 트리거에 S3를 등록하자
버킷명을 입력하고 이벤트 유형은 모든 객체 생성 이벤트로, 그리고 접두사에 input/ 을 입력한다
인터넷에 보면 이벤트유형에 PUT으로 하라는 경우가 있었는데, 내 경우 그렇게 할때 테스트는 되더라도 막상 input/에다가 파일을 추가하면 되지 않았었다. 그래서 여기선 모든 객체 생성 이벤트를 걸기로 했다.
이제 input/ 에 파일을 업로드 해보자.
CloudWatch를 보면 수행로그가 찍힌다. 이중에 하나를 클릭해서 상세보기를 했다.
로그 끝쯤에 input 파일에 대한 정보가 있다.
s3의 output/ 을 보면 다음 경로를 볼 수 있다.
HLS 파일로 쪼개진 것도 확인.
기타:
파일을 분리하는데 사용되는 코드는 위에서 언급한 github에서 다운받았는데
https://github.com/aws-samples/aws-media-services-vod-automation
해당 코드에서는 다음 4가지 화질을 만든다.
HLS: 360, 540, 720
mp4: 720
그 외 thumbnail(썸네일) 다수
이것을 설정하는 파일은 job.json 인데 보면 상세히 알 수 있다.
끝.
추가:
lambda 에서 테스트 하는데 다음과 같은 500 에러가 날때.
{
"statusCode": 500,
"body": "{}",
"headers": {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*"
}
}
S3에 저장하는데 실패한 것이다. iam 정책을 저장할 때 S3 권한이 포함되어야 하는데 빠질경우 그렇다. iam에 들어간 뒤 VOD관련 설정(여기서는 VODLambdaBasicExec)에서 다음 권한 있는지 확인
...
{
"Action": ["s3:*"],
"Resource": ["*"],
"Effect": "Allow",
"Sid": "S3Service"
}
...
추가2:
CloudFront에 OAI를 설정해 두었다면 S3에 다음처럼 설정이 되어있을것이다.
{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity [origin access identity]"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[버킷이름]/*"
}
]
}
그런데 위 본문에서 다음의 설정이 있다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[버킷이름]/*"
}
]
}
그럼 이럴땐 어떻게 해야할까?. 아래거를 무시하고 위의 설정만 있어도 동영상 convert, 그리고 CloudFront의 OAI가 제기능 한다.
실 적용 정책:
{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity [origin access identity]"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[버킷이름]/*"
}
]
}
참고:
https://realwater87.tistory.com/2
http://proxyolism.egloos.com/m/1940711
https://github.com/aws-samples/aws-media-services-vod-automation
https://dev.classmethod.jp/articles/aws-cli-cloudfront-oai-kr/
'공부 > 프로그래밍' 카테고리의 다른 글
[java] Localdatetime 을 몇분 전, 몇초 전 으로 변경하기 (0) | 2021.05.26 |
---|---|
[springboot] @EnableResourceServer 사용 중 Using generated security password 가 보일 때 (0) | 2021.05.12 |
[react] text 내 http에 a 태그로 변환, 링크 삽입 (0) | 2021.05.07 |
[aws] cloudfront 에 s3 연결 후 access denied 뜰 때 (0) | 2021.05.05 |
[aws] cloudfront 에 접근제한 및 가능 URL 만들기(Access denied) (0) | 2021.05.03 |
댓글