目次

Introduction

今回はAWSでドメイン登録をし、Amazon発行の証明書取得までをやっていこうと思います。
ドメイン登録や証明書発行時の検証の部分は反映に時間がかかる場合があります。またACMの発行時はリージョンをまたぐ場合があるので注意が必要です。
それでは軽く解説しながらCFnの記載していきます。

今回作成するもの

AWSリソース

CFn相関図

HandsOn

ドメイン取得とRoute53

まず、ドメインを取得・購入しないことには始まりません。
筆者はお名前.comで取得していたドメインを使用します。(もう期限切れそうですけど)
Route53で取得したドメインを登録し、Route53をネームサーバーとして利用できるようにします。

.pre-commit-config.yaml
cloudformation
 L iam-user.yaml
   iam-role.yaml
   cloudtrail.yaml
   vpc.yaml
   subnet.yaml
   sg.yaml
   route53.yaml(new)
AWSTemplateFormatVersion: "2010-09-09"
Description: "stackName: route53. AWS::S3::Bucket"

Parameters:
  Domain:
    Type: String
    Description: Route53 Domain
    Default: example.com

Resources:
  PublicHostedZone:
    Type: AWS::Route53::HostedZone
    Properties:
      Name: !Ref Domain
      HostedZoneConfig:
        Comment: !Sub PublicHostedZone ${Domain}

Outputs:
  PublicHostedZoneId:
    Description: Output Export AWS::Route53::HostedZone.Ref
    Value: !Ref PublicHostedZone
    Export:
      Name: public-hosted-zone-id

スタック名は、route53
ParametersのDomainは取得したドメインを入力してください。
またお名前.comから取得したドメインをroute53に登録する一連の流れを知りたい知りたい方は、お名前.comで取得したドメインをRoute53のネームサーバで管理設定してみたをご覧ください。結構細かく書いてあります。
今回登録したドメインを下記コマンドで登録できていることが確認できました。

$ nslookup -type=NS looseller.com
Server:		2404:1a8:7f01:b::3
Address:	2404:1a8:7f01:b::3#53

Non-authoritative answer:
looseller.com	nameserver = ns-xxx.awsdns-27.com.
looseller.com	nameserver = ns-xxx.awsdns-60.net.
looseller.com	nameserver = ns-xxxx.awsdns-62.org.
looseller.com	nameserver = ns-xxxx.awsdns-17.co.uk.

Authoritative answers can be found from:

ACM

Route53の登録が終わったら次に登録したドメインでALBやCloudFrontをhttps通信できるように証明書を取得したいと思います。証明書は外部から取得するとお金が結構かかるイメージですが、AWSリソースだけで完結する場合はAmazon発行の証明書を使用するため無料でhttps通信が可能になります。
ここで注意点があります。今までCFnは東京リージョンで全てスタックを作成してきましたが、ACMの場合は一部東京リージョンではなくバージニア北部でスタックを作成します。
これには理由があり、ALB(ロードバランサー)は東京リージョンで作成する場合東京リージョンで作成したACMをアタッチすれば良いのですが、CloudFrontにはリージョンの概念がなくバージニア北部のACMしかアタッチできないため東京・バージニア北部どちらのリージョンにもACMを作成する必要があります。

.pre-commit-config.yaml
cloudformation
 L iam-user.yaml
   iam-role.yaml
   cloudtrail.yaml
   vpc.yaml
   subnet.yaml
   sg.yaml
   route53.yaml
   acm.yaml(new)
AWSTemplateFormatVersion: "2010-09-09"
Description: "stackName: acm. AWS::CertificateManager::Certificate"

Parameters:
  Domain:
    Type: String
    Description: Validation Domain
    Default: example.com
  HostedZoneId:
    Type: String
    Description: HostedZoneId
    Default: Z012345689ABCDEFG

Resources:
  ACM:
    Type: AWS::CertificateManager::Certificate
    Properties:
      DomainName: !Ref Domain
      DomainValidationOptions:
        - DomainName: !Ref Domain
          HostedZoneId: !Ref HostedZoneId
      ValidationMethod: DNS

Outputs:
  ACMArn:
    Description: Output Export AWS::CertificateManager::Certificate.Arn
    Value: !Ref ACM
    Export:
      Name: acm-arn

スタック名は、acm
HostedZoneIdはImportValueではなく、Parametersで指定するようにしています。ImportValueで指定しないと依存関係でわかりにくくなってしまうのですが、これには理由があります。
route53のスタックは東京リージョンに作成しているのですが、東京リージョンで作成したスタックはリージョンを跨いでバージニア北部でImportValueを使用して参照することができません。そのためParametersで手動で指定するようにしています。
では、東京リージョンで流した後バージニア北部でも流すことを忘れないでください。

また外の記事に投げてしまうのですが、CFnでACMを発行する詳しい解説は[アップデート] CloudFormation で AWS Certificate Manager のDNS検証を自動化できるようになりましたをご覧ください。

終わりに

ドメイン登録から証明書の発行まで実施してみました。証明書発行部分はAWSコンソールで操作するのとはちょっと違ったところもあり困惑するところもあったかもしれません。
次の記事では、ロードバランサーやCloudFrontの負荷分散リソース部分を構築していきたいと思います。

参考