여러 개 도메인에 대해 ACM 인증서를 일괄적으로 생성 요청하고,

인증 레코드를 추가하는 명령어를 생성하는 파이썬 스크립트이다.

 

AWS 이전 중인 서버 중 호스팅 서버가 포함되어있어 작성했고,

도메인도 자체 DNS 서버에서 관리 중이어서 인증 레코드를 추가하는 명령어도 작성했다.

 

ACM 생성 시, 일반 도메인과 멀티 도메인을 구분하여 생성하도록 작성하였다.

(acm_domain_list는 일반, acm_domain_list_multi는 멀티 도메인)

 

ACM은 S3의 boto3와 같은 라이브러리가 없어서 aws cli를 이용한다.

 

! 실행하기 전에 acm 생성 권한이 있는지 확인한다.

import os
import subprocess

# 작업 경로.
work_dir="D:\\Python\\acm\\"

# DNS 서버 IP.
dns_server="127.0.0.1"

# 도메인 목록 파일 지정.
domain_list_1=work_dir+"acm_domain_list"
domain_list_2=work_dir+"acm_domain_list_multi"


# 도메인 입력.
domain_file = open("%s" % (domain_list_1), "r")
domain_list = domain_file.read().splitlines()
domain_file.close()
# 멀티 도메인 입력.
domain_file2 = open("%s" % (domain_list_2), "r")
domain_list2 = domain_file2.read().splitlines()
domain_file2.close()


# ACM 생성.
arn_path=work_dir+'arn_list.txt'

# ACM이 이미 생성된 경우, 바로 DNS 인증 레코드 생성.
if os.path.isfile(arn_path):
    pass
else:
    arn_list_tmp = ''
    
    for domain in domain_list:
        arn_tmp = os.popen('aws acm request-certificate --domain-name %s --validation-method DNS --tag Key=Name,Value=%s | findstr CertificateArn' % (domain,domain)).read()
        arn_tmp = arn_tmp.replace('"','').replace(" ","").replace("CertificateArn:","")
        arn_list_tmp+=arn_tmp
        
    for domain in domain_list2:
        arn_tmp = os.popen('aws acm request-certificate --domain-name %s --validation-method DNS --tag Key=Name,Value=%s --subject-alternative-names *.%s | findstr CertificateArn' % (domain,domain,domain)).read()
        arn_tmp = arn_tmp.replace('"','').replace(" ","").replace("CertificateArn:","")
        arn_list_tmp+=arn_tmp
        
    arn_file = open(arn_path,'w')
    arn_file.write(arn_list_tmp)
    arn_file.close()


# DNS 인증 레코드 생성(for IIS).
add_record=''

arn_file = open(arn_path, "r")
arn_list = arn_file.read().splitlines()

for arn_tmp in arn_list:
    auth_domain_tmp = os.popen('aws acm describe-certificate --certificate-arn %s --output text | findstr DNS' % (arn_tmp)).read().split()
    auth_domain = auth_domain_tmp[1]

    auth_record_tmp = os.popen('aws acm describe-certificate --certificate-arn %s --output text | findstr RESOURCERECORD' % (arn_tmp)).read().split('\n')
    auth_record = auth_record_tmp[0]
    
    domain_tmp = '.'+auth_domain+'.'
    auth_record = auth_record.replace('RESOURCERECORD','').replace(domain_tmp,'').replace("\n","").replace("\t"," ")

    add_record+='dnscmd %s /recordadd %s %s\n' % (dns_server,auth_domain,auth_record)

add_record_file = open(work_dir+'add_record.txt','w')
add_record_file.write(add_record)
add_record_file.close()

 

ACM 삭제 및 DNS 삭제 레코드

더보기
# # ACM 삭제.
# arn_file = open(arn_path, 'r')
# arn_list = arn_file.read().splitlines()
# arn_file.close()
# for arn in arn_list:
#     os.system('aws acm delete-certificate --certificate-arn %s' % (arn))


# # DNS 인증 레코드 삭제
# arn_file = open(work_dir+"add_record.txt", 'r')
# arn_list = arn_file.read().replace("recordadd","recorddelete")
# arn_file.close()
# arn_file = open(work_dir+"delete_record.txt", 'w')
# arn_file.write(arn_list)
# arn_file.close()