자습서: S3 Batch Operations, AWS Lambda 및 AWS Elemental MediaConvert를 통해 비디오 일괄 트랜스코딩 - Amazon Simple Storage Service

자습서: S3 Batch Operations, AWS Lambda 및 AWS Elemental MediaConvert를 통해 비디오 일괄 트랜스코딩

비디오 소비자는 모든 모양, 크기 및 빈티지의 디바이스를 사용하여 미디어 콘텐츠를 즐길 수 있습니다. 이 다수의 디바이스는 콘텐츠 제작자 및 배포자에게 어려운 과제를 제기합니다. 비디오는 하나의 크기에 맞는 형식이 아닌 다양한 크기, 형식 및 비트레이트로 변환되어야 합니다. 이 변환 작업은 변환해야 하는 비디오가 많을 때 더욱 까다롭습니다.

AWS에서는 다음을 수행하는 확장 가능한 분산 아키텍처를 구축하는 방법을 제공합니다.

  • 입력 비디오 수집

  • 다양한 장치에서 재생할 수 있도록 비디오를 처리

  • 트랜스코딩된 미디어 파일 저장

  • 수요를 충족하기 위해 출력 미디어 파일 제공

Amazon S3에 저장된 광범위한 비디오 리포지토리가 있는 경우, 이러한 비디오를 소스 형식에서 (특정 비디오 플레이어 또는 디바이스에 필요한 크기, 해상도 및 형식의) 여러 파일 형식으로 트랜스코딩할 수 있습니다. 특히, S3 배치 작업은 S3 소스 버킷의 기존 입력 비디오에 대한 AWS Lambda 함수를 호출할 수 있는 솔루션을 제공합니다. 그런 다음 Lambda 함수는 AWS Elemental MediaConvert를 호출하여 대규모 비디오 트랜스코딩 작업을 수행할 수 있습니다. 변환된 출력 미디어 파일은 S3 대상 버킷에 저장됩니다.


            S3 원본 버킷의 입력 비디오에서 대상 버킷의 출력 미디어 파일로의 흐름을 보여주는 일괄 트랜스코딩 워크플로 다이어그램입니다.

목표

이 자습서에서는 S3 소스 버킷에 저장된 비디오의 일괄 트랜스코딩을 위해 Lambda 함수를 호출하도록 S3 배치 작업을 설정하는 방법에 대해 알아봅니다. Lambda 함수는 MediaConvert를 호출하여 비디오를 트랜스코딩합니다. S3 소스 버킷의 각 비디오에 대한 출력은 다음과 같습니다.

  • 다양한 크기의 디바이스 및 다양한 대역폭에서 재생할 수 있는 적응형 비트레이트 스트림인 HLS(HTTP Live Streaming)

  • MP4 비디오 파일

  • 간격에 따라 수집된 썸네일 이미지

사전 조건

이 자습서를 시작하려면 트랜스코딩할 비디오가 이미 저장된 Amazon S3 소스 버킷(예: tutorial-bucket-1)이 있어야 합니다.

원하는 경우 버킷에 다른 이름을 지정할 수 있습니다. Amazon S3 버킷 이름 지정 규칙에 대한 자세한 내용은 버킷 이름 지정 규칙 섹션을 참조하세요.

S3 소스 버킷의 경우 이 버킷에 대한 퍼블릭 액세스 차단 설정과 관련된 설정을 기본값으로 유지합니다모든 퍼블릭 액세스 차단이 사용 설정됨). 자세한 정보는 버킷 생성을 참조하십시오.

S3 소스 버킷에 비디오를 업로드하는 방법에 대한 자세한 내용은 객체 업로드 단원을 참조하세요. S3에 많은 대용량 비디오파일을 업로드하는 경우 Amazon S3 Transfer Acceleration을 사용하여 빠르고 안전한 파일 전송을 구성할 수 있습니다. Transfer Acceleration을 사용하면 S3 버킷에 비디오를 빠르게 업로드하여 대용량의 비디오를 장거리 전송할 수 있습니다. 자세한 정보는 Amazon S3 Transfer Acceleration을 사용하여 빠르고 안전한 파일 전송 구성을 참조하십시오.

1단계: 출력 미디어 파일용 S3 버킷 생성

이 단계에서는 변환된 출력 미디어 파일을 저장할 S3 대상 버킷을 생성합니다. 또한 교차 오리진 리소스 공유(CORS) 구성을 생성하여 S3 대상 버킷에 저장된 트랜스코딩된 미디어 파일에 대한 교차 오리진 액세스를 허용합니다.

출력 미디어 파일용 버킷 생성

  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 버킷(Buckets)을 선택합니다.

  3. 버킷 만들기를 선택합니다.

  4. 버킷 이름에 버킷 이름을 입력합니다(예: tutorial-bucket-2).

  5. 리전(Region)에서 버킷이 속할 AWS 리전을 선택합니다.

  6. 출력 미디어 파일에 대한 퍼블릭 액세스를 보장하려면 이 버킷에 대한 퍼블릭 액세스 차단 설정(Block Public Access settings for this bucket)에서 모든 퍼블릭 액세스 차단(Block all public access)을 선택 취소합니다.

    주의

    이 단계를 완료하기 전에 Amazon S3 스토리지에 대한 퍼블릭 액세스 차단을 검토하여 퍼블릭 액세스 허용과 관련된 위험을 이해하고 이에 동의하는지 확인하세요. 퍼블릭 액세스 차단 설정을 해제하여 버킷을 퍼블릭으로 만들면 인터넷상의 모든 사용자가 버킷에 액세스할 수 있습니다. 버킷에 대한 모든 퍼블릭 액세스를 차단하는 것이 좋습니다.

    퍼블릭 액세스 차단 설정을 지우지 않으려면 Amazon CloudFront를 사용하여 트랜스코딩된 미디어 파일을 뷰어(최종 사용자)에게 전달할 수 있습니다. 자세한 정보는 자습서: Amazon S3, Amazon CloudFront 및 Amazon Route 53로 온디맨드 스트리밍 비디오 호스팅을 참조하십시오.

  7. 현재 설정으로 인해 이 버킷과 그 안에 포함된 객체가 퍼블릭 상태가 될 수 있음을 알고 있습니다(I acknowledge that the current settings might result in this bucket and the objects within becoming public) 옆의 확인란을 선택합니다.

  8. 나머지 설정은 기본값으로 유지합니다.

  9. 버킷 만들기를 선택합니다.

S3 출력 버킷에 CORS 구성 추가

JSON CORS 구성은 하나의 도메인에서 로드되는 클라이언트 웹 애플리케이션(여기서는 비디오 플레이어)이 다른 도메인에 있는 트랜스코딩된 출력 미디어 파일을 재생하는 방법을 정의합니다.

  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 버킷(Buckets)을 선택합니다.

  3. 버킷 목록에서 이전에 생성한 버킷의 이름을 선택합니다(예: tutorial-bucket-2).

  4. 권한(Permissions) 탭을 선택합니다.

  5. CORS(Cross-Origin 리소스 공유) 섹션에서 편집을 선택합니다.

  6. CORS 구성 텍스트 상자에서 다음의 CORS 구성을 복사하여 붙여 넣습니다.

    CORS 구성은 JSON 형식이어야 합니다. 이 예제에서 AllowedOrigins 속성은 와일드카드 문자(*)를 사용하여 모든 오리진을 지정합니다. 특정 오리진을 알고 있는 경우 AllowedOrigins 속성을 특정 플레이어 URL로 제한할 수 있습니다. 이 속성과 다른 속성의 구성에 대한 자세한 내용은 CORS 구성을(를) 참조하세요.

    [ { "AllowedOrigins": [ "*" ], "AllowedMethods": [ "GET" ], "AllowedHeaders": [ "*" ], "ExposeHeaders": [] } ]
  7. [Save changes]를 선택합니다.

2단계: MediaConvert용 IAM 역할 생성

AWS Elemental MediaConvert를 사용하여 S3 버킷에 저장된 입력 비디오를 트랜스코딩하려면 S3 소스 및 대상 버킷에서/으로 파일을 읽고 쓸 수 있는 MediaConvert 권한을 부여하는 AWS Identity and Access Management(IAM) 서비스 역할이 있어야 합니다. 트랜스코딩 작업을 실행하면 MediaConvert 콘솔에서 이 역할을 사용합니다.

MediaConvert용 IAM 역할 생성

  1. 선택한 역할 이름을 사용하여 IAM 역할을 생성합니다(예: tutorial-mediaconvert-role). 이 역할을 생성하려면 AWS Elemental MediaConvert 사용 설명서IAM(콘솔)에서 MediaConvert 역할 생성에 있는 절차를 따르십시오.

  2. MediaConvert에 대한 IAM 역할을 생성한 후 역할(Roles) 목록에서 생성한 MediaConvert에 대한 역할 이름을 선택합니다(예: tutorial-mediaconvert-role).

  3. 요약 페이지에서, arn:aws:iam::으로 시작되는 역할 ARN을 복사하여 나중에 사용할 수 있도록 해당 ARN을 저장합니다.

    ARN에 대한 자세한 내용은 AWS 일반 참조Amazon 리소스 이름(ARN)을 참조하세요.

3단계: Lambda 함수용 IAM 역할 생성

MediaConvert 및 S3 Batch Operations를 사용하여 비디오를 일괄 트랜스코딩하려면 비디오를 변환하기 위해 이러한 두 서비스를 연결하는 Lambda 함수가 있어야 합니다. 이 Lambda 함수에는 MediaConvert 및 S3 Batch Operations에 액세스할 수 있는 Lambda 함수 권한을 부여하는 IAM 역할이 있어야 합니다.

Lambda 함수용 IAM 역할 생성

  1. AWS Management Console에 로그인하여 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 역할을 선택한 다음, 역할 생성을 선택합니다.

  3. AWS 서비스 역할 유형을 선택한 후 일반적인 사용 사례에서 Lambda를 선택합니다.

  4. Next: Permissions(다음: 권한)를 선택합니다.

  5. 권한 정책 연결 페이지에서 필터 정책AWSLambdaBasicExecutionRole을(를) 입력합니다. 관리형 정책 AWSLambdaBasicExecutionRole을 이 역할에 연결하여 Amazon CloudWatch Logs에 쓰기 권한을 부여하려면, AWSLambdaBasicExecutionRole 옆의 확인란을 선택합니다.

  6. 다음: 태그(Next: Tags)를 선택합니다.

  7. (선택 사항) 관리형 정책에 태그를 추가합니다.

  8. 다음: 검토(Next: Review)를 선택합니다.

  9. [역할 이름(Role name)]에 tutorial-lambda-transcode-role을 입력합니다.

  10. 역할 생성(Create role)을 선택합니다.

Lambda 함수의 IAM 역할에 대한 인라인 정책 포함

Lambda 함수를 실행하는 데 필요한 MediaConvert 리소스에 권한을 부여하려면 인라인 정책을 사용해야 합니다.

  1. AWS Management Console에 로그인하여 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 역할(Roles)을 선택합니다.

  3. 역할 목록에서, Lambda 함수에 대해 이전에 생성한 IAM 역할의 이름을 선택합니다(예: tutorial-lambda-transcode-role).

  4. 권한(Permissions) 탭을 선택합니다.

  5. 인라인 정책 추가(Add inline policy)를 선택합니다.

  6. JSON 탭을 선택한 후 다음 JSON 정책을 붙여 넣습니다.

    JSON 정책에서 Resource의 예제 ARN 값을 2단계에서 생성한 MediaConvert에 대한 IAM 역할의 역할 ARN으로 바꿉니다(예: tutorial-mediaconvert-role).

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*", "Effect": "Allow", "Sid": "Logging" }, { "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::111122223333:role/tutorial-mediaconvert-role" ], "Effect": "Allow", "Sid": "PassRole" }, { "Action": [ "mediaconvert:*" ], "Resource": [ "*" ], "Effect": "Allow", "Sid": "MediaConvertService" }, { "Action": [ "s3:*" ], "Resource": [ "*" ], "Effect": "Allow", "Sid": "S3Service" } ] }
  7. 정책 검토를 선택합니다.

  8. 이름(Name)tutorial-lambda-policy을 입력합니다.

  9. 정책 생성을 선택합니다.

    인라인 정책을 생성하면 이 정책이 Lambda 함수의 IAM 역할에 자동으로 포함됩니다.

4단계: 비디오 트랜스코딩용 Lambda 함수 생성

자습서의 이 섹션에서는 S3 Batch Operations 및 MediaConvert와 통합하기 위해 SDK for Python을 사용하여 Lambda 함수를 구축해야 합니다. S3 소스 버킷에 이미 저장된 비디오를 트랜스코딩하려면 S3 소스 버킷의 각 비디오에 대해 Lambda 함수를 직접 호출하는 S3 Batch Operations 작업을 실행합니다. 그런 다음 Lambda 함수는 각 비디오에 대한 트랜스코딩 작업을 MediaConvert에 제출합니다.

Lambda 함수 코드 작성 및 배포 패키지 생성

  1. 로컬 시스템에 batch-transcode이라는 폴더를 생성하십시오.

  2. batch-transcode 폴더에서 JSON 작업 설정을 사용하여 파일을 생성합니다. 예를 들어 이 섹션에 제공된 설정을 사용하고 파일 이름을 job.json로 지정할 수 있습니다.

    job.json 파일이 지정하는 것은 다음과 같습니다.

    • 트랜스코딩할 파일

    • 입력 비디오를 트랜스코딩하는 방법

    • 생성하려는 출력 미디어 파일

    • 트랜스코딩된 파일에 지정할 이름

    • 트랜스코딩된 파일을 저장할 위치

    • 적용할 고급 기능 등

    이 자습서에서는 다음 job.json 파일을 사용하여 S3 소스 버킷의 각 비디오에 대해 다음과 같은 출력을 생성합니다.

    • 다양한 크기의 디바이스 및 다양한 대역폭에서 재생할 수 있는 적응형 비트레이트 스트림인 HLS(HTTP Live Streaming)

    • MP4 비디오 파일

    • 간격에 따라 수집된 썸네일 이미지

    이 예제 job.json 파일은 품질 정의 가변 비트레이트(QVCR)를 사용하여 비디오 품질을 최적화합니다. HLS 출력은 Apple과 호환됩니다(비디오에서 혼합되지 않은 오디오, 6초의 세그먼트 지속 및 자동 QVBR을 통한 최적화된 비디오 품질).

    여기에 제공된 예제 설정을 사용하지 않으려는 경우 사용 사례를 기반으로 job.json 사양을 생성할 수 있습니다. 출력 간에 일관성을 유지하려면 입력 파일의 비디오 및 오디오 구성이 비슷한지 확인합니다. 다른 비디오 및 오디오 구성을 가진 입력 파일에 대해 별도의 자동화(고유 job.json 설정)를 생성할 수 있습니다. 자세한 내용은 AWS Elemental MediaConvert 사용 설명서JSON에서 AWS Elemental MediaConvert 작업 설정 예시를 참조하십시오 .

    { "OutputGroups": [ { "CustomName": "HLS", "Name": "Apple HLS", "Outputs": [ { "ContainerSettings": { "Container": "M3U8", "M3u8Settings": { "AudioFramesPerPes": 4, "PcrControl": "PCR_EVERY_PES_PACKET", "PmtPid": 480, "PrivateMetadataPid": 503, "ProgramNumber": 1, "PatInterval": 0, "PmtInterval": 0, "TimedMetadata": "NONE", "VideoPid": 481, "AudioPids": [ 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492 ] } }, "VideoDescription": { "Width": 640, "ScalingBehavior": "DEFAULT", "Height": 360, "TimecodeInsertion": "DISABLED", "AntiAlias": "ENABLED", "Sharpness": 50, "CodecSettings": { "Codec": "H_264", "H264Settings": { "InterlaceMode": "PROGRESSIVE", "NumberReferenceFrames": 3, "Syntax": "DEFAULT", "Softness": 0, "GopClosedCadence": 1, "GopSize": 2, "Slices": 1, "GopBReference": "DISABLED", "MaxBitrate": 1200000, "SlowPal": "DISABLED", "SpatialAdaptiveQuantization": "ENABLED", "TemporalAdaptiveQuantization": "ENABLED", "FlickerAdaptiveQuantization": "DISABLED", "EntropyEncoding": "CABAC", "FramerateControl": "INITIALIZE_FROM_SOURCE", "RateControlMode": "QVBR", "CodecProfile": "MAIN", "Telecine": "NONE", "MinIInterval": 0, "AdaptiveQuantization": "HIGH", "CodecLevel": "AUTO", "FieldEncoding": "PAFF", "SceneChangeDetect": "TRANSITION_DETECTION", "QualityTuningLevel": "SINGLE_PASS_HQ", "FramerateConversionAlgorithm": "DUPLICATE_DROP", "UnregisteredSeiTimecode": "DISABLED", "GopSizeUnits": "SECONDS", "ParControl": "INITIALIZE_FROM_SOURCE", "NumberBFramesBetweenReferenceFrames": 2, "RepeatPps": "DISABLED" } }, "AfdSignaling": "NONE", "DropFrameTimecode": "ENABLED", "RespondToAfd": "NONE", "ColorMetadata": "INSERT" }, "OutputSettings": { "HlsSettings": { "AudioGroupId": "program_audio", "AudioRenditionSets": "program_audio", "SegmentModifier": "$dt$", "IFrameOnlyManifest": "EXCLUDE" } }, "NameModifier": "_360" }, { "ContainerSettings": { "Container": "M3U8", "M3u8Settings": { "AudioFramesPerPes": 4, "PcrControl": "PCR_EVERY_PES_PACKET", "PmtPid": 480, "PrivateMetadataPid": 503, "ProgramNumber": 1, "PatInterval": 0, "PmtInterval": 0, "TimedMetadata": "NONE", "TimedMetadataPid": 502, "VideoPid": 481, "AudioPids": [ 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492 ] } }, "VideoDescription": { "Width": 960, "ScalingBehavior": "DEFAULT", "Height": 540, "TimecodeInsertion": "DISABLED", "AntiAlias": "ENABLED", "Sharpness": 50, "CodecSettings": { "Codec": "H_264", "H264Settings": { "InterlaceMode": "PROGRESSIVE", "NumberReferenceFrames": 3, "Syntax": "DEFAULT", "Softness": 0, "GopClosedCadence": 1, "GopSize": 2, "Slices": 1, "GopBReference": "DISABLED", "MaxBitrate": 3500000, "SlowPal": "DISABLED", "SpatialAdaptiveQuantization": "ENABLED", "TemporalAdaptiveQuantization": "ENABLED", "FlickerAdaptiveQuantization": "DISABLED", "EntropyEncoding": "CABAC", "FramerateControl": "INITIALIZE_FROM_SOURCE", "RateControlMode": "QVBR", "CodecProfile": "MAIN", "Telecine": "NONE", "MinIInterval": 0, "AdaptiveQuantization": "HIGH", "CodecLevel": "AUTO", "FieldEncoding": "PAFF", "SceneChangeDetect": "TRANSITION_DETECTION", "QualityTuningLevel": "SINGLE_PASS_HQ", "FramerateConversionAlgorithm": "DUPLICATE_DROP", "UnregisteredSeiTimecode": "DISABLED", "GopSizeUnits": "SECONDS", "ParControl": "INITIALIZE_FROM_SOURCE", "NumberBFramesBetweenReferenceFrames": 2, "RepeatPps": "DISABLED" } }, "AfdSignaling": "NONE", "DropFrameTimecode": "ENABLED", "RespondToAfd": "NONE", "ColorMetadata": "INSERT" }, "OutputSettings": { "HlsSettings": { "AudioGroupId": "program_audio", "AudioRenditionSets": "program_audio", "SegmentModifier": "$dt$", "IFrameOnlyManifest": "EXCLUDE" } }, "NameModifier": "_540" }, { "ContainerSettings": { "Container": "M3U8", "M3u8Settings": { "AudioFramesPerPes": 4, "PcrControl": "PCR_EVERY_PES_PACKET", "PmtPid": 480, "PrivateMetadataPid": 503, "ProgramNumber": 1, "PatInterval": 0, "PmtInterval": 0, "TimedMetadata": "NONE", "VideoPid": 481, "AudioPids": [ 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492 ] } }, "VideoDescription": { "Width": 1280, "ScalingBehavior": "DEFAULT", "Height": 720, "TimecodeInsertion": "DISABLED", "AntiAlias": "ENABLED", "Sharpness": 50, "CodecSettings": { "Codec": "H_264", "H264Settings": { "InterlaceMode": "PROGRESSIVE", "NumberReferenceFrames": 3, "Syntax": "DEFAULT", "Softness": 0, "GopClosedCadence": 1, "GopSize": 2, "Slices": 1, "GopBReference": "DISABLED", "MaxBitrate": 5000000, "SlowPal": "DISABLED", "SpatialAdaptiveQuantization": "ENABLED", "TemporalAdaptiveQuantization": "ENABLED", "FlickerAdaptiveQuantization": "DISABLED", "EntropyEncoding": "CABAC", "FramerateControl": "INITIALIZE_FROM_SOURCE", "RateControlMode": "QVBR", "CodecProfile": "MAIN", "Telecine": "NONE", "MinIInterval": 0, "AdaptiveQuantization": "HIGH", "CodecLevel": "AUTO", "FieldEncoding": "PAFF", "SceneChangeDetect": "TRANSITION_DETECTION", "QualityTuningLevel": "SINGLE_PASS_HQ", "FramerateConversionAlgorithm": "DUPLICATE_DROP", "UnregisteredSeiTimecode": "DISABLED", "GopSizeUnits": "SECONDS", "ParControl": "INITIALIZE_FROM_SOURCE", "NumberBFramesBetweenReferenceFrames": 2, "RepeatPps": "DISABLED" } }, "AfdSignaling": "NONE", "DropFrameTimecode": "ENABLED", "RespondToAfd": "NONE", "ColorMetadata": "INSERT" }, "OutputSettings": { "HlsSettings": { "AudioGroupId": "program_audio", "AudioRenditionSets": "program_audio", "SegmentModifier": "$dt$", "IFrameOnlyManifest": "EXCLUDE" } }, "NameModifier": "_720" }, { "ContainerSettings": { "Container": "M3U8", "M3u8Settings": {} }, "AudioDescriptions": [ { "AudioSourceName": "Audio Selector 1", "CodecSettings": { "Codec": "AAC", "AacSettings": { "Bitrate": 96000, "CodingMode": "CODING_MODE_2_0", "SampleRate": 48000 } } } ], "OutputSettings": { "HlsSettings": { "AudioGroupId": "program_audio", "AudioTrackType": "ALTERNATE_AUDIO_AUTO_SELECT_DEFAULT" } }, "NameModifier": "_audio" } ], "OutputGroupSettings": { "Type": "HLS_GROUP_SETTINGS", "HlsGroupSettings": { "ManifestDurationFormat": "INTEGER", "SegmentLength": 6, "TimedMetadataId3Period": 10, "CaptionLanguageSetting": "OMIT", "Destination": "s3://EXAMPLE-BUCKET/HLS/", "DestinationSettings": { "S3Settings": { "AccessControl": { "CannedAcl": "PUBLIC_READ" } } }, "TimedMetadataId3Frame": "PRIV", "CodecSpecification": "RFC_4281", "OutputSelection": "MANIFESTS_AND_SEGMENTS", "ProgramDateTimePeriod": 600, "MinSegmentLength": 0, "DirectoryStructure": "SINGLE_DIRECTORY", "ProgramDateTime": "EXCLUDE", "SegmentControl": "SEGMENTED_FILES", "ManifestCompression": "NONE", "ClientCache": "ENABLED", "StreamInfResolution": "INCLUDE" } } }, { "CustomName": "MP4", "Name": "File Group", "Outputs": [ { "ContainerSettings": { "Container": "MP4", "Mp4Settings": { "CslgAtom": "INCLUDE", "FreeSpaceBox": "EXCLUDE", "MoovPlacement": "PROGRESSIVE_DOWNLOAD" } }, "VideoDescription": { "Width": 1280, "ScalingBehavior": "DEFAULT", "Height": 720, "TimecodeInsertion": "DISABLED", "AntiAlias": "ENABLED", "Sharpness": 100, "CodecSettings": { "Codec": "H_264", "H264Settings": { "InterlaceMode": "PROGRESSIVE", "ParNumerator": 1, "NumberReferenceFrames": 3, "Syntax": "DEFAULT", "Softness": 0, "GopClosedCadence": 1, "HrdBufferInitialFillPercentage": 90, "GopSize": 2, "Slices": 2, "GopBReference": "ENABLED", "HrdBufferSize": 10000000, "MaxBitrate": 5000000, "ParDenominator": 1, "EntropyEncoding": "CABAC", "RateControlMode": "QVBR", "CodecProfile": "HIGH", "MinIInterval": 0, "AdaptiveQuantization": "AUTO", "CodecLevel": "AUTO", "FieldEncoding": "PAFF", "SceneChangeDetect": "ENABLED", "QualityTuningLevel": "SINGLE_PASS_HQ", "UnregisteredSeiTimecode": "DISABLED", "GopSizeUnits": "SECONDS", "ParControl": "SPECIFIED", "NumberBFramesBetweenReferenceFrames": 3, "RepeatPps": "DISABLED", "DynamicSubGop": "ADAPTIVE" } }, "AfdSignaling": "NONE", "DropFrameTimecode": "ENABLED", "RespondToAfd": "NONE", "ColorMetadata": "INSERT" }, "AudioDescriptions": [ { "AudioTypeControl": "FOLLOW_INPUT", "AudioSourceName": "Audio Selector 1", "CodecSettings": { "Codec": "AAC", "AacSettings": { "AudioDescriptionBroadcasterMix": "NORMAL", "Bitrate": 160000, "RateControlMode": "CBR", "CodecProfile": "LC", "CodingMode": "CODING_MODE_2_0", "RawFormat": "NONE", "SampleRate": 48000, "Specification": "MPEG4" } }, "LanguageCodeControl": "FOLLOW_INPUT", "AudioType": 0 } ] } ], "OutputGroupSettings": { "Type": "FILE_GROUP_SETTINGS", "FileGroupSettings": { "Destination": "s3://EXAMPLE-BUCKET/MP4/", "DestinationSettings": { "S3Settings": { "AccessControl": { "CannedAcl": "PUBLIC_READ" } } } } } }, { "CustomName": "Thumbnails", "Name": "File Group", "Outputs": [ { "ContainerSettings": { "Container": "RAW" }, "VideoDescription": { "Width": 1280, "ScalingBehavior": "DEFAULT", "Height": 720, "TimecodeInsertion": "DISABLED", "AntiAlias": "ENABLED", "Sharpness": 50, "CodecSettings": { "Codec": "FRAME_CAPTURE", "FrameCaptureSettings": { "FramerateNumerator": 1, "FramerateDenominator": 5, "MaxCaptures": 500, "Quality": 80 } }, "AfdSignaling": "NONE", "DropFrameTimecode": "ENABLED", "RespondToAfd": "NONE", "ColorMetadata": "INSERT" } } ], "OutputGroupSettings": { "Type": "FILE_GROUP_SETTINGS", "FileGroupSettings": { "Destination": "s3://EXAMPLE-BUCKET/Thumbnails/", "DestinationSettings": { "S3Settings": { "AccessControl": { "CannedAcl": "PUBLIC_READ" } } } } } } ], "AdAvailOffset": 0, "Inputs": [ { "AudioSelectors": { "Audio Selector 1": { "Offset": 0, "DefaultSelection": "DEFAULT", "ProgramSelection": 1 } }, "VideoSelector": { "ColorSpace": "FOLLOW" }, "FilterEnable": "AUTO", "PsiControl": "USE_PSI", "FilterStrength": 0, "DeblockFilter": "DISABLED", "DenoiseFilter": "DISABLED", "TimecodeSource": "EMBEDDED", "FileInput": "s3://EXAMPLE-INPUT-BUCKET/input.mp4" } ] }
  3. batch-transcode 폴더에서 Lambda 함수를 사용하여 파일을 생성합니다. 다음 Python 예제를 사용하여 convert.py 파일 이름을 지정할 수 있습니다.

    S3 Batch Operations는 특정 태스크 데이터를 Lambda 함수로 전송하고 결과 데이터를 다시 요구합니다. Lambda 함수에 대한 요청 및 응답 예제, 응답 및 결과 코드에 대한 정보, S3 Batch Operations의 Lambda 함수 예제는 AWS Lambda 함수 호출을(를) 참조하십시오.

    import json import os from urllib.parse import urlparse import uuid import boto3 """ When you run an S3 Batch Operations job, your job invokes this Lambda function. Specifically, the Lambda function is invoked on each video object listed in the manifest that you specify for the S3 Batch Operations job in Step 5. Input parameter "event": The S3 Batch Operations event as a request for the Lambda function. Input parameter "context": Context about the event. Output: A result structure that Amazon S3 uses to interpret the result of the operation. It is a job response returned back to S3 Batch Operations. """ def handler(event, context): invocation_schema_version = event['invocationSchemaVersion'] invocation_id = event['invocationId'] task_id = event['tasks'][0]['taskId'] source_s3_key = event['tasks'][0]['s3Key'] source_s3_bucket = event['tasks'][0]['s3BucketArn'].split(':::')[-1] source_s3 = 's3://' + source_s3_bucket + '/' + source_s3_key result_list = [] result_code = 'Succeeded' result_string = 'The input video object was converted successfully.' # The type of output group determines which media players can play # the files transcoded by MediaConvert. # For more information, see Creating outputs with AWS Elemental MediaConvert. output_group_type_dict = { 'HLS_GROUP_SETTINGS': 'HlsGroupSettings', 'FILE_GROUP_SETTINGS': 'FileGroupSettings', 'CMAF_GROUP_SETTINGS': 'CmafGroupSettings', 'DASH_ISO_GROUP_SETTINGS': 'DashIsoGroupSettings', 'MS_SMOOTH_GROUP_SETTINGS': 'MsSmoothGroupSettings' } try: job_name = 'Default' with open('job.json') as file: job_settings = json.load(file) job_settings['Inputs'][0]['FileInput'] = source_s3 # The path of each ouput video is constructed based on the values of # the attributes in each object of OutputGroups in the job.json file. destination_s3 = 's3://{0}/{1}/{2}' \ .format(os.environ['DestinationBucket'], os.path.splitext(os.path.basename(source_s3_key))[0], os.path.splitext(os.path.basename(job_name))[0]) for output_group in job_settings['OutputGroups']: output_group_type = output_group['OutputGroupSettings']['Type'] if output_group_type in output_group_type_dict.keys(): output_group_type = output_group_type_dict[output_group_type] output_group['OutputGroupSettings'][output_group_type]['Destination'] = \ "{0}{1}".format(destination_s3, urlparse(output_group['OutputGroupSettings'][output_group_type]['Destination']).path) else: raise ValueError("Exception: Unknown Output Group Type {}." .format(output_group_type)) job_metadata_dict = { 'assetID': str(uuid.uuid4()), 'application': os.environ['Application'], 'input': source_s3, 'settings': job_name } region = os.environ['AWS_DEFAULT_REGION'] endpoints = boto3.client('mediaconvert', region_name=region) \ .describe_endpoints() client = boto3.client('mediaconvert', region_name=region, endpoint_url=endpoints['Endpoints'][0]['Url'], verify=False) try: client.create_job(Role=os.environ['MediaConvertRole'], UserMetadata=job_metadata_dict, Settings=job_settings) # You can customize error handling based on different error codes that # MediaConvert can return. # For more information, see MediaConvert error codes. # When the result_code is TemporaryFailure, S3 Batch Operations retries # the task before the job is completed. If this is the final retry, # the error message is included in the final report. except Exception as error: result_code = 'TemporaryFailure' raise except Exception as error: if result_code != 'TemporaryFailure': result_code = 'PermanentFailure' result_string = str(error) finally: result_list.append({ 'taskId': task_id, 'resultCode': result_code, 'resultString': result_string, }) return { 'invocationSchemaVersion': invocation_schema_version, 'treatMissingKeyAs': 'PermanentFailure', 'invocationId': invocation_id, 'results': result_list }
  4. convert.pyjob.json이(가) 포함된 배포 패키지를 lambda.zip라고 하는 .zip 파일로 생성하려면, 로컬 터미널에서 이전에 생성한 batch-transcode 폴더를 열고 다음 명령을 실행합니다.

    macOS 사용자의 경우 다음 명령을 실행합니다.

    zip -r lambda.zip convert.py job.json

    Windows 사용자의 경우 다음 명령을 실행합니다.

    powershell Compress-Archive convert.py lambda.zip
    powershell Compress-Archive -update job.json lambda.zip

실행 역할을 사용하여 Lambda 함수 생성(콘솔)

  1. https://console.aws.amazon.com/lambda/에서 AWS Lambda 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 함수(Functions)를 선택합니다.

  3. 함수 생성을 선택합니다.

  4. 새로 작성을 선택합니다.

  5. 기본 정보에서 다음과 같이 합니다.

    1. [함수 이름(Function name)]에 tutorial-lambda-convert을 입력합니다.

    2. 런타임Python 3.8 이상 버전을 선택합니다.

  6. 기본 실행 역할 변경(Change default execution role)을 선택하고 실행 역할(Execution role)에서 기존 역할 사용(Use an existing role)을 선택합니다.

  7. 기존 역할에서, 3단계에서 Lambda 함수용으로 생성한 IAM 역할의 이름을 선택합니다(예: tutorial-lambda-transcode-role).

  8. 나머지 설정은 기본값으로 유지합니다.

  9. 함수 생성(Create function)을 선택합니다.

.zip 파일 아카이브를 사용하여 Lambda 함수를 배포하고 Lambda 함수 구성(콘솔)

  1. 생성한 Lambda 함수(예: tutorial-lambda-convert)에 대한 페이지의 코드 소스 섹션에서 업로드 원본을 선택한 후 .zip 파일을 선택합니다.

  2. 업로드(Upload)를 선택하여 로컬 .zip 파일을 선택합니다.

  3. 이전에 생성한 lambda.zip 파일을 선택하고 열기를 선택합니다.

  4. 저장(Save)을 선택합니다.

  5. 런타임 설정(Runtime settings) 섹션에서 편집(Edit)을 선택합니다.

  6. Lambda 함수 코드에서 호출할 핸들러 메서드를 Lambda 런타임에 알리기 위해 핸들러 필드에 convert.handler을(를) 입력합니다.

    Python에서 함수를 구성할 때, 핸들러 설정의 값은 파일의 이름과 핸들러 모듈의 이름이며 점(.)으로 구분됩니다. 예를 들어 convert.handlerconvert.py 파일에 정의된 handler 메서드를 호출합니다.

  7. 저장(Save)을 선택합니다.

  8. Lambda 함수 페이지에서 구성(Configuration) 탭을 선택합니다. 구성 탭의 왼쪽 탐색 창에서 환경 변수를 선택한 다음 편집을 선택합니다.

  9. Add environment variable(환경 변수 추가)을 선택합니다. 그런 후, 다음의 각 환경 변수에 대해 지정된 을 입력합니다.

    • : DestinationBucket : tutorial-bucket-2

      이 값은 1단계에서 생성한 출력 미디어 파일의 S3 버킷입니다.

    • : MediaConvertRole : arn:aws:iam::111122223333:role/tutorial-mediaconvert-role

      이 값은 2단계에서 생성한 MediaConvert용 IAM 역할의 ARN입니다. 이 ARN을 IAM 역할의 실제 ARN으로 바꿔야 합니다.

    • : Application : Batch-Transcoding

      이 값은 애플리케이션의 이름입니다.

  10. 저장(Save)을 선택합니다.

  11. (선택 사항) 구성(Configuration) 탭에서, 왼쪽 탐색 창의 일반 구성(General configuration) 섹션에서 편집(Edit)을 선택합니다. 제한 시간(Timeout) 필드에 20초를 입력합니다. 그런 다음 저장(Save)을 선택합니다.

    제한 시간(Timeout)은 Lambda가 함수를 중지하기까지 호출 실행을 허용하는 시간입니다. 기본값은 3초입니다. 요금은 구성된 메모리 양과 코드가 실행되는 시간을 기준으로 책정됩니다. 자세한 내용은 AWS Lambda 요금을 참조하세요.

5단계: S3 소스 버킷용 Amazon S3 인벤토리 구성

트랜스코딩 Lambda 함수를 설정한 후 비디오 세트를 트랜스코딩하기 위해 S3 Batch Operations 작업을 생성합니다. 먼저 S3 배치 작업에서 지정된 트랜스코딩 작업을 실행할 입력 비디오 객체 목록이 필요합니다. 입력 비디오 객체 목록을 가져오기 위해 S3 소스 버킷에 대한 S3 인벤토리 보고서를 생성할 수 있습니다(예: tutorial-bucket-1).

입력 비디오의 S3 인벤토리 보고서용 버킷 생성 및 구성

S3 소스 버킷의 객체를 나열하는 S3 인벤토리 보고서를 저장하려면 S3 인벤토리 대상 버킷을 만들고 S3 소스 버킷에 인벤토리 파일을 기록하도록 버킷에 대한 버킷 정책을 구성해야 합니다.

  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 버킷(Buckets)을 선택합니다.

  3. 버킷 만들기를 선택합니다.

  4. 버킷 이름에 버킷 이름을 입력합니다(예: tutorial-bucket-3).

  5. AWS 리전은(는) 버킷이 속할 AWS 리전을(를) 선택합니다.

    인벤토리 대상 버킷은 S3 인벤토리를 설정하는 소스 버킷과 동일한 AWS 리전에 있어야 합니다. 인벤토리 대상 버킷은 다른 AWS 계정에 있을 수 있습니다.

  6. 이 버킷에 대한 퍼블릭 액세스 차단 설정에서 기본값 설정을 유지합니다(모든 퍼블릭 액세스 차단이 사용 설정됨).

  7. 나머지 설정은 기본값으로 유지합니다.

  8. 버킷 만들기를 선택합니다.

  9. 버킷(Buckets) 목록에서 방금 생성한 버킷의 이름을 선택합니다(예: tutorial-bucket-3).

  10. 인벤토리 보고서에 대한 데이터를 S3 인벤토리 대상 버킷에 작성할 수 있는 권한을 Amazon S3에 부여하려면 권한 탭을 선택합니다.

  11. 버킷 정책 섹션으로 스크롤을 내린 다음 편집을 선택합니다. 이버킷 정책 페이지가 열립니다.

  12. S3 인벤토리에 대한 권한을 부여하려면 정책 필드에서 다음 버킷 정책을 붙여 넣습니다.

    세 가지 예제 값을 다음 값으로 바꿉니다.

    • 인벤토리 보고서를 저장하기 위해 생성한 버킷의 이름(예: tutorial-bucket-3)

    • 입력 비디오를 저장하는 소스 버킷의 이름입니다(예: tutorial-bucket-1).

    • S3 비디오 소스 버킷을 만드는 데 사용한 AWS 계정 ID입니다(예: 111122223333).

    { "Version":"2012-10-17", "Statement":[ { "Sid":"InventoryAndAnalyticsExamplePolicy", "Effect":"Allow", "Principal": {"Service": "s3.amazonaws.com"}, "Action":"s3:PutObject", "Resource":["arn:aws:s3:::tutorial-bucket-3/*"], "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::tutorial-bucket-1" }, "StringEquals": { "aws:SourceAccount": "111122223333", "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }
  13. [Save changes]를 선택합니다.

S3 비디오 소스 버킷용 Amazon S3 인벤토리 구성

비디오 객체 및 메타데이터의 플랫 파일 목록을 생성하려면 S3 비디오 소스 버킷에 대한 S3 인벤토리를 구성해야 합니다. 이러한 예약된 인벤토리 보고서에는 버킷의 모든 객체 또는 공유 접두사로 그룹화된 객체가 포함될 수 있습니다. 이 자습서에서, S3 인벤토리 보고서에는 S3 소스 버킷의 모든 비디오 객체가 포함됩니다.

  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 버킷(Buckets)을 선택합니다.

  3. S3 소스 버킷에서 입력 비디오에 대한 S3 인벤토리 보고서를 구성하려면 버킷 목록에서 S3 소스 버킷의 이름을 선택합니다(예: tutorial-bucket-1).

  4. [Management] 탭을 선택한 후

  5. 아래의 인벤토리 구성 섹션으로 스크롤하고 인벤토리 구성 생성을 선택합니다.

  6. 인벤토리 구성 이름(Inventory configuration name)에 이름을 입력합니다(예: tutorial-inventory-config).

  7. 인벤토리 범위객체 버전에서 현재 버전만을 선택하고 다른 인벤토리 범위 설정을 이 자습서의 기본값으로 유지합니다.

  8. 보고서 세부 정보 섹션의 대상 버킷에서 이 계정을 선택합니다.

  9. 대상에서 S3 찾아보기를 선택하고, 이전에 생성한 대상 버킷을 선택하여 인벤토리 보고서 저장용으로 선택합니다(예: tutorial-bucket-3). 그런 다음 경로 선택을 선택합니다.

    인벤토리 대상 버킷은 S3 인벤토리를 설정하는 소스 버킷과 동일한 AWS 리전에 있어야 합니다. 인벤토리 대상 버킷은 다른 AWS 계정에 있을 수 있습니다.

    대상(Destination) 버킷 필드에서, 대상 버킷 권한(Destination bucket permission)이 인벤토리 대상 버킷 정책에 추가되어 Amazon S3가 해당 인벤토리 대상 버킷에 데이터를 저장할 수 있습니다. 자세한 정보는 대상 버킷 정책 생성을 참조하십시오.

  10. 빈도일별을 선택합니다.

  11. [출력 형식(Output format)]으로 [CSV]를 선택합니다.

  12. 상태활성을 선택합니다.

  13. 서버 측 암호화 섹션에서 이 자습서에 대해 사용 중지를 선택합니다.

    자세한 정보는 S3 콘솔을 사용하여 인벤토리 구성Amazon S3에 암호화를 위해 AWS KMS key를 사용할 수 있는 권한 부여 단원을 참조하십시오.

  14. 추가 필드 - 선택 사항 섹션에서 크기, 최종 수정 날짜스토리지 클래스를 선택합니다.

  15. 생성(Create)을 선택합니다.

자세한 정보는 S3 콘솔을 사용하여 인벤토리 구성을 참조하십시오.

S3 비디오 소스 버킷에 대한 인벤토리 보고서 확인

인벤토리 보고서가 게시될 때 매니페스트 파일은 S3 인벤토리 대상 버킷으로 전송됩니다.

  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 버킷(Buckets)을 선택합니다.

  3. 버킷(Buckets) 목록에서 비디오 소스 버킷의 이름을 선택합니다(예: tutorial-bucket-1).

  4. 관리를 선택합니다.

  5. S3 인벤토리 보고서가 준비되어 7단계의 S3 Batch Operations 작업을 생성할 수 있는지 확인하려면, 인벤토리 구성에서 매니페스트에서 작업 생성 버튼이 사용 설정되어 있는지 확인합니다.

    참고

    첫 번째 인벤토리 보고서를 전달하는 데 최대 48시간이 걸릴 수 있습니다. 매니페스트에서 작업 생성(Create job from manifest) 버튼이 사용 중지되어 있으면 첫 번째 인벤토리 보고서가 전달되지 않은 것입니다. 첫 번째 인벤토리 보고서가 전달되고 매니페스트에서 작업 생성 버튼이 사용 설정될 때까지 기다린 후 7단계의 S3 Batch Operations 작업을 생성합니다.

  6. S3 인벤토리 보고서(manifest.json)를 확인하려면 대상 열에서 인벤토리 보고서 저장을 위해 이전에 생성한 인벤토리 대상 버킷의 이름을 선택합니다(예: tutorial-bucket-3).

  7. 객체 탭에서 S3 소스 버킷의 이름을 가진 기존 폴더를 선택합니다(예:tutorial-bucket-1). 그런 다음 인벤토리 구성을 이전에 생성했을 때 인벤토리 구성 이름에 입력한 이름을 선택합니다(예:tutorial-inventory-config).

    보고서의 생성 날짜가 해당 이름으로 포함된 폴더 목록을 볼 수 있습니다.

  8. 특정 날짜의 일별 S3 인벤토리 보고서를 확인하려면 해당 생성 날짜 이름이 있는 폴더를 선택한 후 manifest.json을(를) 선택합니다.

  9. 특정 날짜의 인벤토리 보고서에 대한 세부 정보를 확인하려면 manifest.json 페이지에서 다운로드(Download) 또는 열기(Open)를 선택합니다.

6단계: S3 배치 작업용 IAM 역할 생성

S3 Batch Operations를 사용하여 일괄 트랜스코딩을 수행하려면 먼저 Amazon S3에 S3 Batch Operations를 수행할 수 있는 권한을 부여하록 IAM 역할을 생성해야 합니다.

S3 배치 작업용 IAM 정책 생성

입력 매니페스트를 읽고 Lambda 함수를 호출하며 S3 Batch Operations 작업 완료 보고서를 작성할 수 있는 권한을 S3 Batch Operations에 부여하는 IAM 정책을 만들어야 합니다.

  1. AWS Management Console에 로그인하여 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 [Policies]를 선택합니다.

  3. 정책 생성(Create policy)을 선택합니다.

  4. JSON 탭을 선택합니다.

  5. JSON 텍스트 필드에 다음 JSON 정책을 붙여 넣습니다.

    JSON 정책에서 네 가지 예제 값을 다음 값으로 바꿉니다.

    • 입력 비디오를 저장하는 소스 버킷의 이름입니다(예: tutorial-bucket-1).

    • manifest.json 파일을 저장하기 위해 5단계에서 생성한 인벤토리 대상 버킷의 이름(예: tutorial-bucket-3)

    • 출력 미디어 파일을 저장하기 위해 1단계에서 생성한 버킷의 이름입니다(예: tutorial-bucket-2). 이 자습서에서는 출력 미디어 파일의 대상 버킷에 작업 완료 보고서를 저장합니다.

    • 4단계에서 생성한 Lambda 함수의 역할 ARN Lambda 함수의 역할 ARN을 찾아 복사하려면 다음을 수행합니다.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "S3Get", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": [ "arn:aws:s3:::tutorial-bucket-1/*", "arn:aws:s3:::tutorial-bucket-3/*" ] }, { "Sid": "S3PutJobCompletionReport", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::tutorial-bucket-2/*" }, { "Sid": "S3BatchOperationsInvokeLambda", "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:us-west-2:111122223333:function:tutorial-lambda-convert" ] } ] }
  6. 다음: 태그를 선택합니다.

  7. 다음: 검토(Next: Review)를 선택합니다.

  8. 이름 필드에 tutorial-s3batch-policy을 입력합니다.

  9. 정책 생성(Create policy)을 선택합니다.

S3 Batch Operation IAM 역할 생성 및 권한 정책 연결

  1. AWS Management Console에 로그인하여 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 역할을 선택한 다음, 역할 생성을 선택합니다.

  3. AWS 서비스 역할 유형을 선택한 다음, S3 서비스를 선택합니다.

  4. 사용 사례 선택(Select your use case)에서 S3 배치 작업(S3 Batch Operations)을 선택합니다.

  5. Next: Permissions(다음: 권한)를 선택합니다.

  6. 권한 정책 연결에서 검색 상자에 이전에 생성한 IAM 정책의 이름(예:tutorial-s3batch-policy)을 입력하여 정책 목록을 필터링합니다. 정책 이름 옆에 있는 확인란을 선택합니다(예:tutorial-s3batch-policy).

  7. 다음: 태그를 선택합니다.

  8. 다음: 검토(Next: Review)를 선택합니다.

  9. [역할 이름(Role name)]에 tutorial-s3batch-role을 입력합니다.

  10. 역할 생성(Create role)을 선택합니다.

    S3 Batch Operations용 IAM 역할을 생성한 후 다음 신뢰 정책이 해당 역할에 자동으로 연결됩니다. 이 신뢰 정책은 S3 Batch Operations 서비스 보안 주체가 IAM 역할을 수임하도록 허용합니다.

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":"batchoperations.s3.amazonaws.com" }, "Action":"sts:AssumeRole" } ] }

7단계: S3 배치 작업 생성 및 실행

S3 소스 버킷의 입력 비디오를 처리하기 위해 S3 Batch Operations 작업을 만들려면 이 특정 작업에 대한 파라미터를 지정해야 합니다.

참고

S3 Batch Operations 작업 생성을 시작하려면 매니페스트에서 작업 생성 버튼이 사용 설정되어 있는지 확인합니다. 자세한 정보는 S3 비디오 소스 버킷에 대한 인벤토리 보고서 확인을 참조하십시오. 매니페스트에서 작업 생성 버튼이 사용 중지되어 있으면 첫 번째 인벤토리 보고서가 전달되지 않은 것이며, 버튼이 사용 설정될 때까지 기다려야 합니다. 5단계에서 S3 소스 버킷에 대한 Amazon S3 인벤토리를 구성한 후, 첫 번째 인벤토리 보고서를 전달하는 데 최대 48시간이 걸릴 수 있습니다.

S3 배치 작업 생성

  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 Batch Operations를 선택합니다.

  3. 작업 생성(Create job)을 선택합니다.

  4. AWS 리전은 작업을 생성하려는 리전을 선택합니다.

    이 자습서에서 S3 Batch Operations 작업을 사용하여 Lambda 함수를 호출하려면 매니페스트에서 참조된 객체가 있는 S3 비디오 소스 버킷과 동일한 리전에서 작업을 생성해야 합니다.

  5. 매니페스트 섹션에서 다음을 수행합니다.

    1. 매니페스트 형식(Manifest format)에서 S3 인벤토리 보고서(S3 Inventory report)(manifest.json)를 선택합니다.

    2. 매니페스트 객체에서 S3 찾아보기를 선택하여 인벤토리 보고서 저장을 위해 5단계에서 생성한 버킷을 찾습니다(예: tutorial-bucket-3). 매니페스트 객체 페이지에서 특정 날짜에 대한 manifest.json 파일을 찾을 때까지 객체 이름을 탐색합니다. 이 파일에는 일괄 트랜스코딩하려는 모든 비디오에 대한 정보가 나열됩니다. 사용할 manifest.json 파일을 찾으면, 옆에 있는 옵션 버튼을 선택합니다. 그런 다음 경로 선택을 선택합니다.

    3. (선택 사항) 최신 버전이 아닌 버전을 사용하려는 경우, 매니페스트 객체 버전 ID - 선택 사항에서 매니페스트 객체의 버전 ID를 입력합니다.

  6. 다음을 선택합니다.

  7. Lambda 함수를 사용하여 선택된 manifest.json 파일에 나열된 모든 객체를 트랜스코딩하려면 작업 유형에서 AWS Lambda 함수 호출을 선택합니다.

  8. Lambda 함수 호출 섹션에서 다음을 수행합니다.

    1. 계정의 함수에서 선택(Choose from functions in your account)을 선택합니다.

    2. Lambda 함수에서, 4단계에서 생성한 Lambda 함수를 선택합니다(예: tutorial-lambda-convert).

    3. Lambda 함수 버전에서, 기본값 $LATEST를 유지합니다.

  9. 다음을 선택합니다. 추가 옵션 구성 페이지가 열립니다.

  10. 추가 옵션 섹션에서 기본값 설정을 유지합니다.

    이러한 옵션에 대한 자세한 내용은 배치 작업 요청 요소 섹션을 참조하세요.

  11. 보고서 완료섹션에서 완료 보고서 대상 경로S3 찾아보기를 선택합니다. 1단계에서 출력 미디어 파일에 대해 생성한 버킷을 찾습니다(예: tutorial-bucket-2). 해당 버킷 이름 옆에 있는 옵션 버튼을 선택합니다. 그런 다음 경로 선택을 선택합니다.

    나머지 완료 보고서 설정은 기본값을 유지합니다. 완료 보고서 설정에 대한 자세한 내용은 배치 작업 요청 요소 섹션을 참조하세요. 완료 보고서는 작업 세부 정보 및 수행된 작업의 레코드를 유지 관리합니다.

  12. 권한 섹션에서, 기존 IAM 역할에서 선택을 선택합니다. IAM 역할(IAM role)에서, 6단계에서 생성한 S3 배치 작업의 IAM 역할을 선택합니다(예: tutorial-s3batch-role).

  13. 다음을 선택합니다.

  14. 검토 페이지에서 설정을 검토합니다. 그런 다음 작업 생성을 선택합니다.

    S3가 S3 Batch Operations 작업의 매니페스트 읽기를 마치면, 작업의 상태실행 확인을 기다리는 중으로 설정합니다. 작업 상태에 대한 업데이트를 보려면 페이지를 새로 고칩니다. 작업의 상태가 실행 확인을 기다리는 중일 때까지 작업을 실행할 수 없습니다..

S3 배치 작업을 실행하여 Lambda 함수 호출

배치 작업을 실행하여 비디오 트랜스코딩을 위한 Lambda 함수를 호출합니다. 작업이 실패하면 완료 보고서를 확인하여 원인을 파악할 수 있습니다.

S3 배치 작업 실행

  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 Batch Operations를 선택합니다.

  3. 작업 목록의 첫 번째 행에서, 이전에 생성한 S3 Batch Operations 작업의 작업 ID를 선택합니다.

  4. 작업 실행(Run job)을 선택합니다.

  5. 작업 파라미터를 다시 검토하고 매니페스트에 나열된 총 객체(Total objects listed in manifest)의 값이 매니페스트의 객체 수와 동일한지 확인합니다. 그런 다음 작업 실행을 선택합니다.

    S3 배치 작업 페이지가 열립니다.

  6. 작업 실행이 시작된 후 작업 페이지의 상태(Status)에서 상태, % 완료, 총 성공(비율), 총 실패(비율), 종료 날짜, 종료 이유와 같은 S3 배치 작업 진행 상황을 확인합니다.

    S3 Batch Operations 작업이 완료되면 작업 페이지의 데이터를 보고 작업이 예상대로 완료되었는지 확인합니다.

    1,000개 이상의 작업이 시도된 후 S3 Batch Operations 작업의 객체 작업 중 50 퍼센트 이상이 실패하면 작업이 자동으로 실패합니다. 완료 보고서를 확인하여 실패의 원인을 파악하려면 아래의 선택적 절차를 사용하세요.

(선택 사항) 완료 보고서 확인

완료 보고서를 사용하여 실패한 객체와 실패의 원인을 확인할 수 있습니다.

실패한 객체에 대한 세부 정보를 완료 보고서에서 확인하려면 다음을 수행합니다.

  1. S3 Batch Operations 작업 페이지에서 아래 완료 보고서 섹션으로 스크롤하고 완료 보고서 대상의 링크를 선택합니다.

    S3 출력 대상 버킷 페이지가 열립니다.

  2. 객체 탭에서, 이전에 생성한 S3 Batch Operations 작업의 작업 ID로 끝나는 이름이 있는 폴더를 선택합니다.

  3. results/를 선택합니다.

  4. .csv 파일 옆의 확인란을 선택합니다.

  5. 작업 보고서를 보려면 열기 또는 다운로드를 선택합니다.

(선택 사항) Lambda 콘솔에서 각 Lambda 호출 모니터링

S3 Batch Operations 작업 실행이 시작되면 작업이 각 입력 비디오 객체에 대해 Lambda 함수를 호출합니다. S3는 각 Lambda 호출 로그를 CloudWatch Logs에 기록합니다. Lambda 콘솔의 모니터링 대시보드를 사용하여 Lambda 함수를 모니터링할 수 있습니다.

  1. https://console.aws.amazon.com/lambda/에서 AWS Lambda 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 함수(Functions)를 선택합니다.

  3. 함수 목록에서, 4단계에서 생성한 Lambda 함수의 이름을 선택합니다(예, tutorial-lambda-convert).

  4. 모니터링 탭을 선택합니다.

  5. 지표(Metrics)에서 Lambda 함수의 런타임 지표를 참조하세요.

  6. 로그(Logs)에서, CloudWatch Logs 인사이트를 통해 각 Lambda 호출에 대한 로그 데이터를 봅니다.

    참고

    Lambda 함수와 함께 S3 배치 작업을 사용하면 각 객체에서 Lambda 함수가 호출됩니다. S3 배치 작업이 큰 경우 동시에 여러 Lambda 함수를 호출하여 Lambda 동시성이 급증할 수 있습니다.

    각 AWS 계정은(는) 리전당 Lambda 동시성 할당량이 있습니다. 자세한 내용은 AWS Lambda개발자 안내서AWS Lambda함수 크기 조정을 참조하세요. S3 배치 작업에 Lambda 함수를 사용하는 모범 사례는 Lambda 함수 자체에 동시성 제한을 설정하는 것입니다. 동시성 제한을 설정하면 작업에서 대부분의 Lambda 동시성을 소비하여 잠재적으로 계정의 다른 함수를 제한하는 상황을 방지할 수 있습니다. 자세한 내용은 AWS Lambda개발자 안내서Lambda 예약된 동시성 관리 단원을 참조하십시오.

(선택 사항) MediaConvert 콘솔에서 각 MediaConvert 비디오 트랜스코딩 작업 모니터링

MediaConvert 작업은 미디어 파일을 트랜스코딩하는 작업을 수행합니다. S3 Batch Operations 작업에서 각 비디오에 대해 Lambda 함수를 호출하면 각 Lambda 함수 호출은 각 입력 비디오에 대해 MediaConvert 트랜스코딩 작업을 만듭니다.

  1. AWS Management Console에 로그인하고 https://console.aws.amazon.com/mediaconvert/에서 MediaConvert 콘솔을 엽니다.

  2. MediaConvert 소개 페이지가 나타나면 시작하기(Get Started)를 선택합니다.

  3. 작업(Jobs) 목록에서 각 행을 확인하여 각 입력 비디오의 트랜스코딩 작업을 모니터링합니다.

  4. 확인하려는 작업의 행을 식별하고 작업 ID 링크를 선택하여 작업 세부 정보 페이지를 엽니다.

  5. 작업 요약(Job summary) 페이지의 출력(Outputs)에서, 브라우저에서 지원되는 항목에 따라 HLS, MP4 또는 썸네일 출력에 대한 링크를 선택하여 출력 미디어 파일의 S3 대상 버킷으로 이동합니다.

  6. S3 출력 대상 버킷의 해당 폴더(HLS, MP4 또는 썸네일)에서 출력 미디어 파일 객체의 이름을 선택합니다.

    객체 세부 정보 페이지가 열립니다.

  7. 객체 세부 정보 페이지의 객체 개요에서 객체 URL의 링크를 선택하여 트랜스코딩된 출력 미디어 파일을 봅니다.

8단계: S3 대상 버킷의 출력 미디어 파일 확인

S3 대상 버킷의 출력 미디어 파일을 확인하려면 다음을 수행합니다.

  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 버킷(Buckets)을 선택합니다.

  3. 버킷 목록에서, 1단계에서 생성한 출력 미디어 파일에 대한 S3 대상 버킷의 이름을 선택합니다(예: tutorial-bucket-2).

  4. 객체(Objects) 탭에서, 각 입력 비디오에는 입력 비디오의 이름이 있는 폴더가 있습니다. 각 폴더에는 입력 비디오의 트랜스코딩된 출력 미디어 파일이 포함되어 있습니다.

    입력 비디오의 출력 미디어 파일을 확인하려면 다음을 수행합니다.

    1. 확인하려는 입력 비디오의 이름이 있는 폴더를 선택합니다.

    2. Default/ 폴더를 선택합니다.

    3. 트랜스코딩된 형식의 폴더(이 자습서의 HLS, MP4 또는 썸네일)를 선택합니다.

    4. 출력 미디어 파일의 이름을 선택합니다.

    5. 객체 세부 정보 페이지에서 트랜스코딩된 파일을 보려면 객체 URL의 링크를 선택합니다.

      HLS 형식의 출력 미디어 파일은 짧은 세그먼트로 분할됩니다. 이 비디오를 재생하려면, 호환 플레이어에 .m3u8 파일의 객체 URL을 포함합니다.

9단계: 정리

S3 배치 작업, Lambda 및 MediaConvert를 학습 연습으로만 사용하여 비디오를 트랜스코딩한 경우 더 이상 요금이 발생하지 않도록 할당한 AWS 리소스를 삭제합니다.

S3 소스 버킷의 S3 인벤토리 구성 삭제

  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 버킷(Buckets)을 선택합니다.

  3. 버킷(Buckets) 목록에서 소스 버킷의 이름을 선택합니다(예: tutorial-bucket-1).

  4. [Management] 탭을 선택한 후

  5. 인벤토리 구성 섹션에서, 5단계에서 생성한 인벤토리 구성 옆의 옵션 버튼을 선택합니다(예: tutorial-inventory-config).

  6. 삭제(Delete)를 선택한 후 확인(Confirm)을 선택합니다.

Lambda 함수를 삭제하려면

  1. https://console.aws.amazon.com/lambda/에서 AWS Lambda 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 함수(Functions)를 선택합니다.

  3. 4단계에서 생성한 함수 옆의 확인란을 선택합니다(예: tutorial-lambda-convert).

  4. [ Actions]를 선택한 후 [Delete]를 선택합니다.

  5. 함수 삭제(Delete function) 대화 상자에서 삭제(Delete)를 선택합니다.

CloudWatch 로그 그룹 삭제

  1. https://console.aws.amazon.com/cloudwatch/에서 CloudWatch 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 로그를 선택한 다음, 로그 그룹을 선택합니다.

  3. 4단계에서 생성한 Lambda 함수로 끝나는 이름의 로그 그룹 옆에 있는 확인란을 선택합니다(예: tutorial-lambda-convert).

  4. 작업(Actions)을 선택한 후 로그 그룹 삭제(Delete log group(s))를 선택합니다.

  5. 로그 그룹 삭제(Delete log group(s)) 대화 상자에서 삭제(Delete)를 선택합니다.

IAM 역할에 대한 인라인 정책과 함께 IAM 역할 삭제

2단계, 3단계6단계에서 생성한 IAM 역할을 삭제하려면 다음을 수행합니다.

  1. AWS Management Console에 로그인하여 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 역할을 선택한 후 삭제할 역할 이름 옆에 있는 확인란을 선택합니다.

  3. 페이지 상단에서 삭제(Delete)를 선택합니다.

  4. 확인 대화 상자에서, 안내 메시지에 따라 필요한 응답을 텍스트 입력 필드에 입력한 후 삭제(Delete)를 선택합니다.

고객 관리형 IAM 정책 삭제

6단계에서 생성한 고객 관리형 IAM 정책을 삭제하려면 다음을 수행합니다.

  1. AWS Management Console에 로그인하여 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 [Policies]를 선택합니다.

  3. 6단계에서 생성한 정책 옆에 있는 옵션 버튼을 선택합니다(예: tutorial-s3batch-policy). 검색 상자를 사용하여 정책 목록을 필터링할 수 있습니다.

  4. [ Actions]를 선택한 후 [Delete]를 선택합니다.

  5. 텍스트 필드에 해당 이름을 입력하여 이 정책을 삭제할 것인지 확인한 후 삭제를 선택합니다.

S3 버킷 비우기

사전 조건, 1단계5단계에서 생성한 S3 버킷을 비우려면 다음을 수행합니다.

  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 버킷(Buckets)을 선택합니다.

  3. 버킷 목록에서, 비우려는 버킷의 이름 옆에 있는 옵션 버튼을 선택한 후 비우기를 선택합니다.

  4. 버킷 비우기 페이지에서 텍스트 필드에 permanently delete를 입력하여 해당 버킷 비우기를 확인한 후 비우기를 선택합니다.

S3 버킷 삭제

사전 조건, 1단계5단계에서 생성한 S3 버킷을 삭제하려면 다음을 수행합니다.

  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 버킷(Buckets)을 선택합니다.

  3. 버킷 목록에서, 삭제할 버킷의 이름 옆에 있는 옵션 버튼을 선택합니다.

  4. 삭제를 선택합니다.

  5. 버킷 삭제(Delete bucket) 페이지의 텍스트 필드에 버킷 이름을 입력하여 버킷의 삭제 여부를 확인한 다음 버킷 삭제(Delete bucket)를 선택합니다.

다음 단계

이 자습서를 완료한 후 다른 관련 사용 사례를 자세히 살펴볼 수 있습니다.