Skip to content

Instantly share code, notes, and snippets.

@hidekuro
Last active June 7, 2017 09:09
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save hidekuro/1801e711367b47a7e519 to your computer and use it in GitHub Desktop.
Save hidekuro/1801e711367b47a7e519 to your computer and use it in GitHub Desktop.
Let's Encryptで証明書を取得してIAMにアップロードし、ELBに設定するスクリプト。
#!/bin/bash
set -e
cd $(dirname $0)
# 現在日付のYYYYMMDD
DATE_CURRENT_YMD=$(date '+%Y%m%d')
# AWS Profile 名
AWS_PROFILE=elb_update_cert
# 独自ドメイン
DOMAINS=(
"yourdomain.com"
"www1.yourdomain.com"
"www2.yourdomain.com"
)
# IAM 上のサーバー証明書名。後ろに "-" + $DATE_CURRENT_YMD が付く。
CERT_NAME="letsencrypt-cert"
# 対象 ELB のロードバランサー名
ELB_NAME="my-site-balancer01"
# aws-cli 実行コマンド
EXEC_AWS="aws --profile elb_update_cert"
# Let's Encrypt の連絡用メールアドレス
LE_EMAIL=yourmail@example.com
# Let's Encrypt Client を clone したパス
LE_HOME=/home/ec2-user/letsencrypt
# letsencrypt-auto 実行コマンド
EXEC_LE_AUTO="${LE_HOME}/letsencrypt-auto --email $LE_EMAIL --agree-tos"
# 取得した証明書ファイルのリンク群が配置されるディレクトリ
# letsencrypt-auto に与えた最初のドメイン名が採用される
LE_FILES_ROOT=/etc/letsencrypt/live/${DOMAINS[0]}
# 証明書ファイル群のシンボリックリンクのパス
CERT_PATH=$LE_FILES_ROOT/cert.pem
CHAIN_PATH=$LE_FILES_ROOT/chain.pem
FULLCHAIN_PATH=$LE_FILES_ROOT/fullchain.pem
PRIVKEY_PATH=$LE_FILES_ROOT/privkey.pem
# DOMAINS を "-d" とペアで繋げたパラメータ (-d "yourdomain.com" -d "www1.yourdomain.com" ... )
LE_PARAM_DOMAINS=()
for domain in "${DOMAINS[@]}"; do
LE_PARAM_DOMAINS+=("-d" "$domain")
done
LE_PARAM_DOMAINS="${LE_PARAM_DOMAINS[@]}"
# 証明書を(再)発行。
$EXEC_LE_AUTO certonly --webroot \
--renew-by-default \
-w /var/www/letsencrypt \
$LE_PARAM_DOMAINS
# 現時点のサーバー証明書名リストを取得
OLD_SERVER_CERT_NAMES=$($EXEC_AWS iam list-server-certificates | jq -r ".ServerCertificateMetadataList[] | select(.ServerCertificateName | contains(\"${CERT_NAME}\")).ServerCertificateName")
# 新しい証明書のサーバー証明書名
NEW_SERVER_CERT_NAME="${CERT_NAME}-${DATE_CURRENT_YMD}"
# 新しい証明書を IAM にアップロード
$EXEC_AWS iam upload-server-certificate --server-certificate-name $NEW_SERVER_CERT_NAME \
--certificate-body file://$CERT_PATH \
--private-key file://$PRIVKEY_PATH \
--certificate-chain file://$CHAIN_PATH
# 反映を待つ
sleep 15
# 新しい証明書の ARN を取得
SERVER_CERT_ARN=$($EXEC_AWS iam list-server-certificates | jq -r ".ServerCertificateMetadataList[] | select(.ServerCertificateName == \"${NEW_SERVER_CERT_NAME}\").Arn")
# ELB に新しいサーバー証明書を設定
$EXEC_AWS elb set-load-balancer-listener-ssl-certificate \
--load-balancer-name $ELB_NAME \
--load-balancer-port 443 \
--ssl-certificate-id $SERVER_CERT_ARN
# 反映を待つ
sleep 15
# 古い証明書を削除
for cert_name in $OLD_SERVER_CERT_NAMES; do
$EXEC_AWS iam delete-server-certificate --server-certificate-name $cert_name
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment