質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.06%

Amazon Elastic Transcoderでエンコードした後、input側のファイルを削除する方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,098

kuriya

score 35

S3にアップロードされたファイルがmov形式だった場合、mp4形式にエンコードするという処理をlambdaで実装しています。
mp4形式にエンコードされた後、エンコード前のmovファイルは自動で削除される処理を加えたいのですが、どのようにすればよいか分かりません。

分かる方いらっしゃいましたら、ご教授願います。

以下現状のlambdaのコードです。

import boto3
from botocore.client import ClientError
import json
import urllib

REGION_NAME = 'ap-northeast-1'
TRANSCODER_ROLE_NAME = 'lambda_auto_transcoder_role'
PIPELINE_NAME = 'testPipeline'
OUT_BUCKET_NAME = 'baket-in'
COMPLETE_TOPIC_NAME = 'test-complete'

print('Loading function')

s3 = boto3.resource('s3')
iam = boto3.resource('iam')
sns = boto3.resource('sns', REGION_NAME)
transcoder = boto3.client('elastictranscoder', REGION_NAME)


def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))

    # Get ARN
    complete_topic_arn = sns.create_topic(Name=COMPLETE_TOPIC_NAME).arn
    transcoder_role_arn = iam.Role(TRANSCODER_ROLE_NAME).arn

    # Get the object from the event
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8')
    print("bucket={}, key={}".format(bucket, key))
    try:
        obj = s3.Object(bucket, key)
    except Exception as e:
        print(e)
        print("Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.".format(key, bucket))
        # Publish a message
        sns.Topic(complete_topic_arn).publish(
            Subject="Error!",
            Message="Failed to get object from S3. bucket={}, key={}, {}".format(bucket, key, e),
        )
        raise e

    # Delete inactive pipelines
    pipeline_ids = [pipeline['Id'] for pipeline in transcoder.list_pipelines()['Pipelines'] if pipeline['Name'] == PIPELINE_NAME]
    for pipeline_id in pipeline_ids:
        try:
            response = transcoder.delete_pipeline(Id=pipeline_id)
            print("Delete a transcoder pipeline. pipeline_id={}".format(pipeline_id))
            print("response={}".format(response))
        except Exception as e:
            # Raise nothing
            print("Failed to delete a transcoder pipeline. pipeline_id={}".format(pipeline_id))
            print(e)

    # Create a pipeline
    try:
        response = transcoder.create_pipeline(
            Name=PIPELINE_NAME,
            InputBucket=bucket,
            OutputBucket=OUT_BUCKET_NAME,
            Role=transcoder_role_arn,
            Notifications={
                'Progressing': '',
                'Completed': complete_topic_arn,
                'Warning': '',
                'Error': ''
            },
        )
        pipeline_id = response['Pipeline']['Id']
        print("Create a transcoder pipeline. pipeline_id={}".format(pipeline_id))
        print("response={}".format(response))
    except Exception as e:
        print("Failed to create a transcoder pipeline.")
        print(e)
        # Publish a message
        sns.Topic(complete_topic_arn).publish(
            Subject="Error!",
            Message="Failed to create a transcoder pipeline. bucket={}, key={}, {}".format(bucket, key, e),
        )
        raise e

    # Create a job
    try:
        job = transcoder.create_job(
            PipelineId=pipeline_id,
            Input={
                'Key': key,
                'FrameRate': 'auto',
                'Resolution': 'auto',
                'AspectRatio': 'auto',
                'Interlaced': 'auto',
                'Container': 'auto',
            },
            Outputs=[
                {
                    'Key': 'output/{}'.format('.'.join(key.split('.')[:-1])) + '.mp4',
                    'PresetId': '1351620000001-000061'
                },
            ],
        )
        job_id = job['Job']['Id']
        print("Create a transcoder job. job_id={}".format(job_id))
        print("job={}".format(job))
    except Exception as e:
        print("Failed to create a transcoder job. pipeline_id={}".format(pipeline_id))
        print(e)
        # Publish a message
        sns.Topic(complete_topic_arn).publish(
            Subject="Error!",
            Message="Failed to create transcoder job. pipeline_id={}, {}".format(pipeline_id, e),
        )
        raise e

    return "Success"


以下を追加することで画像は削除出来るようになったのですが、そうするとエンコードのファイルが生成される前にエンコード前のファイルが削除されてしまうので実行タイミングをエンコード後とする必要があります。
何か良い方法はありましたら教えていただきたく存じます。

    #エンコード前のファイルを削除 
    try:
        response = s3.delete_object(
        Bucket=OUT_BUCKET_NAME,
        Key=key,
        #MFA='string',
        #VersionId='string',
        #RequestPayer='requester'
        )
        print(key)
        print("is deleted")
    except Exception as e:
        print(key)
        print("not deleted")

よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

Offload S3のプラグインのソースを書き換える。
amazon-s3-and-cloudfront-pro/classes/amazon-s3-and-cloudfront.php
のadd_post_metaでDBに保存しているので、その手前で入るURLをよしなにreplaceしすることで対応出来ました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る