크롤링을 할 일이 생겼는데, 파이썬 코드로 작성된 파일 여러개를 동시 실행하다보니 t*.micro에서는 원활하게 돌아가지 않고, 버벅거림이 있었다. 최소 small, medium에서 돌려야 깔끔하게 돌아가는걸 확인했다.
이제 금액이 고민이었다. medium 온디멘드로 띄워 놓으면 좋겠지만 한달에 나가는 비용이 만만치 않을 것이다. 그렇다고 크롤링 할 때마다 켰다 끄자니 너무 귀찮은일...
그래서 spot instance를 생성해서 가격적인 측면을 타협하고, 생성/삭제 과정을 terraform으로 관리하고자한다.
기본적인 설치/세팅은 shell script로 관리하고, crontab을 이용해 자동화 시킨다.
Terraform 설정
1. aws provider 설정
- IAM 계정 정보는 aws cli로 로컬에 저장
// provider.tf
provider "aws" {
profile = "default"
}
2. 보안그룹 설정
- security group을 만들고, security group rule을 따로 만들어서 참조하게 해준다.
- 이때 아웃바운드도 설정을 해줘야한다. (egress rule에서 default로 전체허용을 해주지 않는다)
// security-group.tf
resource "aws_security_group" "sg_crawling" {
name = "Crawling Security Group"
tags = { Name = "Crawling Security Group" }
}
resource "aws_security_group_rule" "sgr-in-ssh" {
type = "ingress"
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
security_group_id = "${aws_security_group.sg_crawling.id}"
}
resource "aws_security_group_rule" "sgr-out-http" {
type = "egress"
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
security_group_id = "${aws_security_group.sg_crawling.id}"
}
3. spot instance를 위한 main.tf 작성
- 이때 key_pair를 위한 rsa key는 아래 명령어로 생성할 수 있다. 별다른 설정없이 엔터 치면 /Users/<User Name>/.ssh 에 생성됨
ssh-keygen -t rsa
이렇게 생성되는 모습, 나중에 접속할 때 쓸 private key는 id_rsa파일로 cat id_rsa 로 확인할 수 있다.
variable "spot_instance_type" {
type = string
default = "t3.medium"
}
resource "aws_key_pair" "key_pair" {
key_name = "key_pair"
public_key = file("~/.ssh/id_rsa.pub")
}
resource "aws_spot_instance_request" "crawling_spot" {
ami = "ami-04cebc8d6c4f297a3" # Canonical, Ubuntu, 22.04 LTS, amd64 jammy image build on 2023-03-25
spot_price = "0.016"
spot_type = "one-time"
instance_type = var.spot_instance_type
instance_interruption_behavior = "terminate"
key_name = aws_key_pair.key_pair.key_name
vpc_security_group_ids = [aws_security_group.sg_crawling.id]
tags = {
Name = "CrawlingSpot"
}
}
output "public_ip" {
value = aws_spot_instance_request.crawling_spot.public_ip
description = "crawling_spot"
}
output "public_dns" {
value = aws_spot_instance_request.crawling_spot.public_dns
description = "crawling_spot"
}
이렇게 설정하고 terraform apply로 세팅할 수 있다.
terraform apply
Shell Script for python crawling
python, chrome driver 설치를 자동으로 해줌
- apt-get update 등에서 자동으로 yes를 선택해주기 위해 -y 옵션을 붙여준다.
- restart를 안해도 되게 needrestart를 remove해준다.
echo "Remove Restart"
sudo apt -y remove needrestart
echo "Start setting"
sudo apt update -y && sudo apt upgrade -y
sudo apt-get update -y
echo "Install pip3"
sudo apt install -y python3-pip
pip3 --version
echo "Install library"
sudo pip3 install selenium
sudo pip3 install webdriver_manager
sudo pip3 install pymysql
sudo pip3 install packaging
sudo pip3 install bs4
echo "Chrome download"
sudo apt-get install wget -y
sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
sudo apt-get update -y
sudo apt-get install google-chrome-stable -y
google-chrome --version
echo "make log DIR"
mkdir log
echo "Crontab Setting"
sh crontab-setting.sh
Shell Script for crontab setting
매달 1,8,15,22일에 0시 0분에 크롤링을 위한 파이썬 파일을 실행시키는 shell script가 실행되도록 crontab을 설정한다.
#!/bin/bash
echo "0 0 1,8,15,22 * * sh /home/ubuntu/python-ddakzip-crawling/<python크롤링 파일>.sh" | crontab -
참고자료
-* https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/spot_instance_request
-* https://rampart81.github.io/post/security_group_terraform/