ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Boto3 파일 업로드 & 다운로드- upload and download
    Server Side/AWS 2020. 1. 15. 00:31

    Boto3에 대한 추가 정리 - Notion

     

    upload_file - AWS

    # AWS에서 제공하는 usage
    import boto3
    s3 = boto3.resource('s3')
    s3.meta.client.upload_file('/tmp/hello.txt', 'mybucket', 'hello.txt')
    import boto3
    import os
    
    BASE_DIR = os.getcwd()
    IMAGE_DIR = os.path.join(BASE_DIR, 'images')
    AWS_ACCESS_KEY_ID = "[access key]"
    AWS_SECRET_ACCESS_KEY = "[secret key]"
    AWS_DEFAULT_REGION = "ap-northeast-2"
    AWS_BUCKET_NAME = "aws-jihoon-testserver"
    
    client = boto3.client('s3',
                          aws_access_key_id=AWS_ACCESS_KEY_ID,
                          aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
                          region_name=AWS_DEFAULT_REGION
                          )
    s3 = boto3.resource('s3')
    
    buckets = s3.Bucket(name=AWS_BUCKET_NAME)
    
    file_path = os.path.join(IMAGE_DIR, 'macbookpro.png')
    # 저장될 데이터의 이름 -> key로 사용
    key_name = "mcpro.png"
    
    # upload_file(image파일 주소, 저장될 파일 이름)
    # buckets.upload_file(file_path, 'mcpro.png')
    
    with open(file_path, 'rb') as data:
        buckets.upload_file(data.name, 'mcpro.png')

    upload를 위해 Object level 정책 추가

    • *(asterisk)를 이용해 Object 관련 모든 접근을 허용
    {
         "Effect": "Allow",
         "Action": [
              "s3:*Object*"
          ],
          "Resource": [
              "arn:aws:s3:::aws-jihoon-testserver/*"
          ]
    },

    bucket에 mcpro.png가 올라간것을 확인
    단, mcpro.png에 접근 불가

    ACL(Access Control List) 권한을 파일 업로드에 추가하여 전송할 경우 파일에 접근할 수 있다. (웹에서 열리지 않고 자동으로 다운로드 실행 됨)

    buckets.upload_file(file_path, "mcpro.png", ExtraArgs={'ACL': 'public-read'})

     

    링크를 클릭할 경우 이미지에 접근이 거부되지 않고 다운로드 된다.

     

    upload_file vs put_object(두 메서드 모두 기능은 유사함)

    From stackoverflow

    upload_file method: S3 Transfer Manager에 의해 처리됨, 매니저에 의해서 필요한 경우 자동으로 파일(multipart) upload 처리

    put_object method: low-level S3 API 요청에 매핑됨. 파일 upload를 처리하지 않으며(upload_file과 다른 방식으로 upload를 처리? body에 올라간 image 정보를 전송한다는 의미?? - 자료 조사중) 한번의 요청으로 body 전체를 전송 하려함 + low-level 속성을 컨트롤 할 수 있음(CacheControl-cache관련, ContentMD5-파일 손상 방지 등..)

     

     

    download_file - AWS

    # AWS usage
    import boto3
    s3 = boto3.resource('s3')
    s3.meta.client.download_file('mybucket', 'hello.txt', '/tmp/hello.txt')
    from conf import IMAGE_DIR, buckets
    import os
    
    # local에 저장할 주소와 파일 이름 지정
    file_path = os.path.join(IMAGE_DIR, 'mcpro_down.png')
    # S3에 등록된 파일 이름
    key_name = "1.png"
    
    # buckets.download(<key>, <path>)
    buckets.download_file(key_name, file_path)

     

    generate_presigned_url: 다운로드를 허용할 수 있는 url 생성 - AWS

    def get_s3_client():
        s3 = boto3.client('s3',
                          aws_access_key_id=AWS_ACCESS_KEY_ID,
                          aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
                          region_name=AWS_DEFAULT_REGION
                          )
        return s3
    
    s3 = get_s3_client()
    url = s3.generate_presigned_url(
        ClientMethod='get_object',
        Params={
            'Bucket': AWS_BUCKET_NAME,
            'Key': key_name,
        },
        # url 생성 후 10초가 지나면 접근 불가
        ExpiresIn=datetime.timedelta(seconds=10)
    )
    print(url)

     

    • 해당 파일의 접근에 대한 유효기간을 설정할 수 있다.
    • Onlineshop에서 digital 제품을 판매할 때 이용될 수 있다.

    10초 후 url 접근 시 위와 같이 접근이 제한된다.

     

    'Server Side > AWS' 카테고리의 다른 글

    Boto3 - 기본 설정 및 사용법  (1) 2020.01.13
    AWS Setting - EC2  (0) 2020.01.13

    댓글

Designed by Tistory.