Back to tech

CloudFlareのドメインにサブドメインを作って、AWS Route53へ権限委譲する

2 min read
Table of Contents

日頃から業務で AWS を扱っています。

CDK という素晴らしいツールを使ってガシガシ作っています。

業務外でもお遊びで使ってみたいということで、個人でAWSアカウントを作りました。

「せっかくだから Route53 もくっつけたいな」と思い、ドメインを払い出そうとしたのですが、ドメインの維持費にお金がかかります。

そのため、このブログで使っている ドメインにサブドメインを生やして権限委譲でなんとかしようと考えました。

そのために色々したことを書いておきます。

私みたいに 「ドメイン管理は CloudFlare にしていて、AWS で Route53 を使ったドメインで発信したいんだけどどうすればよいのか」みたいな人がいましたら参考になると思います。

前提

  • CloudFlare にドメイン登録済み
  • AWS アカウント発行済

方法

紙芝居形式で書いていきます。

autumn-color.com に対して aws というサブドメインを生やすようにしていきます。

Route53 を生やす

ホストゾーンを作成。

タイプは、パブリックホストゾーン にする。

見事に生成される。

CloudFlare へ登録

CloudFlare の DNS 設定へ行く。

レコードの追加 ボタンを押す。

そうすると、新しいソーンタイプを聞かれるので、以下のように設定する。

  • タイプ: NS
  • 名前: aws
  • ネームサーバー: ns-****
    • ネームサーバは Route53 にある ns の値をいれる。
      ※ 1件ずつ入れないとエラーになる。
レコードの追加
Route53 にある ns の値
赤枠に囲っているのが ns の値

cloudFlare が以下のように aws に対する ns が4つあればよい。

確認

dig コマンドを打っても良いが、確認できるサイトがあるので以下で確認。

www.cman.jp
www.cman.jp

AUTHORITY SECTION: にある SOA が Route53 の SOA と一致しているので ドメイン権限の移譲は完了。

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.16 <<>> @(当社Dnsサーバ) aws.autumn-color.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7432
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;aws.autumn-color.com.  IN A

;; AUTHORITY SECTION:
aws.autumn-color.com. 735 IN SOA ns-506.awsdns-63.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400

;; Query time: 0 msec
;; SERVER: 157.65.26.10#53(157.65.26.10)
;; WHEN: Mon Mar 03 17:11:31 JST 2025
;; MSG SIZE  rcvd: 127
Route53 にある SOA

cdk で静的コンテンツを流してみる

コマンド上からの確認だけだと面白くないので、テキトーな web コンテンツを作って表示してみる。

構成は無駄にリッチな Route53 + CloudFront + S3 という設定にする。

以下ものものを参考にした
https://qiita.com/dayjournal/items/056dca3d33fdf2675f81

注意

事前に Route53 の設定の他にも証明書の作成が必要です。
※ 参考にしたコードだと証明書もつくるコードですが、2025/03において acm.DnsValidatedCertificate はすでに使えなくなったので、手作業で証明書を発行しています。

証明書は バーギニア北部( us-east-1 ) で作成してください。

証明書の作成後、 arn を控えておくこと。

コード

Route53 + CloudFront + S3 を生成するCDK。

※ aws-cdk のバージョンは 2.1001.0 (build 130445d)

import * as cdk from 'aws-cdk-lib';
import * as route53 from 'aws-cdk-lib/aws-route53';
import * as acm from 'aws-cdk-lib/aws-certificatemanager';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
import * as origins from 'aws-cdk-lib/aws-cloudfront-origins';
import * as targets from 'aws-cdk-lib/aws-route53-targets';
import { Construct } from 'constructs';

export class AppStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const PREFIX = "App";

    // Route53 を探索
    const domainName = 'aws.******'; // ドメイン名を入れること。
    const hostedZoneId = route53.HostedZone.fromLookup(this, `${PREFIX}HostedZone`, {
      domainName: domainName
    });

    // 証明書の探索
    const certificateArn = 'arn:*****'; // 証明書のARNを入れること
    const certificate = acm.Certificate.fromCertificateArn(this, `${PREFIX}Certificate`, certificateArn);


    // S3 バケット作成
    const s3Bucket = new s3.Bucket(this, `${PREFIX}S3Bucket`, {
      bucketName: domainName.replace('.', '-'),
      blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    });


    // CloudFront 作成
    const cdn = new cloudfront.Distribution(this, `${PREFIX}CDN`, {
      domainNames: [domainName],
      certificate: certificate,
      minimumProtocolVersion: cloudfront.SecurityPolicyProtocol.TLS_V1_2_2021,
      httpVersion: cloudfront.HttpVersion.HTTP2_AND_3,
      defaultRootObject: 'index.html',
      priceClass: cloudfront.PriceClass.PRICE_CLASS_200,
      defaultBehavior: {
        origin: origins.S3BucketOrigin.withOriginAccessControl(s3Bucket),
        viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
        allowedMethods: cloudfront.AllowedMethods.ALLOW_GET_HEAD,
        compress: true,
        cachedMethods: cloudfront.CachedMethods.CACHE_GET_HEAD,
      },
    });

    // Route53 にレコード追加
    new route53.ARecord(this, `${PREFIX}ARecord`, {
      recordName: domainName,
      zone: hostedZoneId,
      target: route53.RecordTarget.fromAlias(new targets.CloudFrontTarget(cdn)),
    });

    new cdk.CfnOutput(this, 'CloudFrontURL', {
      value: `https://${domainName}`
    });
  }
}

aws.autumn-color.com へアクセスしてみる

CDKで生成されたS3バケットの中にテキトーな index.html を入れる

中身は以下。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>hello world! aws.autumn-color.com</div>
</body>
</html>

あとは、URLをアクセスすると開く。

ページが表示される。🎉

まとめ

CloudFlareのドメインにサブドメインを作って、AWS Route53へ権限委譲するをやってみました。

また、権限委譲だけだと面白くないので CDK で静的コンテンツの配信もやってみました。

おんなじことをやろうとしている人がいましたら、是非参考にしてみてください。

参考