AWS Lightsail에 Potato 배포하기
potato deploy로 Potato 주석 연구를 월 $12에 AWS Lightsail에 올리는 과정을, 자격 증명 설정부터 마지막에 주석을 내려받는 단계까지 설명합니다.
potato deploy up --provider aws는 주석 연구를 AWS Lightsail 가상 머신 한 대에 월 $12 정액으로 올리고, 주석자에게 보낼 HTTPS 주소를 마련해 줍니다. 계정에서 Lightsail이 꺼져 있지 않다면 AWS에서는 이 대상을 쓰십시오. 요금에는 IPv4 주소와 재시작해도 남는 60 GB 디스크가 포함되며, Potato에 필요한 권한은 lightsail:*와 sts:GetCallerIdentity뿐이므로 권한이 제한된 IAM 역할에서도 동작합니다. 이 페이지의 내용을 따르려면 Potato 2.10 이상과, 이미 potato start로 실행해 본 설정이 필요합니다.
AWS 자격 증명 설정하기
Potato는 aws 명령줄 도구와 같은 순서로 AWS 자격 증명을 읽습니다. 먼저 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY, 다음으로 AWS_PROFILE, 마지막으로 ~/.aws/credentials와 ~/.aws/config입니다. AWS extra를 설치하고, AWS CLI로 로그인한 뒤, Potato가 예상한 계정을 인식하는지 확인하십시오.
pip install 'potato-annotation[deploy-aws]'
aws configure # or: aws sso login --profile lab
potato deploy providers --verifyproviders --verify는 자격 증명이 누구의 것인지 각 공급자에게 물어보고 그 답을 출력합니다. 소속 기관이 통합 인증(SSO)을 쓴다면 모든 배포에 --aws-profile lab처럼 프로필 이름을 넘기십시오. Potato는 이를 기록해 두고 이후 명령에서 같은 계정을 씁니다. Potato는 AWS 자격 증명을 디스크에 쓰지 않습니다.
IAM 사용자나 역할의 권한이 제한되어 있다면 관리자에게 lightsail:*와 sts:GetCallerIdentity를 요청하십시오. 나머지 두 AWS 대상에는 이보다 많은 권한이 필요합니다. EC2 대상(--provider aws-ec2, 월 약 $18)은 Lightsail이 꺼져 있는 계정을 위한 것이고, ECS Express 대상(--provider aws-ecs)은 재시작하면 디스크가 사라지는 컨테이너를 실행합니다.
로그인할 수 있는 사람 정하기
potato deploy는 로그인 설정을 바꾸지 않으며, Lightsail 주소는 공개되어 있습니다. 설정이 누구나 가입할 수 있게 되어 있으면, 아래 드라이 런이 경고 D003 "Anyone who finds the URL can register and annotate."(URL을 찾은 사람은 누구나 가입해 주석을 달 수 있습니다)를 출력합니다. 크라우드소싱 연구에서는 플랫폼이 워커를 링크로 보내므로 보통 공개 가입이 의도한 설정입니다. 이름이 정해진 주석자라면 배포하기 전에 allow_all_users: false와 함께 user_config.users 아래에 명단을 적거나(비밀번호 관리), Google, GitHub, 소속 기관 계정으로 로그인하게 하십시오(SSO 및 OAuth 인증).
계획 확인하기
드라이 런에는 AWS 계정이 필요 없고 아무것도 만들지 않습니다. 사전 점검 보고서, 배포가 거칠 모든 단계, 예상 비용을 출력합니다.
potato deploy up myproject/config.yaml --provider aws --dry-run기본 배포에서 계획은 us-east-1에 작업 이름을 딴 인스턴스 하나를 만들고, 2 GB small_3_0 번들과 Ubuntu 24.04를 사용합니다. 고정 IP를 연결하므로 중지했다가 다시 시작해도 주소와 인증서가 그대로 유지되며, 포트는 22, 80, 443만 엽니다. Potato는 Caddy 웹 서버 뒤에서 포트 8000으로 요청을 받지만, 배포가 포트 8000을 여는 일은 없습니다. Potato는 이 배포용 SSH 배포 키를 생성하며, 내 SSH 키는 쓰지 않습니다.
기본값을 바꾸는 플래그는 세 가지입니다. --region에는 어떤 Lightsail 리전이든 지정할 수 있습니다. Potato는 항목 집합을 메모리에 두므로, 2 GB에 들어가지 않는 코퍼스에는 --size medium_3_0이 필요하며, 이렇게 하면 월 $24에 4 GB가 됩니다. --volume-gb는 GB당 월 $0.10인 별도의 Lightsail 디스크를 추가하고 작업 데이터를 그 디스크에 둡니다.
배포하기
같은 명령을 --dry-run 없이 실행하십시오. Potato는 계획을 다시 보여 주고 확인을 기다립니다.
potato deploy up myproject/config.yaml --provider aws인스턴스가 부팅되고 Docker를 설치하는 동안 배포에는 몇 분이 걸립니다. 마지막에 고정 IP의 https:// 주소인 URL과, 설정 옆에 있는 관리자 키 파일 .potato/secrets.json의 경로를 출력합니다. 관리자 키로 /admin의 관리자 대시보드를 열 수 있습니다. 설정을 수정한 뒤 up을 다시 실행하면 새 버전이 업로드되고 같은 인스턴스에서 작업이 다시 시작됩니다.
도메인 이름이 없으면 Let's Encrypt는 IP 주소에 대해 인증서를 발급합니다. 유효 기간은 약 6일이며 자동으로 갱신됩니다. 갱신에 실패하면 potato deploy status myproject/config.yaml이 이를 보고하므로, 연구를 지켜보는 사람 없이 운영한다면 며칠마다 확인하십시오. 내 도메인을 쓰려면 DNS A 레코드를 고정 IP로 지정하고 --domain annotate.example.edu를 붙여 다시 배포하십시오.
연구 마무리하기
주석은 인스턴스의 디스크에 있으며, 이 디스크는 서비스나 머신을 재시작해도 남지만 destroy를 거치면 남지 않습니다. 먼저 내 컴퓨터로 pull해 내용을 확인한 다음 인스턴스를 삭제하십시오.
potato deploy pull myproject/config.yaml
potato deploy destroy myproject/config.yamlpull은 배포가 수집한 모든 것을 새 potato-pull-<name>-<timestamp> 디렉터리에 기록하고, 데이터베이스는 SQLite의 백업 명령으로 복사합니다. destroy는 한 번도 pull하지 않은 배포에서는 실행되지 않습니다. 삭제할 때는 고정 IP도 해제됩니다. Lightsail은 인스턴스에 연결되지 않은 고정 IP에도 요금을 매기기 때문입니다. --volume-gb를 썼다면 destroy --keep-data로 별도 디스크를 남길 수 있습니다.
문제 해결
**"AWS rejected the credentials"**는 SSO 세션이 만료되었거나 AWS_PROFILE이 존재하지 않는 프로필을 가리킨다는 뜻입니다. aws sso login을 실행한 뒤 다시 배포하십시오.
**"Lightsail does not sell bundle …"**은 가격 변경에 따라 AWS가 번들 이름을 바꾸었을 때 나타납니다. 오류 메시지에 현재 판매 중인 번들이 나열되므로, 그중 하나를 --size에 지정하십시오.
처음 몇 분 동안은 HTTPS가 실패합니다. 인스턴스에 접속할 수 있게 된 뒤에야 인증서를 요청하기 때문입니다. potato deploy status는 인증서 오류를 서버가 내려간 상태와 구분해서 보고합니다.
더 읽을거리
- Potato를 로컬 또는 클라우드에서 실행하기: 다른 클라우드 대상과 백업 플래그
- 주석 서버 배포하기: 호스트 고르기
- AWS 배포 참조 문서: AWS 대상별로 필요한 정확한 IAM 작업 목록