파이썬을 이용한 S3 및 EC2 내 임시 디렉토리의 파일 교환

11517 단어 EC2파이썬S3AWS

소개



온프레 환경의 GPU가 없기 때문에, 나는 AWS에서 GPU 인스턴스를 세워 딥 러닝을 실시하고 있다.
학습 데이터를 이용할 때, EC2 내에 임시 디렉토리를 작성하고, 거기에 S3로부터 학습 데이터를 다운로드해 사용하는 것으로, 이하와 같은 이점을 얻을 수 있지 않을까 생각했으므로, 소개한다.

EC2 인스턴스에 데이터를 넣어두는 것보다 프로그램 실행이 끝나면 EC2 인스턴스에서 데이터가 지워지고 S3에 출력 결과가 올라가므로 보안 강화, 출력 결과 분실 위험 성 저감, EBS(스토리지)의 절약이 된다.

이 기사에서는 EC2 인스턴스 내에 임시 디렉토리를 만들고 S3에서 파일을 다운로드합니다.
그리고, 임시 디렉토리로부터 S3에의 업로드까지를 목표로 한다.

필요한 작업


  • EC2에 IAM 역할 설정
  • python 모듈 설치 (python3 사용)
  • 코드 설명

  • IAM 역할 설정



    역할 만들기



    ①AWS Management Console에서 IAM 페이지로 이동
    ② 왼쪽 메뉴 목록에서 롤 선택
    ③롤 만들기를 선택



    ④유스 케이스는 EC2를 선택
    ⑤ 다음 단계로



    ⑥ 검색창에서 S3을 입력하여 검색
    ⑦AmazonS3FullAccess에 체크 표시
    ⑧ 다음 단계로



    ⑨태그는 설정해도 하지 않아도 어느 쪽이라도 좋지만, 복수인이 AWS를 이용하고 있는 경우는, 관리의 용이함 때문에, User만 설정해 두면 좋다
    ⑩ 다음 단계로



    ⑪ 임의의 롤명을 붙인다(롤명으로부터 무엇을 할 수 있는 롤인지 알도록 해 두면 편해)
    ⑫ 롤 만들기



    EC2 인스턴스에 IAM 역할 할당



    EC2 인스턴스를 만들 때 이전에 만든 IAM 역할 할당

    ※인스턴스 작성시 밖에 롤의 할당할 수 없을지도? 생성 후 역할이 할당되는지 확인



    파이썬 모듈 설치



    필수 모듈



    AWS 모듈
    - boto3
    임시 디렉토리 모듈
    - tempfile (python 표준 모듈이므로 설치 필요 없음)

    설치 명령


    pip install boto3
    

    코드 작성



    다음 코드를 노트북 또는 .py 파일에 복사하면 다운로드 및 업로드 완료

    다운로드 소스 및 업로드 대상 설정


    import boto3
    import tempfile
    
    #ダウンロード元バケット名
    bucket_name = 'hogehoge'
    #アップロード先バケット名今回はダウンロード先と同じ
    out_bucket_name = bucket_name
    
    #バケットにある動画ファイル名
    file_name = 'input.mp4'
    
    #アップロード先のフォルダ名
    #下記の例だとS3にresultフォルダが作成されそこに出力される
    out_folder_name = 'result'
    

    임시 디렉토리 작성 및 S3에서 다운로드


    #一時保存用ディレクトリの作成
    tmpdir = tempfile.TemporaryDirectory()
    tmp = tmpdir.name + '/'
    
    #一時的な入力ファイル名適当な名前で固定
    #固定された名前で一時フォルダにダウンロードされる
    tmp_input = tmp + 'tmp.mp4'
    
    #S3からファイルをダウンロード
    s3_client = boto3.client('s3')
    s3 = boto3.resource('s3')
    bucket = s3.Bucket(bucket_name)
    bucket.download_file(file_name, tmp_input)
    

    다운로드된 파일의 사용 예



    다음 예제는 opencv에서 읽고 아무 ​​작업도 수행하지 않고 임시 디렉토리에 별칭으로 저장합니다.

    (임시 디렉토리에 tmp.mp4와 output.mp4가있는 상태)
    import cv2
    
    #一時ディレクトリに保存するビデオ名の設定
    output_video =tmp + 'output.mp4'
    
    #動画ファイルを読み込む
    video = cv2.VideoCapture(tmp_input)
    
    # 幅と高さを取得
    width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
    size = (width, height)
    
    #総フレーム数を取得
    frame_count = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
    
    #フレームレート(1フレームの時間単位はミリ秒)の取得
    frame_rate = int(video.get(cv2.CAP_PROP_FPS))
    
    # 保存用
    fmt = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
    writer = cv2.VideoWriter(output_video, fmt, frame_rate, size)
    
    for i in range(frame_count):
        ret, frame = video.read()
        ### ここに加工処理などを記述する ###
        writer.write(frame)
    
    writer.release()
    video.release()
    cv2.destroyAllWindows()#ビデオの読み込み
    

    S3에 업로드



    이하의 예는 먼저 설정한 S3 업로드처에 output_video.mp4라는 이름으로 위에서 작성한 비디오가 업로드되고 있다.
    s3.Bucket(out_bucket_name).upload_file(output_video,out_folder_name+'/'+ 'output_video.mp4')
    

    임시 디렉토리 삭제


    tmpdir.cleanup()
    

    요약



    각각의 기술에 대해 좀 더 세밀하게 해설하고 있는 사이트는 많이 있다고 생각하지만, 그것을 어떻게 잘 조합하는지가 의외로 어렵다고 생각해 이 기사를 작성했다.

    좋은 웹페이지 즐겨찾기