こちらの記事を参考にさせて頂き設定したが、ALBの場合うまく行かなかったので、やり方を記載
ポイントは、ALBはELBのAPIとは異なり、さらにパラメーターが違うということ。
それにより、以下の違いがある
- ALBはaws elb → aws elbv2
- 対象ロードバランサーの指定方法が、ELB_NAMEでの指定ではなくLISTNER_ARNになった、SSLポートの方を指定
- メソッドもaws elb set-load-balancer-listener-ssl-certificateからaws elbv2 modify-listenerへ
- はまりポイントとしては一応aws elb describe-load-balancersでもALBのロードバランサーもリストに出て来るがelb set-load-balancer-listener-ssl-certificateを実行すると、そんなロードバランサーは存在しないと言われてしまう。
AWS CLI elbv2(ALB) modify-listener の APIリファレンスはこちら
SSL証明書自動更新スクリプトの変更点
この部分を
# 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
↓
# ELB に新しいサーバー証明書を設定
$EXEC_AWS elbv2 modify-listener \
--listener-arn $LISTNER_ARN \
--port 443 \
--protocol HTTPS \
--certificates CertificateArn=$SERVER_CERT_ARN
に変更
SSL証明書自動更新スクリプト全体
#!/bin/bash
set -e
cd $(dirname $0)
# 現在日付のYYYYMMDD
DATE_CURRENT_YMD=$(date '+%Y%m%d')
# AWS Profile 名
AWS_PROFILE=elb_update_cert
# 独自ドメイン
DOMAINS=(
"example.com"
)
# IAM 上のサーバー証明書名。後ろに "-" + $DATE_CURRENT_YMD が付く。
CERT_NAME="letsencrypt-cert"
# 対象 ELB のロードバランサーARN
LISTNER_ARN="arn:aws:elasticloadbalancing:ap-northeast-1:xxxxxxxxxxxxxxxx"
# aws-cli 実行コマンド
EXEC_AWS="aws --profile elb_update_cert"
# Let's Encrypt の連絡用メールアドレス
LE_EMAIL=info@example.com
# Let's Encrypt Client を clone したパス
LE_HOME=/usr/local/certbot
# letsencrypt-auto 実行コマンド
EXEC_LE_AUTO="${LE_HOME}/cert-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 elbv2 modify-listener \
--listener-arn $LISTNER_ARN \
--port 443 \
--protocol HTTPS \
--certificates CertificateArn=$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