在Lambda Python MediaConvert函数上设置ACL
我使用以下Python和json媒体转换作业来运行AWS媒体转换作业。(我遵循的原始指南是) MediaConvert作业创建的新文件上的ACL应为在Lambda Python MediaConvert函数上设置ACL,python,amazon-web-services,amazon-s3,aws-lambda,aws-elemental,Python,Amazon Web Services,Amazon S3,Aws Lambda,Aws Elemental,我使用以下Python和json媒体转换作业来运行AWS媒体转换作业。(我遵循的原始指南是) MediaConvert作业创建的新文件上的ACL应为ACL:“公共读取”,但我无法设置此值。由于这个bucket上的文件夹结构的复杂性,我更愿意在文件上分配这个权限,而不是一个bucket权限(我知道S3上没有真正的文件夹) Convert.py #!/usr/bin/env python import glob import json import os import uuid import bot
ACL:“公共读取”
,但我无法设置此值。由于这个bucket上的文件夹结构的复杂性,我更愿意在文件上分配这个权限,而不是一个bucket权限(我知道S3上没有真正的文件夹)
Convert.py
#!/usr/bin/env python
import glob
import json
import os
import uuid
import boto3
import datetime
import random
import urlparse
from botocore.client import ClientError
def handler(event, context):
assetID = str(uuid.uuid4())
sourceS3Bucket = event['Records'][0]['s3']['bucket']['name']
sourceS3Key = event['Records'][0]['s3']['object']['key']
sourceS3 = 's3://'+ sourceS3Bucket + '/' + sourceS3Key
sourceS3Basename = os.path.splitext(os.path.basename(sourceS3))[0]
destinationS3 = 's3://' + os.environ['DestinationBucket']
destinationS3basename = os.path.splitext(os.path.basename(destinationS3))[0]
mediaConvertRole = os.environ['MediaConvertRole']
region = os.environ['AWS_DEFAULT_REGION']
statusCode = 200
body = {}
# Use MediaConvert SDK UserMetadata to tag jobs with the assetID
# Events from MediaConvert will have the assetID in UserMedata
jobMetadata = {'assetID': assetID}
print (json.dumps(event))
try:
# Job settings are in the lambda zip file in the current working directory
with open('job.json') as json_data:
jobSettings = json.load(json_data)
print(jobSettings)
# get the account-specific mediaconvert endpoint for this region
mc_client = boto3.client('mediaconvert', region_name=region)
endpoints = mc_client.describe_endpoints()
# add the account-specific endpoint to the client session
client = boto3.client('mediaconvert', region_name=region, endpoint_url=endpoints['Endpoints'][0]['Url'], verify=False)
# Update the job settings with the source video from the S3 event and destination
# paths for converted videos
jobSettings['Inputs'][0]['FileInput'] = sourceS3
S3KeyWatermark = 'encoded-video/mp4/' + sourceS3Basename
jobSettings['OutputGroups'][0]['OutputGroupSettings']['FileGroupSettings']['Destination'] \
= destinationS3 + '/' + S3KeyWatermark
S3KeyThumbnails = 'encoded-video/poster/' + sourceS3Basename
jobSettings['OutputGroups'][1]['OutputGroupSettings']['FileGroupSettings']['Destination'] \
= destinationS3 + '/' + S3KeyThumbnails
print('jobSettings:')
print(json.dumps(jobSettings))
# Convert the video using AWS Elemental MediaConvert
job = client.create_job(Role=mediaConvertRole, UserMetadata=jobMetadata, Settings=jobSettings)
print (json.dumps(job, default=str))
except Exception as e:
print 'Exception: %s' % e
statusCode = 500
raise
finally:
return {
'statusCode': statusCode,
'body': json.dumps(body),
'headers': {'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*'}
}
job.json
{
"OutputGroups": [
{
"CustomName": "MP4",
"Name": "File Group",
"Outputs": [
{
"ContainerSettings": {
"Container": "MP4",
"Mp4Settings": {
"CslgAtom": "INCLUDE",
"FreeSpaceBox": "EXCLUDE",
"MoovPlacement": "PROGRESSIVE_DOWNLOAD"
}
},
"VideoDescription": {
"Width": 720,
"Height": 480,
"ScalingBehavior": "DEFAULT",
"TimecodeInsertion": "DISABLED",
"AntiAlias": "ENABLED",
"Sharpness": 50,
"CodecSettings": {
"Codec": "H_264",
"H264Settings": {
"InterlaceMode": "PROGRESSIVE",
"NumberReferenceFrames": 3,
"Syntax": "DEFAULT",
"Softness": 0,
"GopClosedCadence": 1,
"GopSize": 90,
"Slices": 1,
"GopBReference": "DISABLED",
"SlowPal": "DISABLED",
"SpatialAdaptiveQuantization": "ENABLED",
"TemporalAdaptiveQuantization": "ENABLED",
"FlickerAdaptiveQuantization": "DISABLED",
"EntropyEncoding": "CABAC",
"Bitrate": 3000000,
"FramerateControl": "INITIALIZE_FROM_SOURCE",
"RateControlMode": "CBR",
"CodecProfile": "MAIN",
"Telecine": "NONE",
"MinIInterval": 0,
"AdaptiveQuantization": "HIGH",
"CodecLevel": "AUTO",
"FieldEncoding": "PAFF",
"SceneChangeDetect": "ENABLED",
"QualityTuningLevel": "SINGLE_PASS",
"FramerateConversionAlgorithm": "DUPLICATE_DROP",
"UnregisteredSeiTimecode": "DISABLED",
"GopSizeUnits": "FRAMES",
"ParControl": "INITIALIZE_FROM_SOURCE",
"NumberBFramesBetweenReferenceFrames": 2,
"RepeatPps": "DISABLED"
}
},
"AfdSignaling": "NONE",
"DropFrameTimecode": "ENABLED",
"RespondToAfd": "NONE",
"ColorMetadata": "INSERT"
},
"AudioDescriptions": [
{
"AudioTypeControl": "FOLLOW_INPUT",
"CodecSettings": {
"Codec": "AAC",
"AacSettings": {
"AudioDescriptionBroadcasterMix": "NORMAL",
"Bitrate": 96000,
"RateControlMode": "CBR",
"CodecProfile": "LC",
"CodingMode": "CODING_MODE_2_0",
"RawFormat": "NONE",
"SampleRate": 48000,
"Specification": "MPEG4"
}
},
"LanguageCodeControl": "FOLLOW_INPUT"
}
]
}
],
"OutputGroupSettings": {
"Type": "FILE_GROUP_SETTINGS",
"FileGroupSettings": {
"Destination": "s3://<MEDIABUCKET>/assets/VANLIFE/MP4/"
}
}
},
{
"CustomName": "Thumbnails",
"Name": "File Group",
"Outputs": [
{
"ContainerSettings": {
"Container": "RAW"
},
"VideoDescription": {
"Width": 720,
"ScalingBehavior": "DEFAULT",
"Height": 480,
"TimecodeInsertion": "DISABLED",
"AntiAlias": "ENABLED",
"Sharpness": 50,
"CodecSettings": {
"Codec": "FRAME_CAPTURE",
"FrameCaptureSettings": {
"FramerateNumerator": 1,
"FramerateDenominator": 1,
"MaxCaptures": 1,
"Quality": 80
}
},
"AfdSignaling": "NONE",
"DropFrameTimecode": "ENABLED",
"RespondToAfd": "NONE",
"ColorMetadata": "INSERT"
}
}
],
"OutputGroupSettings": {
"Type": "FILE_GROUP_SETTINGS",
"FileGroupSettings": {
"Destination": "s3://<MEDIABUCKET>/assets/VANLIFE/Thumbnails/"
}
}
}
],
"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://rodeolabz-us-west-2/vodconsole/VANLIFE.m2ts"
}
]
}
{
“输出组”:[
{
“CustomName”:“MP4”,
“名称”:“文件组”,
“产出”:[
{
“集装箱设置”:{
“容器”:“MP4”,
“Mp4Settings”:{
“CslgAtom”:“包括”,
“FreeSpaceBox”:“排除”,
“MoovPlacement”:“渐进式下载”
}
},
“视频描述”:{
“宽度”:720,
“高度”:480,
“缩放行为”:“默认值”,
“TimecodeInsertion”:“已禁用”,
“反别名”:“已启用”,
“锐度”:50,
“编解码器设置”:{
“编解码器”:“H_264”,
“H264设置”:{
“中间模式”:“渐进式”,
“NumberReferenceFrames”:3,
“语法”:“默认值”,
“柔软”:0,
“GopClosedCadence”:1,
“GopSize”:90,
"切片":一,,
“GopBReference”:“DISABLED”,
“SlowPal”:“已禁用”,
“空间自适应均衡”:“已启用”,
“临时自适应均衡化”:“已启用”,
“闪烁自适应量化”:“已禁用”,
“ENTROPYENCODE”:“CABAC”,
“比特率”:3000000,
“FramerateControl”:“从\u源初始化\u”,
“费率控制模式”:“CBR”,
“CodecProfile”:“MAIN”,
“电视电影”:“无”,
“最小间隔”:0,
“自适应量化”:“高”,
“编解码器级别”:“自动”,
“字段编码”:“PAFF”,
“SceneChangeDetect”:“已启用”,
“质量单级”:“单级”,
“FramerateConversionAlgorithm”:“重复放置”,
“未注册SEITIMECODE”:“已禁用”,
“GopSizeUnits”:“帧”,
“ParControl”:“从源初始化”,
“参考框架之间的NumberFrames”:2,
“RepeatPps”:“已禁用”
}
},
“AFD信号”:“无”,
“DropFrameTimecode”:“已启用”,
“RespondToAfd”:“无”,
“ColorMetadata”:“插入”
},
“音频描述”:[
{
“AudioTypeControl”:“跟随输入”,
“编解码器设置”:{
“编解码器”:“AAC”,
“AAC设置”:{
“AudioDescriptionBroadcasterMix”:“正常”,
“比特率”:96000,
“费率控制模式”:“CBR”,
“编解码器配置文件”:“LC”,
“编码模式”:“编码模式2\0”,
“原始格式”:“无”,
“采样器”:48000,
“规范”:“MPEG4”
}
},
“LanguageCodeControl”:“跟随输入”
}
]
}
],
“OutputGroupSettings”:{
“类型”:“文件组设置”,
“FileGroupSettings”:{
“目的地”:“s3:///assets/VANLIFE/MP4/”
}
}
},
{
“CustomName”:“缩略图”,
“名称”:“文件组”,
“产出”:[
{
“集装箱设置”:{
“容器”:“未加工”
},
“视频描述”:{
“宽度”:720,
“缩放行为”:“默认值”,
“高度”:480,
“TimecodeInsertion”:“已禁用”,
“反别名”:“已启用”,
“锐度”:50,
“编解码器设置”:{
“编解码器”:“帧捕获”,
“FrameCaptureSettings”:{
“FramerateNumerator”:1,
“FramerateDenominator”:1,
"马克斯":1,,
“质量”:80
}
},
“AFD信号”:“无”,
“DropFrameTimecode”:“已启用”,
“RespondToAfd”:“无”,
“ColorMetadata”:“插入”
}
}
],
“OutputGroupSettings”:{
“类型”:“文件组设置”,
“FileGroupSettings”:{
“目的地”:“s3:///assets/VANLIFE/Thumbnails/”
}
}
}
],
“AdAvailOffset”:0,
“投入”:[
{
“音频选择器”:{
“音频选择器1”:{
“偏移量”:0,
“DefaultSelection”:“DEFAULT”,
“程序选择”:1
}
},
“视频选择器”:{
“颜色空间”:“跟随”
},
“可过滤”:“自动”,
“PSI控制”:“使用PSI”,
“过滤器强度”:0,
“解除锁定筛选器”:“已禁用”,
“DenoiseFilter”:“已禁用”,
“TimecodeSource”:“嵌入式”,
“文件输入”:“s3://rodeolabz-us-west-2/vodconsole/VANLIFE.m2ts”
}
]
}
当然,如果公共访问可以限制在此存储桶中的以下“文件夹”,我也愿意接受存储桶策略建议
<BUCKET>/videos
<BUCKET>/encoded-video/mp4
<BUCKET>/encoded-video/poster
/视频
/编码视频/mp4
/编码视频/海报
非常感谢 您可以尝试以下策略(未测试): 有关亚马逊如何授权buc的更多信息
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"PublicAccessToFolders",
"Effect":"Allow",
"Principal":"*",
"Action":["s3:GetObject"],
"Resource":[
"arn:aws:s3:::examplebucket/videos/*",
"arn:aws:s3:::examplebucket/encoded-video/mp4/*",
"arn:aws:s3:::examplebucket/encoded-video/poster/*",
]
}
]
}