Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

Bash 스크립트를 사용하여 AWS S3 버킷에서 파일 다운로드 및 보기를 관리하는 방법

이 기사에서 읽을 수 있듯이 최근에 이메일 서버에 문제가 발생하여 이메일 관리를 Amazon의 Simple Email Service(SES)에 아웃소싱하기로 결정했습니다.

그 솔루션의 문제는 SES가 새 메시지를 S3 버킷에 저장하도록 했고 AWS Management Console을 사용하여 S3 버킷 내에서 파일을 읽는 것이 정말 빨리 오래되었다는 것입니다.

그래서 새로운 메시지를 다운로드하고, 적절하게 저장하고, 보는 과정을 자동화하는 Bash 스크립트를 작성하기로 결정했습니다.

Ubuntu Linux 데스크탑에서 사용하기 위해 이 스크립트를 작성하는 동안 Linux용 Windows 하위 시스템을 통해 macOS 또는 Windows 10 시스템에서 작동하도록 하는 데 너무 많은 노력이 필요하지 않습니다.

다음은 전체 스크립트입니다. 잠시 시간을 내어 살펴보신 후 한 번에 한 단계씩 안내해 드리겠습니다.

#!/bin/bash
# Retrieve new messages from S3 and save to tmpemails/ directory:
aws s3 cp \
   --recursive \
   s3://bucket-name/ \
   /home/david/s3-emails/tmpemails/  \
   --profile myaccount

# Set location variables:
tmp_file_location=/home/david/s3-emails/tmpemails/*
base_location=/home/david/s3-emails/emails/

# Create new directory to store today's messages:
today=$(date +"%m_%d_%Y")
[[ -d ${base_location}/"$today" ]] || mkdir ${base_location}/"$today"

# Give the message files readable names:
for FILE in $tmp_file_location
do
   mv $FILE ${base_location}/${today}/email$(rand)
done

# Open new files in Gedit:
for NEWFILE in ${base_location}/${today}/*
do
   gedit $NEWFILE
done

현재 내 S3 버킷에 있는 모든 메시지를 다운로드하는 단일 명령으로 시작하겠습니다(그런데 개인 정보를 보호하기 위해 버킷 이름과 기타 파일 시스템 및 인증 세부 정보를 변경했습니다).

aws s3 cp \
   --recursive \
   s3://bucket-name/ \
   /home/david/s3-emails/tmpemails/  \
   --profile myaccount

물론 이것은 로컬 시스템에 대해 AWS CLI를 이미 설치하고 구성한 경우에만 작동합니다. 아직 하지 않았다면 지금 할 때입니다.

cp 명령은 "복사", --재귀를 나타냅니다. 여러 객체에도 작업을 적용하도록 CLI에 지시합니다. s3://bucket-name 내 버킷을 가리키고(버킷 이름은 분명히 다를 것입니다), /home/david... 행은 메시지를 복사할 절대 파일 시스템 주소이고, --profile 인수는 내가 참조하는 여러 AWS 계정을 CLI에 알려줍니다.

다음 섹션에서는 나머지 스크립트를 통해 파일 시스템 위치를 훨씬 쉽게 지정할 수 있도록 두 개의 변수를 설정합니다.

tmp_file_location=/home/david/s3-emails/tmpemails/*
base_location=/home/david/s3-emails/emails/

tmp_file_location 값이 어떻게 변수는 별표로 끝납니다. 내의 파일을 참조하고 싶기 때문입니다. 디렉터리 자체가 아니라 해당 디렉터리입니다.

나중에 메시지를 더 쉽게 찾을 수 있도록 .../emails/ 계층 구조 내에 새로운 영구 디렉토리를 생성하겠습니다. 이 새 디렉토리의 이름은 현재 날짜가 됩니다.

today=$(date +"%m_%d_%Y")
[[ -d ${base_location}/"$today" ]] || mkdir ${base_location}/"$today"

먼저 오늘이라는 새 셸 변수를 만듭니다. 날짜 +"%m_%d_%Y"의 출력으로 채워집니다. 명령. 날짜 자체적으로 전체 날짜/타임스탬프를 출력하지만 뒤에 오는 내용("%m_%d_%Y" ) 해당 출력을 더 간단하고 읽기 쉬운 형식으로 편집합니다.

그런 다음 해당 이름을 직접 사용하여 존재하는지 테스트합니다. 이는 해당 날짜에 이미 이메일을 받았으므로 디렉토리를 다시 생성할 필요가 없음을 나타냅니다. 그러한 디렉토리가 그렇지 않다면 존재(||), mkdir 나를 위해 만들 것입니다. 이 테스트를 실행하지 않으면 명령이 성가신 오류 메시지를 반환할 수 있습니다.

Amazon SES는 S3 버킷에 드롭하는 각 메시지에 보기 흉하고 읽을 수 없는 이름을 부여하므로 이제 동적으로 이름을 변경하는 동시에 새 홈(방금 생성한 날짜가 지정된 디렉터리)으로 이동합니다. .

for FILE in $tmp_file_location
do
   mv $FILE ${base_location}/${today}/email$(rand)
done

for...do...done 루프는 $tmp_file_location이 나타내는 디렉토리의 각 파일을 읽습니다. 변수를 만든 다음 방금 만든 디렉터리($base_location로 표시됨)로 이동합니다. $오늘의 현재 값 외에 변수 ).

동일한 작업의 일부로 새 이름인 "email " 다음에 rand에 의해 생성된 임의의 숫자가 옵니다. 명령. 난수 생성기를 설치해야 할 수도 있습니다. apt install rand 우분투에서.

스크립트의 이전 버전은 count=1...count=$((count+1)) for 내의 논리 고리. 같은 날 두 개 이상의 메시지 배치를 받지 않는 한 잘 작동했습니다. 내가 그랬다면 새 메시지는 그 날의 디렉토리에 있는 이전 파일을 덮어쓸 것입니다.

수학적으로 내 랜드가 명령은 중복되는 숫자를 두 파일에 할당할 수 있지만 기본 범위가 rand 인 경우 사용 횟수는 1에서 32,576 사이이며 감수할 수 있습니다.

이 시점에서 내가 보낸 새 메시지 각각에 대해 email3039, email25343 등과 같은 이름을 가진 파일이 새 디렉토리에 있어야 합니다.

트리 실행 내 시스템에서 명령을 실행하면 5개의 메시지가 내 02_27_2020 디렉토리에 저장되고 하나가 더 02_28_2020에 저장되었음을 보여줍니다(이 파일은 이전 버전의 내 스크립트를 사용하여 생성되었으므로 순차적으로 번호가 매겨집니다).

현재 tmpemails - 에 파일이 없습니다. mv 명령이 파일을 새 위치로 이동하고 아무 것도 남기지 않기 때문입니다.

$ tree
.
├── emails
│   ├── 02_27_2020
│   │   ├── email1
│   │   ├── email2
│   │   ├── email3
│   │   ├── email4
│   │   ├── email5
│   └── 02_28_2020
│       └── email1
└── tmpemails

스크립트의 마지막 섹션은 내가 가장 좋아하는 데스크탑 텍스트 편집기(Gedit)에서 각각의 새 메시지를 엽니다. 유사한 for...do...done을 사용합니다. 루프, 이번에는 새 디렉토리에 있는 각 파일의 이름을 읽습니다("오늘 " 명령)을 클릭한 다음 Gedit에서 파일을 엽니다. 디렉토리 위치 끝에 추가한 별표를 확인하세요.

for NEWFILE in ${base_location}/${today}/*
do
   gedit $NEWFILE
done

아직 할 일이 하나 더 있습니다. S3 버킷을 정리하지 않으면 스크립트를 실행할 때마다 누적된 모든 메시지가 다운로드됩니다. 그러면 관리하기가 점점 더 어려워집니다.

따라서 새 메시지를 성공적으로 다운로드한 후 이 짧은 스크립트를 실행하여 버킷의 모든 파일을 삭제합니다.

#!/bin/bash
# Delete all existing emails 

aws s3 rm --recursive s3://bucket-name/ --profile myaccount