1. ホストゾーン ID を取得
  2. ACM で証明書発行
  3. DNS 検証用のレコードを Route 53 に登録
  4. 検証の完了を待つ
  5. CDK で ALB のリスナーに証明書を設定

ALB 用の証明書は、ALB と同じリージョンで発行する(CloudFront 用なら us-east-1)。

ホストゾーン ID を取得

ドメイン名は末尾にドットを付けて指定する。

aws route53 list-hosted-zones \
    --profile <your-profile> \
    --query "HostedZones[?Name=='example.com.'].Id" \
    --output text

ACM で証明書発行

aws acm request-certificate \
    --domain-name example.com \
    --validation-method DNS \
    --profile <your-profile> \
    --region ap-northeast-1

出力された CertificateArn を控える。

DNS 検証用のレコードを登録

検証用の CNAME レコードの名前と値を取得する。

aws acm describe-certificate \
    --certificate-arn <certificate-arn> \
    --query "Certificate.DomainValidationOptions[0].ResourceRecord" \
    --profile <your-profile> \
    --region ap-northeast-1

validation.json を作成して、Route 53 に登録する。

{
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "<ResourceRecord の Name>",
        "Type": "CNAME",
        "TTL": 300,
        "ResourceRecords": [{ "Value": "<ResourceRecord の Value>" }]
      }
    }
  ]
}
aws route53 change-resource-record-sets \
    --hosted-zone-id <hosted-zone-id> \
    --change-batch file://validation.json \
    --profile <your-profile>

検証の完了を待つ

aws acm wait certificate-validated \
    --certificate-arn <certificate-arn> \
    --profile <your-profile> \
    --region ap-northeast-1

CDK で ALB のリスナーに証明書を設定

作成済みの証明書を ARN で参照する。

const certificate = acm.Certificate.fromCertificateArn(this, 'Certificate', certificateArn);

const listener = alb.addListener('HttpsListener', {
  port: 443,
  protocol: elbv2.ApplicationProtocol.HTTPS,
  certificates: [certificate],
});

証明書の ARN にはアカウント ID が含まれるため、コードやドキュメントに貼るときはマスクする。 同一アカウントの Route 53 ホストゾーンを使う場合は、CDK の acm.CertificateCertificateValidation.fromDns(hostedZone) を指定して、発行と検証を自動化する方法もある。ただし、デプロイが検証の完了待ちになる点に注意する。