Tips(Reference)/aws

AWS CLI S3 작업 업무 효율높이기(PS 스크립트화,pandas 활용)

DEV_BLOG 2023. 11. 5. 02:52

 

[상황]

AWS CLI를 활용하여 수만 ~ 수십만 건의 데이터를 S3 Bucket->S3 Bucket, Local->S3 Bucket 등으로 여러 차례 마이그레이션하면서 다음과 같은 불편함을 느꼈다.

 

1. AWS CLI Command를 실행하였을 때 작업 예상 대기시간을 알기 어렵다.(소요시간 제공 기능이 따로 없음)

 

2. 숫자네이밍으로 구성된 폴더 단위로 업로드하는데 업로드 현황 파악을 하기가 매우 힘들었다. 잘 업로드되었는지 AWS 콘솔에서 여러 폴더를 검색해야 했고 굉장한 피로감이 느껴졌다.(--debug 옵션을 주어서 로그를 남기는 경우 로그파일이 너무 커져서 notepad로 열리지도 않았다.)

 

3. 폴더 네이밍을 고려하여 범위지정 업로드를 위해 include, exclude 옵션으로 wildcard 활용을 강구하였다. 예시 폴더들을 만들어 여러 테스트를 해보았을 때는 와일드카드가 의도대로 전부 동작했지만, 실제로 업로드 업무를 위해 include로 여러 옵션을 주었을 때 한 개의 옵션만 지정되는 경우가 발생하였다.

 

4. 많은 폴더가 모여있는 path에서 AWS S3 커맨드를 실행하였을 때 굉장히 오랜 시간이 걸린 후에 작업이 시작되는 현상이 있었다. 따라서 사전에 실행되는 과정을 볼 수 있는 --dry-run 옵션을 주었을 때에도 시간이 소요되어서 피로감이 느껴졌다.

[개선 방향 아이디어]

1. 폴더별로 Command를 실행하였을 때는 대기시간이 delay 되지 않고 업로드 되었다. 따라서 예를 들어 업로드단위의 폴더가 10000개가 있다면 10000개의 폴더에 대해 각각 command를 실행하는 스크립트가 있으면 편리할 것으로 간주하였다.

 

2. 1번이 가능하면 업로드 현황을 공유하기에도 수월하다고 판단하였고, 소요시간에 따른 업로드 현황을 보면서 작업 완료 시간의 최대치를 유추할 수 있을 것이라 기대하였다.

 

3. ChatGPT를 괴롭혀서 작업에 필요한 예시코드를 작성하는 데에 공수가 덜 들게 작업하기

 

 

[게시물 선수조건]

- Bucket Policy설정, IAM 설정에 대한 내용은 전부 알고 있다고 간주

- AWS CLI 사용법 알고 있다고 간주

- Pycharm, Windows Terminal(powershell), NotePad+, Excel 같은 도구를 잘 활용할 수 있다고 간주

- NAS Server-> S3 BUCKET에  업로드하는 경우를 가정(드라이버 지정 및 경로접근 알고 있다고 간주)

 

 

[업무 프로세스]

 

1. Python Pandas 활용하기

  • NAS Server Directory 목록 가져오기
  • Directory 목록 엑셀로 만들기
import os
import pandas as pd

# NAS SERVER PATH
folder_path = '{NAS_SERVER_DRIVER_NAME}:\{filePath}'

folder_list = [folder for folder in os.listdir(folder_path) if os.path.isdir(os.path.join(folder_path,folder))]

df = pd.DataFrame({'폴더 이름' : folder_list})

# NAS Server의 파일명을 저장할 Local의 엑셀파일
excel_file_path = 'C:\\upload_file_list.xlsx'
df.to_excel(excel_file_path, index=False)

print(f'폴더 이름이 저장된 엑셀 파일 : {excel_file_path}')

 

 

2. AWS CLI Command 양식 저장하기

 

# --recursive: 하위의 디렉토리도 포함
# --dryrun: 어떻게 업로드가 진행되는지 관찰가능(실제로 업로드 되지는 않음) 

# 실제 업로드 이전에 테스트해보기
aws s3 cp {$NAS_SERVER_DRIVER_NAME}:\{$filePath} s3://{$bucketName}/{$bucketPath} -- recursive --dryrun

# 업로드 하기 (dryrun option 제거)
aws s3 cp {$NAS_SERVER_DRIVER_NAME}:\{$filePath} s3://{$bucketName}/{$bucketPath} -- recursive

 

 

3. NodePad + Excel 활용하여 AWS CLI Command 목록 만들기

  •  엑셀에서 Command list 만들기

 

 

  • NotePad 활용하여 Script에 쓰일 수 있도록 문자열 치환하기

 

# 찾을내용 ( aws ) > 바꿀 내용( "aws )

# 찾을내용 ( --recursive ) > 바꿀 내용( --recursive", )

 

 

 

4. PowerShell Script로 AWS CLI  Command 실행하기

  • 엑셀의 Command 목록 복사 -> .PS1 으로 확장자 저장 -> 오른쪽마우스 -> PowerShell에서 실행하기

 

$commands = @(
"aws s3 cp Z:\data\1010\ s3://my_bucket/data/10/ --recursive",
"aws s3 cp Z:\data\100010\ s3://my_bucket/data/1000/ --recursive",
"aws s3 cp Z:\data\10000110\ s3://my_bucket/data/100001/ --recursive",
"aws s3 cp Z:\data\10000610\ s3://my_bucket/data/100006/ --recursive",
"aws s3 cp Z:\data\10000710\ s3://my_bucket/data/100007/ --recursive",
"aws s3 cp Z:\data\10000910\ s3://my_bucket/data/100009/ --recursive",
"aws s3 cp Z:\data\10001010\ s3://my_bucket/data/100010/ --recursive",
"aws s3 cp Z:\data\10001110\ s3://my_bucket/data/100011/ --recursive",
"aws s3 cp Z:\data\10001210\ s3://my_bucket/data/100012/ --recursive",
"aws s3 cp Z:\data\10001310\ s3://my_bucket/data/100013/ --recursive",
"aws s3 cp Z:\data\10001910\ s3://my_bucket/data/100019/ --recursive",
"aws s3 cp Z:\data\10002010\ s3://my_bucket/data/100020/ --recursive",
"aws s3 cp Z:\data\10002110\ s3://my_bucket/data/100021/ --recursive"
)

foreach ($command in $commands) {
    Write-Host "Executing: $command"
    Invoke-Expression $command

    # 명령어 실행 후 종료 코드 확인
    if ($LASTEXITCODE -ne 0) {
        Write-Host "Command exited with Error." 
    }
}

# PowerShell 창을 열어두기 위해 사용자 입력을 대기합니다.
Read-Host "Press Enter to exit"

 

  • $commands : 실행할 AWS CLI 명령어 배열
  • Write-Host : 현재 실행 중인 명령어 표시
  • Invoke-Expression : 명령어 실행하고 결과를 반환
  • $LASTEXITCODE : Exit Code 의미, 0: 성공, 0이 아닌 경우 메시지 출력
  • Read-Host : PowerShell이 닫히지 않고 실행과정을 볼 수 있도록 하기 위함

 

[기대결과]

1. Command 실행이 오래 걸리는 경우 + dry-run option Command 실행이 오래 걸리는 경우의 소요시간을 줄이고 빠르게 업로드를 진행할 수 있음.

 

2. 특정 주기마다 엑셀에 색깔별로 다르게 표기하면 업로드 현황내역을 알기가 쉽고 남은 내역도 공유해 주기 쉬움.

 

3. 최대 소요일을 예상할 수 있음.

 

4. 와일드카드를 고려하지 않고 작업량을 조절하기가 매우 수월해짐.