도메인 갱신만을 목적으로 간단하게 구성한 스크립트이다. 6달 동안 총 3번의 갱신에서 특이사항이 없어서 공개를 해본다. 구현 방식은 다음과 같다.
- ACME 토큰 값을 도메인이름(junklab.domain)의 파일에 저장해서 Plesk DNS와의 비교 데이터로 사용한다.
- Plesk DNS의 _acme-challenge 데이터(domaintarget)을 가져와서 junklab.domain 파일의 내용(domainsource)과 다른지 확인한다.
- 값이 다르면 domaintarget값으로 도메인을 갱신한다.
AWS 액세스 키가 ubuntu 계정에 등록되어 있기 때문에, Cron도 ubuntu로 실행이 필요하다. 도메인 계정이 아닌 Plesk 관리자 계정(admin)으로 로그인 하고 Plesk 설정 -> 도구 -> 예약 스케줄 -> 새로운 스케줄 을 선택 한다. 아래 코드를 저장한 후 ./acme.sh 로 등록하고 하루에 한번 실행하게 해두었다. 다음과 같은 순서로 DNS 갱신이 이뤄지게 된다.
Let’s Encrypt 갱신 시도 -> Plesk DNS 변경 -> Lightsail DNS는 변경 안되어 실패 Email 전송 -> acme.sh 실행 -> Lightsail DNS 변경 -> Let’s Encrypt 갱신 성공 -> 성공 Email 전송
CLI로 도메인 갱신을 테스트할 때도 따옴표가 문제거리였는데, 쉘 스크립트에서도 domain-entry의 따옴표가 문제였다. Shell에서 직접 입력할때는 –domain-entry ‘{JSON DATA}’ 과 같이 사용하면 됐는데, 스크립트내에서 홑따옴표(‘) 내의 내용은 단순 문자로 취급되어 $domainid와 $domaintarget이 변수로서 동작을 하지 않았다.
해당 문제를 해결하기 위해 –domain-entry "{JSON DATA}"으로 겹따옴표로 변경했더니, 변수는 문제가 없었지만 JSON DATA의 겹따옴표가 다 무시되어 AWS CLI가 오류를 뱉어냈다.
"
-> "\""
, \
-> \\
로 escape 표시를 일일이 추가한 후에야 정상적으로 동작했다.
junklab.net
은 Lightsail에 등록된 도메인 이름, junklab.domain
은 아무 파일 이름으로 변경한 후 사용하면 된다.
#!/bin/sh export LANG=en_US.utf8 PATH=$PATH:/usr/local/bin aws lightsail get-domain --domain-name 'junklab.net' --region 'us-east-1' --output 'text' > junklab.domain domainid=$(awk -F" " '/_acme/ {print $2}' junklab.domain) domainsource=$(awk -F" " '/_acme/ {print $5}' junklab.domain | sed 's:"::g') domaintarget=$(sudo plesk bin dns --info junklab.net | awk -F" " '/_acme/ {print $3}') echo "ID is $domainid" echo "Source is $domainsource" echo "Target is $domaintarget" if [ "$domainsource" != "$domaintarget" ]; then echo "Need to Change" echo "aws lightsail update-domain-entry --domain-name 'junklab.net' --region 'us-east-1' --output 'text' --domain-entry '{"\""id"\"":"\""$domainid"\"","\""name"\"":"\""_acme-challenge.junklab.net"\"","\""target"\"":"\""\\"\""$domaintarget\\"\"""\"","\""isAlias"\"":false,"\""type"\"":"\""TXT"\""}'" aws lightsail update-domain-entry --domain-name 'junklab.net' --region 'us-east-1' --output 'text' --domain-entry "{"\""id"\"":"\""$domainid"\"","\""name"\"":"\""_acme-challenge.junklab.net"\"","\""target"\"":"\""\\"\""$domaintarget\\"\"""\"","\""isAlias"\"":false,"\""type"\"":"\""TXT"\""}" echo "Change is Done" else echo "No Change" fi exit 0