[Powershell] AWS S3 폴더에 있는 파일 모두 다운로드 받기 본문

프로그램/추가 팁

[Powershell] AWS S3 폴더에 있는 파일 모두 다운로드 받기

반응형

최근에 AWS S3를 이용하여 작업하는 경우가 많아서 한번 정리를 해보려고 한다.

 

우선 진행하기에 앞서서 AWS S3에 대한 접근계정, 권한이 모두 발급이 되었다고 가정하고 진행하겠다.

 

AWS S3폴더에 올라간 파일을 다운로드 받아서 확인해야하는 경우가 있는데 

이때, 파워셀을 이용하여 로컬 PC로 다운로드를 해보는 명령문을 만들어보겠다. 

 

명령문은 일반 에디터로 만들어도 되고, 파워셀 ISE 프로그램을 이용해도 무방하다.

 

파워셀 프로그램은 해당 폴더에 있다.

 

 

1. 환경설정

   시작하기 앞서 우선 파워셀이 잘 동작이 되도록 하기 위해서는 아래와 같이 환경세팅이 필요하다.

   AWS 가 원격이기 때문에 파워셀에서 원격접근이 허용이 되어야 한다.

   환경설정을 하기위하여 파워쉘을 실행할 때 관리자권한으로 실행이 필요하다. (일반적으로 불필요)

 

 

1.1 현재 ExecutionPolicy 확인

      파워셀(Windows PowerShell) 을 실행하고 Get-ExecutionPolicy -List 실행한다.

PS C:\Users\> Get-ExecutionPolicy -List
    Scope ExecutionPolicy
    ----- ---------------
MachinePolicy    Undefined
   UserPolicy    Undefined
      Process    Undefined
  CurrentUser    Undefined
 LocalMachine    Undefined

아무런 처리를 하지 않은 윈도우라면 모든 것이 Undefined로 되어있을 것이다. 

 

 

1.2  전체 ExecutionPolicy 적용

      파워셀에서 Set-ExecutionPolicy -ExecutionPolicy Remotesigned 를 실행해 보자.

     그러면 아래 이미지처럼 Y, A, N, L, S, ? 중에서 선택하라고 뜨는데 A를 입력하고 엔터를 친다.

     성공이 되면 모두 Remotesigned로 바뀌겠지만 안되면 변함이 없을 것이다.

 

 

1.3  개별 LocalMachine, CurrentUser ExecutionPolicy 적용

     위의 1.2로 실행했지만 안되었다면 개별로 적용이 필요하다. 

     Set-ExecutionPolicy -ExecutionPolicy Remotesigned -scope LocalMachine  와

     Set-ExecutionPolicy -ExecutionPolicy Remotesigned -scope CurrentUser 를 각각 실행시켜보자.

     역시 선택하라고 뜨는데 개별이니 Y를 입력하고 엔터를 치면 된다. 두가지 다 실행하면 아래와 같이 변경이 될 것이다.

PS C:\Users\> Get-ExecutionPolicy -List
    Scope ExecutionPolicy
    ----- ---------------
MachinePolicy    Undefined
   UserPolicy    Undefined
      Process    Undefined
  CurrentUser    RemoteSigned
 LocalMachine    RemoteSigned

 

 

2. 실행문 파일 설치

  AWS 명령어를 실행하기 위한 파일을 설치해야한다. 

  https://docs.aws.amazon.com/ko_kr/powershell/latest/userguide/pstools-getting-set-up-windows.html 사이트로 접근해서
  차례로 수행한다.

 

2.1 AWS.Tools 설치

   AWS.Tools.zip 링크에서 ZIP파일을 다운로드 받아서 압축을 풀고 파워셀 창에서

   Install-Module -Name AWS.Tools.Installer 실행 후  Y를 선택하면 설치되는 게 보인다.
   만약 저장소를 "신뢰할수 없음" 으로 뜬다면 Install-Module -Name AWS.Tools.Installer -Force로 실행한다. 

   거의 이걸로 해야 할 거 같다.
    Install-AWSToolsModule AWS.Tools.EC2,AWS.Tools.S3 -CleanUp 를 실행하고 Y를 선택하여 최신 버전으로 업데이트 한다.

   ( AWS.Tools.EC2 와 AWS.Tools.S3 사이에 콤마이다.)

 

 

2.2 AWSPowerShell.NetCore 설치

  AWSPowerShell.NetCore.zip 링크에서 zip파일을 다운로드 받아서 압축을 푼다.

 역시 파워셀에서  Install-Module -name AWSPowerShell.NetCore (옵션 -Scope CurrentUser) 을 실행시킨다.

 

 

 

3. 파워셀 파일 구현

    특정 파라미터를 받아서 AWS 폴더에 있는 파일을 특정폴더로 다운로드 할 수 있도록 프로그램을 구성하겠다.

 

3.1 소스 개발

    일단 적당한 폴더에 아래와 같이 test.ps1 파일을 생성한다.

param(
    [datetime]$date,
    [string]$company
)
begin
{
    
    [String]$ym = "{0}{1}" -f $date.Year, ([string]$date.Month).PadLeft(2, '0');
    [String]$dt = "{0}{1}" -f $ym, ([String]$date.Day).PadLeft(2, '0');
    [String]$hour = ([string]$date.Hour).padleft(2, [char]'0');
    
    Write-Host "$ym"
    Write-Host "$dt"
    Write-Host "$hour"

    $s3_uri = "shopping-s3/$company/ym=$ym"+"/dt=$dt";
}
process
{
    $StoredCredentialsName = "계정명"
    $myStoredCredentialsName = "계정권한이름"
    $AccessKey = "접근키"
    $SecretKey = "접근암호"
    $RoleArn = "접근Role"
    
    Write-Host $s3_uri
    Set-AWSCredential  -AccessKey $AccessKey -SecretKey $SecretKey -StoreAs $StoredCredentialsName
    Set-AWSCredential -SourceProfile $StoredCredentialsName -RoleArn $RoleArn -StoreAs $myStoredCredentialsName
    Get-S3Object -ProfileName $myStoredCredentialsName -bucket "dev-s3-folder" -Prefix $s3_uri | Read-S3Object -ProfileName $myStoredCredentialsName -Folder C:\S3_DOWN
}

 

 

3.2 소스 설명

    하나씩 설명을 해보겠다.

 

param(
    [datetime]$date,
    [string]$company
)

param은 말그대로 파라미터를 받겠다는 것이고, 값은 datetime 형식인 date, String 타입인 company로 받겠다는 것이다.

 

begin
{
    
    [String]$ym = "{0}{1}" -f $date.Year, ([string]$date.Month).PadLeft(2, '0');
    [String]$dt = "{0}{1}" -f $ym, ([String]$date.Day).PadLeft(2, '0');
    [String]$hour = ([string]$date.Hour).padleft(2, [char]'0');
    
    Write-Host "$ym"
    Write-Host "$dt"
    Write-Host "$hour"

    $s3_uri = "shopping-s3/$company/ym=$ym"+"/dt=$dt";
}

Begin 부분은 최소 시작 시 한번 수행되는 부분이다.

String 타입의 ym, dt, hour 변수를 만들면서 

ym 은 첫번째와 두번째 인자를 받는데 그 포맷이 앞에는 $date.year 로 date변수에 있는 년도를 가져오고, 

뒤에는 $date.Month로 date변수에 있는 월을 가져오는데 [string]으로 타입을 변환하고 PadLeft로 왼쪽에 0을 채운다.

dt 도 거의 유사하게 되면서 날짜를 만든다.

hour는 (그냥 참고사항으로) $date.Hour 로 date 변수에 있는 시간을 가져오되 마찬가지로 왼쪽에 2자리가 되도록 0을 채운다.

 

Write-Host 변수는 해당 값을 한번 콘솔에 찍겠다는 것이다. 

 

$s3_url 변수는 문자열과 위의 변수를 조합해서 하나의 문자열을 만드는데 실제 S3에 사용되는 Path를 자동으로 구현하기 위함이다.

 

process
{
    $StoredCredentialsName = "계정명"
    $myStoredCredentialsName = "계정권한이름"
    $AccessKey = "접근키"
    $SecretKey = "접근암호"
    $RoleArn = "접근Role"
    
    Write-Host $s3_uri
    Set-AWSCredential  -AccessKey $AccessKey -SecretKey $SecretKey -StoreAs $StoredCredentialsName
    Set-AWSCredential -SourceProfile $StoredCredentialsName -RoleArn $RoleArn -StoreAs $myStoredCredentialsName
    Get-S3Object -ProfileName $myStoredCredentialsName -bucket "dev-s3-folder" -Prefix $s3_uri | Read-S3Object -ProfileName $myStoredCredentialsName -Folder C:\S3_DOWN
}

이 부분은 실제 수행이 되는 부분이다. 소스상에서 4줄은 AWS 계정을 미리 발급을 받았다면 해당 값으로 채우면 된다.

Set-AWSCredential 명령을 통해서 위에서 정의된 계정을 셋팅한다. 

그리고 Get-S3Object 명령을 이용하여 프로파일을 가지고 "dev-s3-folder" 버킷을 기준으로  위에서 만들어진 $s3_url 을 추적하고, 

Read-S3Object 명령을 통해서 -Folder에 정해진 폴더로 다운로드하도록 한다.

 

3.3 소스 실행

  실행을 한번 해보면 

이미지처럼 폴더에 잘 다운로드가 된다.

 

물론 S3로 들어가서 하나하나씩 다운로드를 해도 되지만 여러 폴더에 여러 파일이 있다면 수동으로 내려받기가 쉽지는 않다. 

그래서 추후에 사용할 경우에도 용이하게 하기 위해서 파워셀 파일을 만드는 것이다.

 

이상으로  파워셀에서 AWS S3 의 파일을 내려바든 걸 해보았다.

또 다른 파워셀 소스를 분석해 보도록 하겠다.

반응형

프로그램/추가 팁 Related Articles

MORE

Comments