【AWS】CloudFormtionでブログサービスを構築してみた(04.Route53編)

# 01.はじめに
[【AWS】CloudFormtionでブログサービスを構築してみた(03.S3,CloudFront編)](https://qiita.com/1k5/items/a19cb65bb749b985970c)の続きである。
過去に公開した記事は下記の通りである。
・[【AWS】CloudFormtionでブログサービスを構築してみた(概要編)](https://qiita.com/1k5/items/4f6d61373e80f824bd9a)
・[【AWS】CloudFormtionでブログサービスを構築してみた(01.Network編)](https://qiita.com/1k5/items/d268697691ef2ef3dd0e)
・[【AWS】CloudFormtionでブログサービスを構築してみた(02.EC2,RDS,ALB編)](https://qiita.com/1k5/items/5acca0ee627ec37b56da)
・[【AWS】CloudFormtionでブログサービスを構築してみた(03.S3,CloudFront編)](https://qiita.com/1k5/items/a19cb65bb749b985970c)

`この記事で扱うものはコンポーネントは下記である。`
1.Route53

# 02 構成図
![構成図2-Route53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050566/acca5504-2126-3e0c-3d4b-75356598b675.png)

本稿でWAFの設定以外が完了する。
Route53で
ALB→プライマリレコードの設定
CloudFront →セカンダリレコードの設定を実施する

テーブルにすると下記になる。
|レコード名|タイプ　 |ルーティングポリシー　|差別化要因　|値/トラフィックのルーティング先　|
|:---------:|:---------:|:-------:|:-------:|:-------:|
|www\.domain name　|A|フェイルオーバー　|プライマリ　|ALB|
|www\.domain name　|A|フェイルオーバー　|セカンダリ　|CloudFront |


# 03.テスト方法
設定後、下記観点でテストを実施する。
1.Route53で設定したドメインで通常アクセスが出来るか
2.EC2を２台ともシャットダウンした状態でセカンダリに通信が流れるか。
3.EC2は生きているがRDSをシャットダウンした状態でも問題なくセカンダリに通信が流れるか(ヘルスチェックのパスが/index.phpで問題ないか)


# 04.テンプレートファイル
Outputs情報
```yaml
Outputs:
  #CloudFrontのDNS名の定義
  CloudFrontDNS:
      Value: !GetAtt CloudFrontDistribution.DomainName
      Export:
        Name: CloudFront-DNS-Outputs
#ALBのDNS名の定義(Route53で使う)
  ALBDomainName:
      Value: !GetAtt CFALB.DNSName
      Export:
        Name: ALB-DNS-Outputs
#ALBのゾーンIDの定義(Route53で使う)
  ALBZoneId:
      Value: !GetAtt CFALB.CanonicalHostedZoneID
      Export:
        Name: ALB-CanonicalHostedZoneID-Outputs
```


ネットワーク編で記載したymlファイルに下記を追記する。
```yaml:network.yml
# ------------------------------------------------------------#
#  パラメータ
# ------------------------------------------------------------#
Parameters:
ドメイン名を指定
  HostedZoneName:
    Type: String
    Description: Type of this domain name.
  
################
##以下追記する###
#################
#Route53のショートネームを指定。初回はwwwで登録する
  Shortname:
    Type: String
    Description: Short name.
    Default: "www."

~~~~~~~~~~~~~中略~~~~~~~~~~~~~~~~~~~

# ------------------------------------------------------------#
# Route53
# ------------------------------------------------------------#
# ------------------------------------------------------------#
#  HostZone
# ------------------------------------------------------------#
  Route53HostedZone:
    Type: AWS::Route53::HostedZone
    Properties:
      Name: !Sub "${HostedZoneName}"
      HostedZoneTags:
        -
          Key: Name
          Value: DNS-Zone
          

#################
###以下追記する###
#################
# ------------------------------------------------------------#
#  HealthCheck
# ------------------------------------------------------------#
  DNSHealthCheck:
    Type: 'AWS::Route53::HealthCheck'
    Properties:
      HealthCheckConfig:
        Port: 443
        Type: HTTPS
        #RDSがダウンしたら下記には疎通が通らないのでEC2とRDSの監視を両方網羅できる
        ResourcePath: /index.php
        FullyQualifiedDomainName: !ImportValue ALB-DNS-Outputs
        RequestInterval: 30
        FailureThreshold: 3
      HealthCheckTags: 
        -
          Key: Name
          Value: DNS-HealthCheck

# ------------------------------------------------------------#
#  Record
# ------------------------------------------------------------#
  DNSRecord:
    Type: AWS::Route53::RecordSetGroup
    Properties:
      HostedZoneName: !Sub "${HostedZoneName}."
      RecordSets:
      #Primary(ALB)
      - Name: !Sub "${Shortname}${HostedZoneName}."
        Failover: PRIMARY
        HealthCheckId: !Ref DNSHealthCheck
        SetIdentifier: "LB-P"
        Type: A
        AliasTarget:
          HostedZoneId: !ImportValue ALB-CanonicalHostedZoneID-Outputs
          EvaluateTargetHealth: true
          DNSName: !ImportValue ALB-DNS-Outputs

      #Secondary(CloudFront)
      - Name: !Sub "${Shortname}${HostedZoneName}."
        Failover: SECONDARY
        SetIdentifier: "LB-S"
        Type: A
        AliasTarget:
          HostedZoneId: Z2FDTNDATAQYW2 # 固定値
          DNSName: !ImportValue CloudFront-DNS-Outputs
```



# 05.テストアクセス
 1.Route53で設定したドメインで通常アクセスが出来るか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050566/85ec6ef6-16af-2eec-e41b-b0010b6121a8.png)
→想定通り

2.2.EC2を２台ともシャットダウンした状態でセカンダリに通信が流れるか。
　EC2をシャットダウンする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050566/a0fe6270-5625-bbf8-b341-a51a735cb60a.png)


　1-2分くらい待ってからアクセスするとSorryページに通信が切り替わる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050566/02206578-c700-514d-a5c4-78fddaf28eed.png)
→想定通り

3.EC2は生きているがRDSをシャットダウンした状態でも問題なく
　セカンダリに通信が流れるか(ヘルスチェックのパスが/index.phpで問題ないか)

RDSを一時停止する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050566/8c8be829-0b89-2065-ec60-4208e4b37612.png)
EC2は一台起動した
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050566/8144552b-0e8c-8704-2783-9ae1757980be.png)

シャットダウン後すぐはヘルスチェックが切り替わらないのでデータベース接続エラーが出る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050566/18f7b8b1-db52-2676-e03a-d1580e0ac0bc.png)

しばらくするとSorryページに通信が切り替わる(ブラウザキャッシュとかの関係もあるのだろうか？)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050566/ac4edb62-865d-339b-92c9-2eb3dad6de39.png)

ヘルスチェックも問題なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050566/60c8b494-712d-5bdf-318e-4a2d9e970b34.png)

# 参考文献
https://blog.denet.co.jp/cloudformation-route53-eip-dns/

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-changesets.html

https://qiita.com/middle/items/603a609a46b8f1f3f6fa

https://zenn.dev/wakkunn/articles/66a6e8372611dc

https://blog.denet.co.jp/route53-healthcheck-verification/

★次回はこちら
・[【AWS】CloudFormtionでブログサービスを構築してみた(05.Waf編)](https://qiita.com/1k5/items/c36c719c8be2803f80bb)