[AWS] boto3에서 Lambda와 S3를 연동

소개



AWS Lambda에서 임시 파일을 생성하고 S3에 업로드합니다. 게다가 S3에 업로드한 파일을 원래 위치에 다운로드라는 글루글을 해봅니다.

시스템 구성



      
  • /tmp/log/sess/ 에 파일을 만들고 디렉토리를 /tmp/sess-info.tar 에 아카이브합니다.
  • S3sess-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 는 적절히 설정해 주십시오.

    람다 구성


  • Runtime: Python 2.7
  • Handler: lambda_function.lambda_handler
  • Role: Choose an existing role
  • Existing role: AmazonS3FullAccess
  • Memory(MB): 128
  • Timeout: 0 min 10 sec

  • ※ Lambda와 S3를 연계시키는 경우, Lambda에 role를 설정하는 것만으로 제휴 가능했습니다. Session에 Access Key Id, Secret Access Key를 지정하거나 S3의 사용 권한을 설정할 필요가 없었습니다.

    S3 Bucket



    Lambda Code bucket_name와 같은 이름의 Bucket을 만듭니다.

    결론



    Lambda는 Stateless로 설계하는 것이 기본이지만 Stateful 데이터에 액세스하고 싶어지는 경우도 있습니다.
    그런 경우는 아래를 잘 이용하여 대응합니다.
  • Lambda의/tmp 디렉토리에 최대 500MB의 임시 파일을 만들 수 있습니다.
  • Amazon S3와 협력
  • Amazon DynamoDB와 협력

  • 이번은 Lambda의/tmp 디렉토리와 S3를 이용하는 예였습니다.

    좋은 웹페이지 즐겨찾기