[AWS] boto3에서 Lambda와 S3를 연동
소개
AWS Lambda에서 임시 파일을 생성하고 S3에 업로드합니다. 게다가 S3에 업로드한 파일을 원래 위치에 다운로드라는 글루글을 해봅니다.
시스템 구성
/tmp/log/sess/
에 파일을 만들고 디렉토리를 /tmp/sess-info.tar
에 아카이브합니다. sess-info.tar
를 업로드합니다. /tmp/sess-info.tar
를 삭제하고 S3sess-info.tar
를 /tmp/sess-info.tar
로 다운로드합니다. /tmp/log/sess/
가 있으면 삭제하고 sess-info.tar
를 /tmp/log/sess/
로 확장합니다. Lambda Code
import boto3
import os
import os.path
import tarfile
import shutil
def lambda_handler(event, context):
bucket_name = 'bucket_name'
tmp_dir = '/tmp/'
log_dir = '/tmp/log/sess/'
file_name = 'sess-info.tar'
key = file_name
file_path = tmp_dir + file_name
# === Step 1
# create log dir
if os.path.exists(log_dir) == False:
os.makedirs(log_dir)
# write log
with open(log_dir + 'log1.txt', 'w') as file:
file.write('hoge\n')
with open(log_dir + 'log2.txt', 'w') as file:
file.write('fuga\n')
# create log archive
with tarfile.open(file_path, mode='w:gz') as archive:
archive.add(log_dir)
# === Step 2
# create s3 resource
s3 = boto3.resource('s3')
bucket = s3.Bucket(bucket_name)
# upload log archive
bucket.upload_file(file_path, key)
# === Step 3
# delete log archive
if os.path.exists(file_path):
os.remove(file_path)
# download log archive
bucket.download_file(key, file_path)
# === Step 4
# delete log dir
if os.path.exists(log_dir):
shutil.rmtree(log_dir)
# extract log archive
with tarfile.open(file_path, mode='r:gz') as archive:
archive.extractall('/')
※ bucket_name
는 적절히 설정해 주십시오.
람다 구성
import boto3
import os
import os.path
import tarfile
import shutil
def lambda_handler(event, context):
bucket_name = 'bucket_name'
tmp_dir = '/tmp/'
log_dir = '/tmp/log/sess/'
file_name = 'sess-info.tar'
key = file_name
file_path = tmp_dir + file_name
# === Step 1
# create log dir
if os.path.exists(log_dir) == False:
os.makedirs(log_dir)
# write log
with open(log_dir + 'log1.txt', 'w') as file:
file.write('hoge\n')
with open(log_dir + 'log2.txt', 'w') as file:
file.write('fuga\n')
# create log archive
with tarfile.open(file_path, mode='w:gz') as archive:
archive.add(log_dir)
# === Step 2
# create s3 resource
s3 = boto3.resource('s3')
bucket = s3.Bucket(bucket_name)
# upload log archive
bucket.upload_file(file_path, key)
# === Step 3
# delete log archive
if os.path.exists(file_path):
os.remove(file_path)
# download log archive
bucket.download_file(key, file_path)
# === Step 4
# delete log dir
if os.path.exists(log_dir):
shutil.rmtree(log_dir)
# extract log archive
with tarfile.open(file_path, mode='r:gz') as archive:
archive.extractall('/')
※ Lambda와 S3를 연계시키는 경우, Lambda에 role를 설정하는 것만으로 제휴 가능했습니다. Session에 Access Key Id, Secret Access Key를 지정하거나 S3의 사용 권한을 설정할 필요가 없었습니다.
S3 Bucket
Lambda Code bucket_name
와 같은 이름의 Bucket을 만듭니다.
결론
Lambda는 Stateless로 설계하는 것이 기본이지만 Stateful 데이터에 액세스하고 싶어지는 경우도 있습니다.
그런 경우는 아래를 잘 이용하여 대응합니다.
Lambda는 Stateless로 설계하는 것이 기본이지만 Stateful 데이터에 액세스하고 싶어지는 경우도 있습니다.
그런 경우는 아래를 잘 이용하여 대응합니다.
이번은 Lambda의/tmp 디렉토리와 S3를 이용하는 예였습니다.
Reference
이 문제에 관하여([AWS] boto3에서 Lambda와 S3를 연동), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hitomatagi/items/a8575a3522af9527da79텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)