파이썬을 이용한 S3 및 EC2 내 임시 디렉토리의 파일 교환
소개
온프레 환경의 GPU가 없기 때문에, 나는 AWS에서 GPU 인스턴스를 세워 딥 러닝을 실시하고 있다.
학습 데이터를 이용할 때, EC2 내에 임시 디렉토리를 작성하고, 거기에 S3로부터 학습 데이터를 다운로드해 사용하는 것으로, 이하와 같은 이점을 얻을 수 있지 않을까 생각했으므로, 소개한다.
EC2 인스턴스에 데이터를 넣어두는 것보다 프로그램 실행이 끝나면 EC2 인스턴스에서 데이터가 지워지고 S3에 출력 결과가 올라가므로 보안 강화, 출력 결과 분실 위험 성 저감, EBS(스토리지)의 절약이 된다.
이 기사에서는 EC2 인스턴스 내에 임시 디렉토리를 만들고 S3에서 파일을 다운로드합니다.
그리고, 임시 디렉토리로부터 S3에의 업로드까지를 목표로 한다.
필요한 작업
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()
요약
각각의 기술에 대해 좀 더 세밀하게 해설하고 있는 사이트는 많이 있다고 생각하지만, 그것을 어떻게 잘 조합하는지가 의외로 어렵다고 생각해 이 기사를 작성했다.
Reference
이 문제에 관하여(파이썬을 이용한 S3 및 EC2 내 임시 디렉토리의 파일 교환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ba-yu/items/e6b6bfd6f90e1dd0e563
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
필수 모듈
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()
요약
각각의 기술에 대해 좀 더 세밀하게 해설하고 있는 사이트는 많이 있다고 생각하지만, 그것을 어떻게 잘 조합하는지가 의외로 어렵다고 생각해 이 기사를 작성했다.
Reference
이 문제에 관하여(파이썬을 이용한 S3 및 EC2 내 임시 디렉토리의 파일 교환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ba-yu/items/e6b6bfd6f90e1dd0e563
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import boto3
import tempfile
#ダウンロード元バケット名
bucket_name = 'hogehoge'
#アップロード先バケット名(今回はダウンロード先と同じ)
out_bucket_name = bucket_name
#バケットにある動画ファイル名
file_name = 'input.mp4'
#アップロード先のフォルダ名
#下記の例だとS3にresultフォルダが作成され、そこに出力される
out_folder_name = 'result'
#一時保存用ディレクトリの作成
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)
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.Bucket(out_bucket_name).upload_file(output_video,out_folder_name+'/'+ 'output_video.mp4')
tmpdir.cleanup()
각각의 기술에 대해 좀 더 세밀하게 해설하고 있는 사이트는 많이 있다고 생각하지만, 그것을 어떻게 잘 조합하는지가 의외로 어렵다고 생각해 이 기사를 작성했다.
Reference
이 문제에 관하여(파이썬을 이용한 S3 및 EC2 내 임시 디렉토리의 파일 교환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ba-yu/items/e6b6bfd6f90e1dd0e563텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)