[CloudFormation] CFnで環境作り完全版 Part4. ドメイン編
目次
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で手動で指定するようにしています。
では、東京リージョンで流した後バージニア北部でも流すことを忘れないでください。

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