개발자 관련 글도 올려봐야지 하고.... 미루고 미루다 올리는 첫 게시글!!
이번에 오라클 디비를 백업하면서 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 설치 되어있는지 확인
- aws --version
- 설치가 되어 있지 않다면
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]
- 참고
- 멀티 파트 다운로드 관련 글
- https://aws.amazon.com/ko/blogs/korea/amazon-s3-multi-part-dowload/
#aws #s3 #s3업로드 #대용량파일 #대용량업로드 #s3대용량업로드 #s3대용량파일업로드 #aws업로드 #awscli
#개발자 #리눅스
'개발일기 > DB, SQL' 카테고리의 다른 글
SQL - DML (0) | 2024.04.08 |
---|---|
SQL - JOIN (0) | 2024.04.08 |
SQL - SELECT (0) | 2024.04.08 |
SQL - DDL (0) | 2024.04.08 |
오라클 데이터베이스 백업하기(feat, expdp / impdp) (0) | 2022.08.13 |