AWS-CloudFormation

CloudFormation を使って ACM で証明書を取得して ELB に適用したみた

CloudFormation を使って ACM で証明書を取得して ELB に適用したみた

こんにちは、SRE 課の栩野です。
職場からの帰り道が桜満開で春を感じてます。

前回は CloudFormation で Route53 にホストゾーンを作成して、www の A レコードに
ELB の DNS 名を設定してみました。

今回は ACM (AWS Certificate Manager) で Amazon が発行する証明書を取得して
ELB に適用するまでを CloudFormation で自動化するテンプレートを作成してみようと思います。

前提として、すでに Route53 にホストゾーンは作成済みで、www の A レコードには ELB の
DNS 名が設定してあるといった形で進めていきます。

そこまでの設定方法については、以下前回のブログ等々参考にしていただければと思います。

CLOUDFORMATION で ROUTE53 のホストゾーンを作成して EIP と ELB の DNS 名をレコードに追加する

ACM のテンプレート作成

それでは早速、ACM のテンプレートを作成していきます。

テンプレートの内容としては、ホストゾーンを作成しているドメイン名で
ワイルドカード証明書(*.ドメイン名)を ACM で取得し、ELB のリスナーに適用する。
といったようなテンプレートになります。

ACM で証明書を取得する際には、ドメインの CNAME レコードを使って DNS の検証が必要になるので
設定するドメインのネームサーバが、 事前にしっかり Route53 に向いている必要があります。

下記がテンプレートの内容になります。

AWSTemplateFormatVersion: "2010-09-09"

Parameters:
  # とりあえずは、スタック作成時にパラメータとして証明書を取得したいドメイン名を入力します。
  # ドメイン名は作成しているホストゾーンのドメイン名を入力してください。
  record01:
    Type: String
    Default: "tochi-hoge.work"
    Description: domain name

Resources:
  # ------------------------------------------------------------#
  #  ACM
  # ------------------------------------------------------------#
  ACM:
    Type: AWS::CertificateManager::Certificate
    Properties:
      # 証明書を取得するドメイン名を設定します。 (パラメータで入力したドメイン名が入ります。)
      DomainName: !Sub "${record01}"
      # DNS検証を行うドメインを設定します。 (上記同様にドメイン名が入ります。)
      DomainValidationOptions:
        - DomainName: !Sub "${record01}"
          # Route53のホストゾーンIDをインポートして読み込みます。 (別スタックでアウトプットしておく必要有)
          HostedZoneId: !ImportValue "hostedzoneid"
      # 追加で取得したい証明書を設定します。 (今回はワイルドカード証明書を取得します。)
      SubjectAlternativeNames:
        # ワイルドカードを取得する場合は、ドメイン名の手前に*.をつけます。
        - !Sub "*.${record01}"
      # 検証方法はDNSを指定します。
      ValidationMethod: DNS

  # ------------------------------------------------------------#
  #  ALB HTTPS LISTENER
  # ------------------------------------------------------------#
  # 既存のELBにhttps用のリスナーを設定します。
  ALBListenerHTTPS:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      # ポートは443で設定します。
      Port: 443
      Protocol: HTTPS
      # リスナーにACMで取得した証明書を適用します。
      Certificates:
        - CertificateArn: !Ref ACM
      DefaultActions:
        # ELBのターゲットグループを指定します。(別スタックでアウトプットしておく必要有)
        - TargetGroupArn: !ImportValue "alb-tg"
          Type: forward
      # ALBを指定します。 (別スタックでアウトプットしておく必要有)
      LoadBalancerArn: !ImportValue "alb"

上記のテンプレートからスタックを作成すると...

Route53 には CNAME で DNS 検証用のレコードが作成されます。

ACM では DNS 検証が実施され、問題なければ無事に Amazon が発行する証明書の取得が完了します。

ELB のリスナーを確認すると、443 ポートのリスナーに ACM で取得した証明書が適用されています。

最後に、EC2 で Apache を稼働させた状態で、今回設定したドメイン名(tochi-hoge.work)に https でアクセスしてみると...

無事に AMC で取得した証明書が適用され、HTTPS でアクセスできるようになりました!

あとがき

CloudFormation を一発走らせるだけで、証明書が取得できて、ELB にも適用できてと超便利です。
しかも Amazon が発行する ACM の証明書は自動更新なので、更新時期を気にする必要もありません。

以上、ありがとうございました!

参考

AWS :: CertificateManager :: Certificate (AWS ドキュメント)

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA