이전에 Snowflake의 analytics Schema의 테이블을 생성하는 작업을 하였다. 이번에는 작성했던 python 파일(S3 적재)이 한 시간마다 자동으로 실행될 수 있도록 EC2 인스턴스를 생성하고 Crontab 서비스를 실행해 볼 것이다.
EC2 인스턴스 생성 및 Crontab 서비스 실행
데브코스 프로젝트에서 해당 내용을 정리해 뒀기에 이 내용을 보면서 진행하였다. 아래의 링크에 EC2 인스턴스를 생성하고, Crontab 서비스를 실행하는 방법이 정리돼 있다.
AWS EC2 설정
라이브러리 설치
EC2 서버에 접속한 뒤 필요한 라이브러리를 설치해 주었다.
pip install pandas
pip install boto3
pip install datetime
python 코드 가져오기
git clone https://github.com/ss721229/FC-Online-Match-Dashboard.git
환경 변수 설정
코드에 직접적으로 민감한 정보를 적으면 보안 상 문제가 된다. 그래서 s3 버킷에 접근하기 위해 사용하는 액세스 키와 비밀 액세스 키를 코드에 적지 않고 환경 변수 형태로 가져오도록 설정하였다. 홈 디렉터리(/home/ec2-user)에서 아래 과정을 따르면 환경 변수를 등록할 수 있다.
- .barhrc 열기
vi .bashrc
- 내용 수정 : 가장 아래쪽에 변수를 등록
...
...
export S3_ACCESS_KEY=~
export S3_SECRET_KEY=~
export NEXEN_API_KEY=~
- 실행
source .bashrc
- 테스트
echo $S3_ACCESS_KEY
환경 변수 사용
등록된 환경 변수는 os.environ.get()을 사용하여 python 코드에서 불러올 수 있다.
import os
...
def __init__(self):
self.s3 = boto3.client('s3', aws_access_key_id=os.environ.get('S3_ACCESS_KEY'), aws_secret_access_key=os.environ.get('S3_SECRET_KEY'), region_name=os.environ.get('S3_LOCATION'))
self.bucket_name = 'fc-online-match'
self.file_key = ['match_detail.csv', 'shoot.csv', 'pass.csv', 'defence.csv']
self.headers = {"x-nxopen-api-key": os.environ.get('NEXEN_API_KEY')}
...
crontab 서비스
IAM S3 버킷 권한 추가
Crontab 서비스를 이용하기 위해 IAM 사용자를 하나 생성하여 aws configure 등록을 해줘야 한다. 이 과정을 수행하고, 테스트를 위해 아래 명령어로 python 파일을 실행하려는데 S3 권한 문제가 발생하였다. 그래서 이전에 작성해 뒀던 S3 버킷 접근 권한을 해당 사용자에게 부여하여 문제를 해결하였다.
python3 scraping.py
crontab 서비스
- crontab 서비스 실행
# cron 설치
sudo yum install cronie
# cron 서비스 실행
sudo service crond start
# 수정 가능한 crontab 열기
crontab -e
- crontab -e : 명령어 입력
- 매 시간 5분마다 실행
- cron.log 파일에 로그가 적히도록 설정
5 * * * * /usr/bin/python3 /home/ec2-user/FC-Online-Match-Dashboard/scraping.py >> /home/ec2-user/FC-Online-Match-Dashboard/cron.log 2>&1
python 코드 수정
로그를 제대로 확인해 볼 수 있도록 print와 try-except를 활용하여 내용이 적히도록 수정하였다.
if __name__=='__main__':
print(f'{datetime.now()}: Start scraping')
try:
print("Create csv files if they don't exist")
test = FCOnlineMatch()
print("Done")
except Exception as e:
print(f"An error occurred while creating csv files: {e}")
raise
try:
print("Get csv files from s3")
match_detail, shoot, pass_, defence = test.get_csv_files_in_s3()
print("Done")
except Exception as e:
print(f"An error occurred while getting csv files from S3: {e}")
raise
try:
print("Append data to csv from api")
match_detail, shoot, pass_, defence = test.append_match_data_to_csv(match_detail, shoot, pass_, defence)
print("Done")
except Exception as e:
print(f"An error occurred while appending data to csv: {e}")
raise
try:
print("Save csv files to s3")
test.save_csv_to_s3(match_detail, shoot, pass_, defence)
print("Done")
except Exception as e:
print(f"An error occurred while saving csv files to S3: {e}")
raise
print('Done scraping')
다음에는 s3에서 snowflake로 벌크 업데이트가 될 수 있도록 crontab과 python 코드를 작성해 볼 것이다.
Reference
'프로젝트 단위 공부 > [개인 프로젝트] FC Online 공식 경기 분석' 카테고리의 다른 글
[개인 프로젝트] FC Online 공식 경기 분석 (8) - Preset Dashboard, 자동화 (0) | 2024.06.03 |
---|---|
[개인 프로젝트] FC Online 공식 경기 분석 (7) - EC2 / crontab 자동화 2 (0) | 2024.06.02 |
[개인 프로젝트] FC Online 공식 경기 분석 (5) - Snowflake analytics 테이블 생성 (0) | 2024.05.30 |
[개인 프로젝트] FC Online 공식 경기 분석 (4) - Snowflake 기본 설정 및 COPY (0) | 2024.05.29 |
[개인 프로젝트] FC Online 공식 경기 분석 (3) - 인프라 구성(S3, Snowflake, Preset) (0) | 2024.05.29 |