パラメータエラー以外で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
ほぼ同じなので、下記を参照してください。