パラメータエラー以外でcreate_jobに失敗しないと思っていましたが、処理できないファイル(サポートされていないコーデックやコンテナ)をアップロードすると例外が発生するので、フロントに返せるように処理してみました。
Lambdaの例外エラーをメールとSlackに通知する でエラーに気付きやすくなりました。
例外通知は大事ですね。
通知メッセージ

〜省略〜

BadRequestException
An error occurred (BadRequestException) when calling the CreateJob operation: /inputs/0/fileInput: For your input file location, provide a valid URL to a supported input file. Valid URLs are S3, http, or https. For valid input file types, see https://docs.aws.amazon.com/console/mediaconvert/reference-codecs-containers-input.
createMediaConvertJob
例外をキャッチして、DynamoDBにエラーメッセージを保存。
フロントでジョブIDを取得する際に取得できるようにしました。
最新のコードこちら → https://dev.azure.com/nightonly/_git/lambda-origin?path=/createMediaConvertJob/lambda_function.py
# MediaConvertジョブ作成
mediaconvertClient = boto3.client('mediaconvert', endpoint_url = MEDIACONVERT_ENDPOINT_URL)
+ try:
result = mediaconvertClient.create_job(
Role = MEDIACONVERT_ROLE,
JobTemplate = MEDIACONVERT_JOB_TEMPLATE,
Settings = settings
)
print(result)
+ except Exception as e: # Tips: コーデックやコンテナがサポート対象外だとBadRequestExceptionになる
+ update_table_to_job_id(str(e), input_file, creation_time, expiration_time)
+ return
+ # DynamoDBにエラーメッセージ保存 Tips: フロントにエラーを返却するのに使用
+ def update_table_to_job_id(error_message, input_file, creation_time, expiration_time):
+ print(error_message)
+ print(table_to_job_id.update_item(
+ Key = {
+ 'InputFile': input_file
+ },
+ UpdateExpression = 'set ErrorMessage = :error_message,'
+ + ' CreationTime = :creation_time, ExpirationTime = :expiration_time',
+ ExpressionAttributeValues = {
+ ':error_message': error_message,
+ ':creation_time': creation_time,
+ ':expiration_time': expiration_time
+ }
+ ))
mediaConvertInputFileToJobIdApi
追加したエラーメッセージ(序でに作成日時)を返却するようにしました。
最新のコードこちら → https://dev.azure.com/nightonly/_git/lambda-origin?path=/mediaConvertInputFileToJobIdApi/lambda_function.py
+ import datetime
- return success_response(response['Item']['JobId']) + return success_response(response['Item'])
- def success_response(job_id):
- return { 'statusCode': 200, 'headers': headers, 'body': json.dumps({ 'success': True, 'job_id': job_id }) }
+ def success_response(item):
+ job_id = item['JobId'] if 'JobId' in item else None
+ error_message = item['ErrorMessage'] if 'ErrorMessage' in item else None
+ creation_time = str(datetime.datetime.fromtimestamp(item['CreationTime'], datetime.timezone.utc))
+ return { 'statusCode': 200, 'headers': headers, 'body': json.dumps({ 'success': True, 'job_id': job_id, 'error_message': error_message, 'creation_time': creation_time }) }
mediaConvertInputFileToJobIdEdgeApi
ほぼ同じなので、下記を参照してください。
