使用waiter.wait

时间:2017-03-30 23:09:30

标签: python amazon-web-services lambda amazon-elastic-transcoder

我正在使用lambda函数来运行AWS弹性转码器。

如果我执行以下操作,该功能正常工作:

def lambda_handler(event, context):

  transcoder = boto3.client('elastictranscoder', REGION_NAME)
  pipeline_id = get_pipeline(transcoder, PIPELINE)

  input_file = os.path.basename(event['Records'][0]['s3']['object']['key'])
  filename_without_extension = os.path.splitext(input_file)[0]

  job = transcoder.create_job(
      PipelineId=pipeline_id,
      Input={
          'Key': 'uploads/' + input_file,
          'FrameRate': 'auto',
          'Resolution': 'auto',
          'AspectRatio': 'auto',
          'Interlaced': 'auto',
          'Container' : 'auto'
      },
      Outputs=[{
          'Key': filename_without_extension + '.mp4',
          'PresetId': '1487545782241-6uy45r',
      }]
  )

但是,我想要做的是在转码完成后删除原始文件。

(由Deleting a file after transcoding with AWS Lambda and Elastic Transcoder推荐)

我正在尝试使用waiter.wait()函数,但如果我将以下内容添加到代码的末尾:

job_id = job['Job']['Id']
waiter = transcoder.get_waiter('job_complete')
waiter.wait(Id=job_id)

然后我的工作重新提交?基本上相同的工作在Elastic Transcoder中重新出现,但由于输出文件已经存在而失败。云监视日志显示作为同一lambda执行的一部分再次运行作业。

如何在不重新提交作业的情况下使用waiter.wait方法让我知道作业何时完成?

1 个答案:

答案 0 :(得分:1)

您需要在管道设置下订阅完成通知。通知必须启动一个新的lambda函数来处理您的自定义逻辑。

enter image description here

您再次提交相同作业的原因是因为如果lambda函数执行失败(通过调用带有错误的完成块,超时等),lambda将自动重试该函数两次相同的事件退缩期。