미리 서명된 URL을 사용한 큰 파일의 여러 부분 업로드 - AWS

데이터의 급속한 증가는 충격적이었다.현재 초당 백만 건이 넘는 요청 주파수로 원시 데이터를 수집할 수 있다.저장이 더 빠르고 더 싸다.데이터가 거의 영원히 저장되는 것은 정상적이다. 설령 데이터가 접근되지 않더라도.
Traindex의 사용자는 의미 검색 인덱스를 만들기 위해 대형 데이터 파일을 업로드할 수 있다.본고는 Trandex 사용자가 큰 파일을 올릴 수 있도록 하는 여러 부분의 업로드 기능을 어떻게 실현하는지 설명할 것이다.

문제 및 그 해결 방법


우리는 Trandex 사용자가 가장 짧은 시간 안에 적당한 접근 제어를 통해 큰 파일 (통상 1-2TB) 을 아마존 S3에 업로드할 수 있기를 희망합니다.
본 논문에서, 나는 안전한 업로드 파일을 위해 어떻게 미리 서명한 URL을 설정하는지 토론할 것이다.이렇게 하면 AWS S3 스토리지 통에 있는 객체에 대한 임시 액세스 권한을 라이센스 없이 부여할 수 있습니다.
그렇다면 AWS S3에 업로드하는 과정에서 5GB 제한에서 5TB 제한으로 어떻게 올릴 수 있을까.다중 부분 업로드를 사용하면 AWS S3에서 문서 구성 단위가 10000개인 파일을 업로드할 수 있습니다.각 부품의 크기는 5MB에서 5GB까지 다양할 수 있습니다.
다음 표에는 S3의 업로드 서비스 제한이 나와 있습니다.

크기 제한을 제외하고는 S3 메모리통의 사유성을 유지하고 필요할 때만 공공 접근 권한을 부여하는 것이 좋다.Bucket ACL을 변경하거나 역할을 만들거나 계정에 사용자를 만들지 않고 클라이언트에게 객체에 대한 액세스 권한을 제공하기를 원합니다.최종적으로 S3 사전 서명 URL을 사용했습니다.

당신은 무엇을 배울 수 있습니까?


사전 서명 URL을 사용하는 표준 다중 부분 업로드의 경우 다음이 필요합니다.
  • 다중 업로드 시작
  • 각 섹션에 대한 사전 서명 URL 만들기
  • 업로드 대상의 부분
  • 멀티 업로드 완료
  • 선결 조건


    작업 시 자격 증명이 필요 없도록 명령줄 환경이 구성되어 있는지 확인해야 합니다.위의 1단계, 2단계 및 4단계는 서버측 단계입니다.AWS 액세스 키 ID 및 키 ID가 필요합니다. 3단계는 클라이언트의 사전 서명 URL을 설정하고 있으므로 자격 증명이 필요하지 않습니다.
    서버측 작업을 수행하도록 환경을 구성하지 않은 경우 먼저 다음 단계를 완료해야 합니다.
  • 운영 체제에 따라 link에서 AWS-CLI를 다운로드하여 설치합니다.AWS-CLI를 구성하려면 다음과 같이 AWS configure 명령을 사용하고 필요한 세부 정보를 제공해야 합니다.
  • $ aws configure
    
    AWS Access Key ID [None]: EXAMPLEFODNN7EXAMPLE
    AWS Secret Access Key [None]: eXaMPlEtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    Default region name [None]: xx-xxxx-x
    Default output format [None]: json
    

    구현


    1. 멀티플렉스 업로드 시작


    이 단계에서 AWS S3에 여러 부분 업로드를 시작해 달라고 요청했습니다.응답으로 UploadId를 받을 것입니다. 이 UploadId는 모든 부분을 그들이 만들고 있는 대상과 연결합니다.
    import boto3
    
    s3 = boto3.client('s3')
    
    bucket = "[XYZ]"
    key = "[ABC.pqr]"
    
    response = s3.create_multipart_upload(
        Bucket=bucket, 
        Key=key
    )
    
    upload_id = response['UploadId']
    
    Bucket 이름과 키를 설정한 후 이 코드를 실행하면 업로드할 파일의 UploadID를 얻을 수 있습니다.Bucket 이름과 키를 설정한 후 업로드할 파일의 Upload ID를 얻었습니다.그런 다음 모든 부품을 함께 결합해야 합니다.

    2. 각 섹션에 미리 서명된 URL 만들기


    이제 PUT 요청을 통해 부품을 업로드할 수 있습니다.앞에서 말한 바와 같이, 우리는 미리 서명한 URL을 사용하여 대상에 대한 접근권을 안전하게 업로드하고 수여할 수 있으며, 버킷 ACL을 변경하거나 캐릭터를 만들거나 귀하의 계정에 사용자를 제공할 필요가 없습니다.허용된 사용자는 파일의 각 섹션에 대한 URL을 생성하고 S3에 액세스할 수 있습니다.다음 코드 행에서 이 코드를 생성할 수 있습니다.
    signed_url = s3.generate_presigned_url(
        ClientMethod ='upload_part',
        Params = {
           'Bucket': bucket,
           'Key': key, 
           'UploadId': upload_id, 
           'PartNumber': part_no
        }
    )
    
    위에서 설명한 대로 이 특정 단계는 서버측 단계이므로 사전 구성된 AWS 환경이 필요합니다.이제 각 섹션의 사전 서명 URL을 클라이언트에 전달할 수 있습니다.S3에 직접 액세스하지 않고도 간단히 부품을 올릴 수 있습니다.즉, 서비스 제공업체가 ACL 및 권한 변경을 걱정할 필요가 없습니다.

    3. 대상의 각 부분을 올린다


    이 단계는 프로세스의 유일한 클라이언트 단계입니다.기본 사전 서명 URL은 만료 시간이 15분이며 이를 생성한 사람이 변경할 수 있습니다.통상적으로, 안전상의 이유로, 그것은 가능한 한 최소한으로 유지될 것이다.
    클라이언트는 객체의 일부, 즉 파일 데이터를 읽고 부품 번호와 관련된 블록 업로드를 요청할 수 있습니다.먼저 서명된 URL을 부품 번호로 순서대로 사용해야 하며 데이터 블록은 순서대로 사용해야 합니다.그렇지 않으면 객체가 충돌하고 업로드가 결국 파일을 손상시킬 수 있습니다.따라서 고유한 식별자, 즉 부품 번호와 관련된 각 부품의 eTag를 저장하기 위한 사전, 즉 부품을 관리해야 합니다.사전은 숫자의 각 부분에 대한 고유한 식별자나 eTag을 유지하기 위한 관리자여야 합니다.
    response = requests.put(signed_url, data=file_data)
    
    etag = response.headers['ETag']  
    
    parts.append({'ETag': etag, 'PartNumber': part_no})
    
    데이터 크기의 경우 각 블록을 바이트로 선언하거나 객체의 총 크기를 일부 수량으로 나누어 계산할 수 있습니다.다음 예제 코드를 보십시오.
    max_size = 5 * 1024 * 1024    # Approach 1: Assign the size  
    
    max_size = object_size/no_of_parts    # Approach 2: Calculate the size 
    
    with open(fileLocation) as f:
        file_data = f.read(max_size)
    

    4. 멀티 업로드 완료


    이 단계에 앞서 블록을 검사하고 버킷에 업로드하는 상세한 정보를 확인하십시오.현재, 우리는 모든 부분의 파일을 하나로 통합해야 한다.사전 부분(우리가 3단계에서 논의한 바와 같이)은 블록과 그 부분 번호와 ETAg를 유지하고 대상의 손상을 피하기 위해 매개 변수로 전달될 것이다.
    다음 코드를 참고하여 여러 부분의 업로드 과정을 완성할 수 있습니다.
    response = s3.complete_multipart_upload(
        Bucket = bucket,
        Key = key,
        MultipartUpload = {'Parts': parts},
        UploadId= upload_id
    )
    

    5. 단계 첨부


    추가적인 비용과 정리를 피하기 위해 S3 메모리통과 S3 모듈은 요청에 따라 여러 부분의 업로드를 정지합니다.의심스러운 상황이 발생하고 프로세스를 중단하려면 다음 코드를 사용할 수 있습니다.
    response = s3.abort_multipart_upload(
        Bucket = bucket,
        Key = key,
        UploadId = upload_id
    )
    
    본 문서에서 우리는 안전한 방식으로 여러 부분의 업로드를 실현하는 과정인 사전 서명 URL에 대해 논의했다.제안된 솔루션은 시간과 자원을 절약하고 사용자에게 유연성을 제공하는 CLI tool to upload large files을 만드는 것이다.항상 이렇게 해야 하는 사용자에게 이것은 싸고 효율적인 해결 방안이다.

    좋은 웹페이지 즐겨찾기