개발일기/DB, SQL

S3 서버에 대용량 파일 업로드(feat, AWS CLI) - 내용 추가

길동이이이잉 2022. 8. 13. 21:32
728x90
반응형

 

개발자 관련 글도 올려봐야지 하고.... 미루고 미루다 올리는 첫 게시글!!

이번에 오라클 디비를 백업하면서 aws s3에 1.6테라 파일을 올리고 싶었다.

aws cli를 이용하면 대용량 파일을 멀티 파트로 업로드해 준다는 글을 보고 열심히 cli 설치하고... 계정 연결하고.... 업로드를 했는디.....!

우리 쪽 서버가 문제인 건지 뭐가 문제인 건지 잘 모르겠지만 계속 RequestTimeout이 발생했다..... 해당 오류를 검색해 보면 몇 년 전부터 꾸준히 발생하고 있는 오류인 거 같은데... 아직도 해결이 안 된듯하다.

멀티 파트 업로드 진행 목록을 보면 올라와 있긴 하던데.... 쨌든 안됨....

 

그래서 다른 방안을 검색해 보면 REST API나 aws SDK를 이용한 방법이 있다고 하는데 글을 읽어봐도 무슨 소린지 잘 모르겠다..... 흑....

그러던 중 발견한 aws s3api 명령! 하위 수준의 명령어라고 하는 데 왜 하위 수준일까??

 

처음에 cli를 이용하여 시도했던 명령어(RequestTimeout이 발생한)는

aws s3 cp [localfilepath] s3://[bucketname]/[filename]
or
upload:[localfilepath] to s3://[bucketname]/[filename]
 

해당 명령어였고

//public 읽기 권한 부여
aws s3 cp [localfilepath] s3://[bucketname]/[filename] --acl public-read

//파일 다운로드
aws s3 cp s3://[bucketname]/[filename] [localfilepath]

//파일 삭제
aws s3 rm s3://[bucketname]/[filename]
 

추가로 이런 명령어들도 있었다.

 


다시 돌아와서 처음부터....

파일이 5GB보다 작을 경우

 

1. aws cli 설치 되어있는지 확인

  1. aws --version
  2. 설치가 되어 있지 않다면      

2. 현재 계정에 생성된 bucket 목록 확인

 

aws s3 ls

 

 

3. 현재 계정의 bucket 내 파일 목록 확인

aws s3 ls s3://[bucketname]

 

 

4. 파일 업로드

aws s3 cp [localfilepath] s3://[bucketname]/[filename]
or
upload:[localfilepath] to s3://[bucketname]/[filename]

//public 읽기 권한 부여
aws s3 cp [localfilepath] s3://[bucketname]/[filename] --acl public-read

 

 

5. 파일 다운로드

aws s3 cp s3://[bucketname]/[filename] [localfilepath]

 

 

6. 파일 삭제

aws s3 rm s3://[bucketname]/[filename]

 

 


 

 

파일이 5GB를 초과한다면 멀티파트 업로드를 진행해야함!

 

위의 문서를 차근차근 따라 해보았다.

 

1. 우선 리눅스 서버에서 파일을 일정한 크기로 잘라줬다.

split -d -b 5G -a 3 220714_test.dump
 

-d : 분할 파일 이름을 숫자로 표시

-b : 파일 크기로 분할 → 5G

-a : 파일 이름 숫자 표기 자릿수

⇒ x000

x001 이런 식으로 파일이 분할됨

 

2. 멀티 파트 업로드 시작

#bucket, key 수정
aws s3api create-multipart-upload --bucket [awsexamplebucket] --key [large_test_file]
 

여기에서 사용되는 key 값이 나중에 업로드 완료했을 때 파일명이 된다....

위의 명령어를 실행하면

{
    "AbortDate": "Mon, 03 Jun 2019 00:00:00 GMT",
    "AbortRuleId": "multipartcleanup",
    "Bucket": "awsexamplebucket",
    "Key": "large_test_file",
    "UploadId": "exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk"
}
 

이런 출력을 뱉는다. 이 값들 중 UploadId를 아래에서 사용.

 

3. 자른 파일 업로드

#bucket, key, part-number, body, uploadid 수정
aws s3api upload-part --bucket [awsexamplebucket] --key [large_test_file] --part-number [number] --body [filename] --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk
 

올릴 파일이 꽤 많았기 때문에 shell을 하나 작성했다.

#!/bin/bash

for a in $(seq -f %03g 0 10);
do
	partnumber=$(expr $a + 1)
	#여기 띄어쓰기 주의...
	#partnumber = $(expr $a + 1)
	# = 앞뒤에 띄어쓰기 넣으니까 실행 안되더라.....
	
	#partnumber=`expr $a + 1`
	#이것도 가능 ' 아님 주의

	#bucket, key, part-number, body, uploadid 수정
	aws s3api upload-part --bucket [awsexamplebucket] --key [large_test_file] --part-number $partnumber --body x$a --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk
done
 

자른 파일을 업로드 완료할 때마다

{
    "ETag": "\"428654a396830420046e715140c24002\""
}
 

ETag라는 값을 뱉어준다

 

 

4. 업로드 완료된 목록을 파일로 받기

aws s3api list-parts --bucket [awsexamplebucket] --key [large_test_file] --upload-id [exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk] > aws.log
 

5. 위에서 받은 파일을 아래의 형식으로 편집해서 json 파일로 저장

{
    "Parts": [{
        "ETag": "example8be9a0268ebfb8b115d4c1fd3",
        "PartNumber":1
    },

    ....

    {
        "ETag": "example246e31ab807da6f62802c1ae8",
        "PartNumber":4
    }]
}
 

모든 파일이 업로드 되면

 

6. 위의 파일을 이용해서 멀티 파트 업로드 종료 명령을 날려야 한다.

aws s3api complete-multipart-upload --multipart-upload file://filepart.json --bucket [awsexamplebucket] --key [large_test_file] --upload-id [exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk] 
 

위의 명령이 완료되면

{
    "Location": "https://awsexamplebucket.s3.ap-northeast-2.amazonaws.com/large_test_file",
    "Bucket": "awsexamplebucket",
    "Key": "large_test_file",
    "ETag": "\"429a7f226c5e08a38a6c9c22346607a9-337\""
}
 

이렇게 결과를 보여준다.

 

 

완료되지 않은 멀티 파트 삭제

 

  • 우선 진행 중인 멀티 파트 목록 가져오기
aws s3api list-multipart-uploads --bucket [awsexamplebucket]
 
  • 삭제
aws s3api abort-multipart-upload --bucket [awsexamplebucket] --key [large_test_file] --upload-id [exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk]
 
 

 

 

 

 

#aws #s3 #s3업로드 #대용량파일 #대용량업로드 #s3대용량업로드 #s3대용량파일업로드 #aws업로드 #awscli

#개발자 #리눅스

 

728x90
반응형