도메인 갱신만을 목적으로 간단하게 구성한 스크립트이다. 6달 동안 총 3번의 갱신에서 특이사항이 없어서 공개를 해본다. 구현 방식은 다음과 같다.

  1. ACME 토큰 값을 도메인이름(junklab.domain)의 파일에 저장해서 Plesk DNS와의 비교 데이터로 사용한다.
  2. Plesk DNS의 _acme-challenge 데이터(domaintarget)을 가져와서 junklab.domain 파일의 내용(domainsource)과 다른지 확인한다.
  3. 값이 다르면 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