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

こちらの記事を参考にさせて頂き設定したが、ALBの場合うまく行かなかったので、やり方を記載

* [Let's Encrypt 証明書の自動発行とELB自動登録を行ったログ
](http://qiita.com/hidekuro/items/482520f220a305dc147b)

ポイントは、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リファレンスはこちら
  * [modify-listener](http://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-listener.html)

# SSL証明書自動更新スクリプトの変更点

この部分を

```bash
# 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
```

↓

```bash
# ELB に新しいサーバー証明書を設定
$EXEC_AWS elbv2 modify-listener \
  --listener-arn $LISTNER_ARN \
  --port 443 \
  --protocol HTTPS \
  --certificates CertificateArn=$SERVER_CERT_ARN
```

に変更

# SSL証明書自動更新スクリプト全体

```bash
#!/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
```