[ AWS ] Terraform で Route53 を管理コンソールを利用せずに設定する

[ AWS ] Terraform で Route53 を管理コンソールを利用せずに設定する

はじめに

AWS Route53 に関する Tips情報です。

通常、AWS のDNSに関する設定には管理コンソール上から設定しますが、管理コンソールを使用せず、 Terraform を使ってコマンドライン経由で Route 53 のゾーン情報登録やレコードの追加 / 削除の設定変更を行います。

なお、AWS製のオーケストレーションツール、「CloudFormation」もありますが、設定ファイルが json形式の為、場合によっては数千行のjsonファイルとり、メンテナンス性が低下します。
Ruby製のツール roadworker もありますが、Terraform ではその他のAWSサービスのリソース管理にも利用できる為、今回は Terraform を利用します。

注意事項**

本記事は、検証環境下での手順内容となりますので万が一、事故やトラブル等があっても一切の責任を負いかねますので予めご了承下さい。

Terraformとは

Vagrant , Packer 等、アプリケーションの開発・デプロイ・運用に関するツールを開発する HashiCorp社 が手がける、インフラ構築や設定をテンプレートファイルにコードを記述して、デプロイ等を自動で行ってくれるツールです。
自動で行うことで、オペレーションミスの撲滅や、作業の効率化が図れます。
また、テンプレートファイルは git 等のバージョン管理ツールを利用する事も可能です。

AWS / Azure / GCE / Azure / Docker 等、複数のプロバイダに対応しています。

Terraform by HashiCorp
GitHub – hashicorp/terraform

事前準備

  • Route53の利用権限があるIAMアカウント
  • Terraform の動作環境( mac / Windows )

Terraformのインストール

筆者の環境では、mac を利用していますので、brew コマンドにてインストールします。

$ brew install terraform

**ZONE情報追加**

同一ディレクトリに認証情報を定義した aws_credencial.tf と、ゾーン情報を定義する aws_route53-ExampleCom.tf を作成します。
今回利用するドメイン名は example.com ですが、任意のドメイン名で適宜修正してください。

まずは、 aws_credencial.tf ファイルにクレデンシャル情報の設定とデフォルト利用するリージョン情報を定義します。
クレデンシャル情報には事前に Route53 が操作できる IAM ユーザの事前に設定しておきます。

$ mkdir terraform
$ cd terraform/
$ vim aws_credencial.tf

aws_region.tf

※今回は簡単なサンプルでご紹介しておりますので、通常 AWSクレデンシャル情報は変数を利用してテンプレートファイルから分離してください。

provider "aws" {
    access_key = "__MyAccessKey__"
    secret_key = "__MySecretKey__"
    region = "__Region__"
}

次に、登録したいZONE / Record 情報を別ファイルで作成します。

aws_route53-ExampleCom.tf

resource "aws_route53_zone" "ExampleCom" {
    name = "example.com"
    tags{
        Environment = "main"
    }
}

初回の場合、ZONE情報を登録し、Route53側で発行される zone_id を取得します。
plan で適用前の事前確認、applyで設定適用、show で設定内容反映となります。

尚、構成管理ファイルの tfstate は ローカルでも保存可能ですが、複数チームで利用する場合は tfstate ファイルを共有する必要があります。
今回は、複数人でも対応可能なように、共有先を s3 バケットに保存するようにします。
※やり方によっては、tfstate ファイルの中にクレデンシャル情報が入りますので、git で管理する場合はご注意ください。

$ terraform remote config -backend=S3 -backend-config="bucket=__YourBucket__" -backend-config="key=example.com_route53.tfstate"
$ terraform plan
$ terraform apply
$ terraform show
aws_route53_zone.ExampleCom:
  id = ****************
  comment = Managed by Terraform
  name = example.com

  name_servers.# = 4
  name_servers.0 = ns-****.awsdns-**.org
  name_servers.1 = ns-****.awsdns-**.co.uk
  name_servers.2 = ns-**.awsdns-**.com
  name_servers.3 = ns-**.awsdns-**.net
  tags.# = 1
  tags.Environment = main
  zone_id = ****************

次に、発行された zone_id を元に、レコード情報を設定し、反映します。

resource "aws_route53_zone" "ExampleCom" {
    name = "example.com"
    tags{
        Environment = "main"
    }
}
resource "aws_route53_record" "ExampleCom-A" {
   zone_id = "****************"
   name = "example.com"
   type = "A"
   ttl = "3600"
   records = ["203.0.113.2"]
}
resource "aws_route53_record" "ExampleCom-MX" {
   zone_id = "****************"
   name = "example.com"
   type = "MX"
   ttl = "3600"
   records = ["10 smtp.example.com"]
}
resource "aws_route53_record" "ExampleCom-TXT" {
   zone_id = "****************"
   name = "example.com"
   type = "TXT"
   ttl = "3600"
   records = ["v=spf1 +mx -all"]
}

※設定例にある、値はサンプル
※レコードを削除したい場合、削除したいレコード設定を削除後、 plan → apply を実行

$ terraform plan
Refreshing Terraform state prior to plan...

aws_route53_zone.ExampleCom: Refreshing state... (ID: "****************")

The Terraform execution plan has been generated and is shown below.
Resources are shown in alphabetical order for quick scanning. Green resources
will be created (or destroyed and then created if an existing resource
exists), yellow resources are being changed in-place, and red resources
will be destroyed.

Note: You didn't specify an "-out" parameter to save this plan, so when
"apply" is called, Terraform can't guarantee this is what will execute.

+ aws_route53_record.ExampleCom-A
    fqdn:               "" => "<computed>"
    name:               "" => "example.com"
    records.#:          "" => "1"
    records.1784934559: "" => "203.0.113.2"
    ttl:                "" => "3600"
    type:               "" => "A"
    zone_id:            "" => "****************"
+ aws_route53_record.ExampleCom-MX
    ...
    ...

問題がなければ、 apply で適用し、念のため、管理コンソールを確認して反映されていれば完了です。

まとめ

今回は比較的オーソドックスな設定のみ行いましたが重み付け等、高度な設定も記述可能です。
また、その他のサービスにも活用できますので、Ansible などのツールとも併用していく事ができます。

参考文献

Command: push – Terraform by HashiCorp
AWS: aws_route53_zone – Terraform by HashiCorp
AWS: aws_route53_record – Terraform by HashiCorp
 
[amazonjs asin=”4774176737″ locale=”JP” title=”Amazon Web Services実践入門 (WEB+DB PRESS plus)”]

[amazonjs asin=”4798142670″ locale=”JP” title=”Amazon Web Servicesクラウドサーバ構築ガイド コストを削減する導入・実装・運用ノウハウ”]