ドメインキングからAWS Route53へドメインを移管してみた

AWS

私が運用している flan999.com ドメインをドメインキングで取得して長らく使っていましたが、更新のタイミングでAWS Route53へ移管しました。

移管の際の手順について紹介したいと思います。

はじめに

現状、ドメインはドメインキング、サーバはさくらのVPSを使用していて、業務でAWSを使用していたこともありAWSへリソースの移行を計画していました。

ドメインについては今月が更新のタイミングだったため、AWS Route53へ移行することとしました。

今回の移行方針としては、インフラの構築・運用に関わる作業をコード化(Infrastructure as Code)し、可能な限り Terraform を使用することとします。

Terraform とはHashiCorp社が提供している、AWSやGCP等のクラウド上のリソース構築をコード化するためのツールです。通常Webコンソールでマウスをポチポチしなければいけない作業をコード化することによって、複数のリソースを作成する際は再現性が高いことが挙げられます。

また、手順書や秘伝の虎の巻のようなものを作成する必要が無く、コードを見るだけで行った作業やリソース情報を確認することが出来ます。

ドメイン移管手続き

ドメインキングでのドメイン移管手続き方法は以下に記載されている通りに行い、オースコードを取得しておきます。

他社であれば、管理コンソールから操作すれば良いところもあるようですが、ドメインキングでのドメイン移管の際には問い合わせフォームより申請するようでした。

Terraform環境の構築

Terraform環境の構築にはDockerを使用します。DockerイメージはHashiCorp社が提供している、 hashicorp/terraform を使用します。実際にはdocker-composeを使用してterraformコマンドを実行します。

ディレクトリ構成

以下のファイル、ディレクトリを作成します。

├── docker-compose.yml  # コンテナ情報を記載
├── .env                # AWSのアクセスキー・シークレット等を記載
└── terraform           # Terraform関係ファイルを格納するディレクトリ

docker-compose.yml

Terraform関係のファイルを terraform ディレクトリへ格納し、コンテナへボリュームマウントを行っており、このディレクトリをワーキングディレクトリに設定しています。

version: '3'

services:
  terraform:
    image: hashicorp/terraform:light
    volumes:
      - ${PWD}/terraform:/terraform
    working_dir: "/terraform"
    environment:
      - AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY
      - AWS_REGION

.env

docker-compose.yml の environment で定義している、AWSのアクセスキー、シークレット、リージョンの情報を記載します。

AWS_ACCESS_KEY_ID=XXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXX
AWS_REGION=ap-northeast-1

.env ファイルは docker-compose がデフォルトで読み込む環境変数をしておくことが出来るファイルです。コード全体をプライベートリポジトリで管理し、.env ファイルをGitの管理から除外するようにしています。

Terraformファイルの作成

ファイルの追加

ファイルを2つ追加します。

├── docker-compose.yml
├── .env
└── terraform
    ├── main.tf         # Terraformのメイン設定ファイル
    └── route53.tf      # Route53の設定ファイル

main.tf

.tfstate ファイルを S3バケット へ保存する設定と、プロバイダを明示的にAWSと指定しています。.tfstate用のS3バケットはAWSコンソールより手動で作成したものを指定しています。

terraform {
  required_version = ">= 0.11.0"
  backend "s3" {
    bucket = "XXXXXXXXXXXXXX"
    region = "ap-northeast-1"
    key = "terraform.tfstate"
    encrypt = true
  }
}

provider "aws" {
    region = "ap-northeast-1"
}

route53.tf

以下に一部サンプルとしてホストゾーンの追加とMXレコード、Aレコード、AAAAレコードを追加するコードを記載しています。

SOAレコードとNSレコードはホストゾーンの追加の際に自動で作成されます。

# flan999.com  ホストゾーンを追加
resource "aws_route53_zone" "primary" {
    name = "flan999.com"
}

# MXレコードを追加
resource "aws_route53_record" "mx" {
  zone_id = aws_route53_zone.primary.zone_id
  name    = "flan999.com."
  type    = "MX"
  ttl     = "600"
  records = ["10 153.126.216.154."]
}

# Aレコードを追加
resource "aws_route53_record" "blog" {
  zone_id = aws_route53_zone.primary.zone_id
  name    = "blog.flan999.com."
  type    = "A"
  ttl     = "600"
  records = ["153.126.216.154"]
}

# AAAAレコードを追加
resource "aws_route53_record" "blogv6" {
  zone_id = aws_route53_zone.primary.zone_id
  name    = "blog.flan999.com."
  type    = "AAAA"
  ttl     = "600"
  records = ["2401:2500:102:3044:153:126:216:154"]
}

Terraformの実行

作業ディレクトリの初期化

作業ディレクトリの初期化をし、必要なプラグインなどをダウンロードします。

$ docker-compose run terraform init
Creating flan-aws-infra_terraform_run ... done

Initializing the backend...

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.

Initializing provider plugins...
- Finding latest version of hashicorp/aws...
- Installing hashicorp/aws v3.36.0...
- Installed hashicorp/aws v3.36.0 (signed by HashiCorp)

Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

コンフィグの確認

リソースの変更予定箇所を確認します。

$ docker-compose run terraform plan
Creating flan-aws-infra_terraform_run ... done

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_route53_record.blog will be created
  + resource "aws_route53_record" "blog" {
      + allow_overwrite = (known after apply)
      + fqdn            = (known after apply)
      + id              = (known after apply)
      + name            = "blog.flan999.com"
      + records         = [
          + "153.126.216.154",
        ]
      + ttl             = 600
      + type            = "A"
      + zone_id         = (known after apply)
    }

  # aws_route53_record.blogv6 will be created
  + resource "aws_route53_record" "blogv6" {
      + allow_overwrite = (known after apply)
      + fqdn            = (known after apply)
      + id              = (known after apply)
      + name            = "blog.flan999.com"
      + records         = [
          + "2401:2500:102:3044:153:126:216:154",
        ]
      + ttl             = 600
      + type            = "AAAA"
      + zone_id         = (known after apply)
    }

  # aws_route53_record.mx will be created
  + resource "aws_route53_record" "mx" {
      + allow_overwrite = (known after apply)
      + fqdn            = (known after apply)
      + id              = (known after apply)
      + name            = "flan999.com"
      + records         = [
          + "10 153.126.216.154.",
        ]
      + ttl             = 600
      + type            = "MX"
      + zone_id         = (known after apply)
    }

  # aws_route53_zone.primary will be created
  + resource "aws_route53_zone" "primary" {
      + comment       = "Managed by Terraform"
      + force_destroy = false
      + id            = (known after apply)
      + name          = "flan999.com"
      + name_servers  = (known after apply)
      + zone_id       = (known after apply)
    }

Plan: 4 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

設定の適用

terraform plan で問題が無ければ、実際に設定を適用します。

$ docker-compose run --rm terraform apply
Creating flan-aws-infra_terraform_run ... done

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_route53_record.blog will be created
  + resource "aws_route53_record" "blog" {
      + allow_overwrite = (known after apply)
      + fqdn            = (known after apply)
      + id              = (known after apply)
      + name            = "blog.flan999.com"
      + records         = [
          + "153.126.216.154",
        ]
      + ttl             = 600
      + type            = "A"
      + zone_id         = (known after apply)
    }

  # aws_route53_record.blogv6 will be created
  + resource "aws_route53_record" "blogv6" {
      + allow_overwrite = (known after apply)
      + fqdn            = (known after apply)
      + id              = (known after apply)
      + name            = "blog.flan999.com"
      + records         = [
          + "2401:2500:102:3044:153:126:216:154",
        ]
      + ttl             = 600
      + type            = "AAAA"
      + zone_id         = (known after apply)
    }

  # aws_route53_record.mx will be created
  + resource "aws_route53_record" "mx" {
      + allow_overwrite = (known after apply)
      + fqdn            = (known after apply)
      + id              = (known after apply)
      + name            = "flan999.com"
      + records         = [
          + "10 153.126.216.154.",
        ]
      + ttl             = 600
      + type            = "MX"
      + zone_id         = (known after apply)
    }

  # aws_route53_zone.primary will be created
  + resource "aws_route53_zone" "primary" {
      + comment       = "Managed by Terraform"
      + force_destroy = false
      + id            = (known after apply)
      + name          = "flan999.com"
      + name_servers  = (known after apply)
      + zone_id       = (known after apply)
    }

Plan: 4 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_route53_zone.primary: Creating...
aws_route53_zone.primary: Still creating... [10s elapsed]
aws_route53_zone.primary: Still creating... [20s elapsed]
aws_route53_zone.primary: Still creating... [30s elapsed]
aws_route53_zone.primary: Still creating... [40s elapsed]
aws_route53_zone.primary: Still creating... [50s elapsed]
aws_route53_zone.primary: Still creating... [1m0s elapsed]
aws_route53_zone.primary: Still creating... [1m10s elapsed]
aws_route53_zone.primary: Still creating... [1m20s elapsed]
aws_route53_zone.primary: Still creating... [1m30s elapsed]
aws_route53_zone.primary: Still creating... [1m40s elapsed]
aws_route53_zone.primary: Still creating... [1m50s elapsed]
aws_route53_zone.primary: Creation complete after 1m58s [id=XXXXXXXXXXXXXXXXX]
aws_route53_record.blog: Creating...
aws_route53_record.mx: Creating...
aws_route53_record.blogv6: Creating...
aws_route53_record.blog: Still creating... [10s elapsed]
aws_route53_record.mx: Still creating... [10s elapsed]
aws_route53_record.blogv6: Still creating... [10s elapsed]
aws_route53_record.blog: Still creating... [20s elapsed]
aws_route53_record.mx: Still creating... [20s elapsed]
aws_route53_record.blogv6: Still creating... [20s elapsed]
aws_route53_record.blog: Still creating... [30s elapsed]
aws_route53_record.mx: Still creating... [30s elapsed]
aws_route53_record.blogv6: Still creating... [30s elapsed]
aws_route53_record.blog: Still creating... [40s elapsed]
aws_route53_record.mx: Still creating... [40s elapsed]
aws_route53_record.blogv6: Still creating... [40s elapsed]
aws_route53_record.blog: Still creating... [50s elapsed]
aws_route53_record.mx: Still creating... [50s elapsed]
aws_route53_record.blogv6: Still creating... [50s elapsed]
aws_route53_record.blog: Still creating... [1m0s elapsed]
aws_route53_record.mx: Still creating... [1m0s elapsed]
aws_route53_record.blogv6: Still creating... [1m0s elapsed]
aws_route53_record.blog: Still creating... [1m10s elapsed]
aws_route53_record.mx: Still creating... [1m10s elapsed]
aws_route53_record.blogv6: Still creating... [1m10s elapsed]
aws_route53_record.blog: Still creating... [1m20s elapsed]
aws_route53_record.blogv6: Still creating... [1m20s elapsed]
aws_route53_record.mx: Still creating... [1m20s elapsed]
aws_route53_record.blog: Still creating... [1m30s elapsed]
aws_route53_record.mx: Still creating... [1m30s elapsed]
aws_route53_record.blogv6: Still creating... [1m30s elapsed]
aws_route53_record.blogv6: Creation complete after 1m36s [id=XXXXXXXXXXXXXXXXX_blog.flan999.com._AAAA]
aws_route53_record.mx: Creation complete after 1m36s [id=XXXXXXXXXXXXXXXXX_flan999.com._MX]
aws_route53_record.blog: Creation complete after 1m36s [id=XXXXXXXXXXXXXXXXX_blog.flan999.com._A]

Route53で確認

AWSのWebコンソールより確認すると、flan999.com のホストゾーンが追加されています。

また、Terraformで追加したレコードに加え、NSレコードとSOAレコードが追加されていることが分かります。

ドメイン移管作業

AWSコンソールより、Route53 > 登録済みドメイン を開き、ドメインの移管 をクリックします。

移管したいドメインを入力し、チェック をクリックします。移管できることが確認できれば、カートに入れる をクリックします。

ショッピングカートに対象のドメインが入るので、続行をクリックします。

予め取得していたオースコード(認証コード)を入力し、Terraformで作成したホストゾーンを選択後に 続行 をクリックします。

登録者の連絡先を一通り入力し、プライバシーの保護 が 有効化 になっていることを確認して、続行 をクリックします。ここで有効化しておかないとWhoisで自分の住所が公開されてしまうため要注意です。

今後ドメインを自動更新する場合は ドメインの事項更新の 有効化 を選択し、AWSドメイン名の登録契約に同意後、注文を完了 をクリックします。

以下の画面が表示されれば、注文が正常に送信されています。閉じる をクリックしてダイアログを閉じます。

今後必要な作業が表示されます。

ドメインに移動をクリックすると ステータス が表示されます。

今後、ドメインキングとAWSから確認のメールが届くため、それぞれ承認を行います。

ドメインの移行が完了し、ドメインが伝播されると以下のコマンドでNSレコードがRoute 53のものに切り替わっていることが確認できます。

$ dig -t ns flan999.com

; <<>> DiG 9.10.6 <<>> -t ns flan999.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 595
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;flan999.com.			IN	NS

;; ANSWER SECTION:
flan999.com.		86400	IN	NS	ns-546.awsdns-04.net.
flan999.com.		86400	IN	NS	ns-1186.awsdns-20.org.
flan999.com.		86400	IN	NS	ns-1604.awsdns-08.co.uk.
flan999.com.		86400	IN	NS	ns-427.awsdns-53.com.

;; Query time: 35 msec
;; SERVER: 192.168.0.254#53(192.168.0.254)
;; WHEN: Sun Apr 18 19:16:24 JST 2021
;; MSG SIZE  rcvd: 177

おわりに

今回はドメインをドメインキングからAWS Route53へ移行し、Terraformでドメイン情報を管理するまで行いました。

これからRoute 53でドメインを運用してみて、月にどのくらいの料金がかかるのかを確認してみたいと思います。

今後VPSはさくらのVPSからAWS Lightsailへ移行する予定ですので、こちらも記事にまとめてみたいと思います。

コメント

  1. […] 以前の記事で、ドメインキングからAWS Route53へ移管しました。この記事の続きとなりますが、今回はVPSを AWS Lightsail へ移行するために、Terraform を使用してインスタンスを構築することを目的とします。 […]

タイトルとURLをコピーしました