LoginSignup
12
11

More than 5 years have passed since last update.

AWS Let's Encrypt 証明書の自動発行とALBへの自動登録

Last updated at Posted at 2017-02-17

こちらの記事を参考にさせて頂き設定したが、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
12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11