로컬에 있는 특정 파일(디렉토리) 안에 있는 모든 파일들을
s3로 옮기는 작업을 진행하는 코드를 코틀린으로 만들어보자 🚀
처음으로 코틀린으로 작성해본거라 코딩 컨벤션에 맞지 않을 수 있다 😅
aws 깃허브를 많이 참고하였고, 해당 참고했던 깃허브는 java 언어를 보고 참고하였다.
참고했던 자료들은 이 글 제일 하단에 있다.
전제조건은 다음과 같다.
implementation("com.amazonaws:aws-java-sdk-s3:1.12.52")
aws-java-sdk-bom
라는 걸로 한번에 버전관리를 할 수 있다.
(관련
docs
).코틀린 4.6 버전 이상:
dependencies {
implementation("com.amazonaws:aws-java-sdk-bom:1.12.52")
implementation("software.amazon.awssdk:s3")
}
코틀린 4.6 버전 이전:
dependencyManagement {
imports {
mavenBom("software.amazon.awssdk:bom:1.12.52")
}
}
dependencies {
implementation("software.amazon.awssdk:s3")
}
S3 버킷에 접근 가능한 aws_access_key_id
와 aws_secret_access_key
, region
을 사용하여
AmazonS3ClientBuilder
를 만든다. 그 후 한꺼번에 업로드 할 수 있는 TransferManagerBuilder
를 만들어 반환하기
먼저 local_path
가 /d/test/uploader/ 라고 하자.
uploader 내부에는 수많은 파일이 있고, 각 파일마다 2mb 를 넘지 않는다고 가정.
만약 파일 하나 하나의 사이즈가 크다면 다른 방식으로 해야 됨. 하단 참고부분에서 멀티파트 업로드를 사용한 객체 업로드 부분을 참고할 것.
s3에 업로드 될 path 는 {bucket_name} path1/path2/upload/210831/ 이라고 가정.
bucket_name
= mand2 로 한다.
default_path
= /path1/path2/ 로 가정.
참고로 s3 업로드시 해당 객체(경로)가 없어도 자동으로 생성되므로 ‘먼저 객체를 만들어야하나?🤔’ 하고 고민하지 않아도 된다. (내가 고민하다 삽질해봄..ㅎ)
👀 주의사항
각 path 앞, 뒤에/
가 있다면 없애주자.
예를들어/mand2/path1/path2/....
이라고 설정이 된다면 실제로 업로드 되지 않음.
테스트 해보면 알겠지만 업로드 완료 라고 뜨지만 실제 s3에는 객체가 생성이 되지 않는다.
위에 코드를 실행해보면 답답할 것이다. 얼마나 완료되었는지 확인을 못하므로..🤔
그러니 진행률을 같이 볼 수 있도록 로그를 남겨서 확인할 수 있게 해주자.
좀 더 보기 편하게 진행율 포맷을 0.00% 로 보이도록 만들었다.
결과 예시
[Running] upload progressing... start
[Running] 0.35% upload progressing...
[Running] 0.70% upload progressing...
[Running] 1.06% upload progressing...
[Running] 1.44% upload progressing...
[Running] 1.80% upload progressing...
[Running] 2.15% upload progressing...
[Running] 2.52% upload progressing...
[Running] 6.81% upload progressing...
[Running] 11.00% upload progressing...
[Running] 15.00% upload progressing...
[Running] 19.12% upload progressing...
[Running] 23.31% upload progressing...
어쩌다 보니 코틀린까지 하게 되었는데, 변수 선언 방식도 그렇고 좀 더 유동적이라 재밌는것 같다.
같이 일하는 동료가 ‘쓸데없는 코드 작성시간을 줄인다’ 는 평을 했었는데 왜 그런 평을 했는지 알 것 같다. ㅎㅎ
어찌저찌 코틀린으로 작성한거라 문제 많을 수 있음.
참고로 cli 로는 아주 간단하다.
aws s3 cp {{local_directory}} s3://{{s3_bucket}} --recursive
AWS
하위 수준 API
사용 기준:
Blogs