[ AWS ] TERRAFORM 管理外の ROUTE53 設定を TERRAFORMING を活用して管理できるようにする

[ AWS ] TERRAFORM 管理外の ROUTE53 設定を TERRAFORMING を活用して管理できるようにする

はじめに

AWS Route53 / Terraform に関する Tips情報です。
前回の記事 では、Terraform で Route53 のレコード情報などを設定しました。
しかし、あくまで新規にゾーン設定とレコード設定を行う場合にのみ有効な記事の為、すでに Route53 側で設定中リソースに対しては利用できません。
とはいえ、半ば強引に既存の設定を削除して、Terraform で設定を流しこむには危険ですので、サードパーティ製の Terraforming を活用して移行対応をしてみます。

注意事項

本記事は、検証環境下での手順内容となりますので万が一、事故やトラブル等があっても一切の責任を負いかねますので予めご了承下さい。
今回の作業内容については、シングルドメインのみでの内容となります。
複数ドメインを別途、ドメイン別に管理する場合は手順が若変わりますので、適宜置き換えて対応をお願いします。

terraforming とは

@dtan4 さんが作成された、Rubyで書かれた、AWSリソースの構成情報をエクスポートするツールです。
通常、Terraform では既存のAWSリソース情報を取得する機能を持ち合わせていない為、新規プロジェクト時には利用できるのですが、既存リソースに対しては、Terraform での管理が難しい状態でした。

Terraforming を利用することにより、既存リソース設定情報をエクスポートできる為、新規プロジェクト立ち上げ時のテンプレートファイルとして活用できたりと Infrastructure as Code 化する為のサポートツールのなります。

GitHub – dtan4/terraforming: Export existing AWS resources to Terraform style (tf, tfstate)

terraforming のインストール

Rubyが利用できる環境が必須ですので、事前に利用できるようにしておきます。
gem が利用できるようになったら、terraforming をインストールします。
※ bundler を経由でも可

$ gem install terraforming

terraforming で既存のリソース設定状況を取得

事前に route53 / s3 利用権限のついたクレデンシャル情報を設定し、
terraforming コマンドを実行結果をテキストに出力しておきます。

$ cd ${YourWorkingDirectory}
$ export AWS_ACCESS_KEY_ID=************************
$ export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ export AWS_DEFAULT_REGION=ap-northeast-1
$ terraforming r53z > aws_route53_example-com.tf
$ mkdir .terraform
$ terraforming r53z --tfstate > .terraform/terraform.tfstate
$ terraforming r53r > terraforming-record.txt

ゾーン情報の管理

構成管理ファイルの tfstate は前回同様、チームでファイルを共有できるように s3 に保存します。
一度、./aws_route53_example-com.tf と ./.terraform/terraform.tfstate の内容を反映させることにより、ゾーン情報を管理できるようにします。

$ terraform remote config \
    -backend=S3 \
    -backend-config="bucket=terraform-state.example" \
    -backend-config="key=example.com-test_route53.tfstate"
$ terraform plan
$ terraform apply

terraform apply が成功すると、.terraform/terraform.tfstate の json ファイルが以下のように修正されています。
これで、ゾーン情報に関しては Terraform 管理下に置かれました。

# cat .terraform/terraform.tfstate
{
    "version": 1,
    "serial": 3,
    "remote": {
        "type": "s3",
        "config": {
            "bucket": "terraform-state.example",
            "key": "example_route53.tfstate"
        }
    },
    "modules": [
        {
            "path": [
                "root"
            ],
            "outputs": {},
            "resources": {
                "aws_route53_zone.example-com-public": {
                    "type": "aws_route53_zone",
                    "primary": {
                        "id": "***************",
                        "attributes": {
                            "comment": "Managed by Terraform.",
                            "id": "***************",
                            "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.#": "0",
                            "vpc_id": "",
                            "vpc_region": "",
                            "zone_id": "***************"
                        }
                    }
                }
            }
        }
    ]
}

レコード情報の管理

次に、レコード情報の管理を行います。
リソース設定内容をテキストに落とし込んでいた、 terraforming-record.txt ファイルを aws_route53_example-com.tf ファイルに追記で流し込み、terraform apply を実行します。

$ cat terraforming-record.txt >> aws_route53_example-com.tf
$ terraform plan
$ terraform apply
$ terraform show

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

まとめ

Terraforming による、既存プロジェクトのリソースを Terraform で Infrastructure as Code 化の一部の方法をご紹介しました。
Route53 に限ったことでは無いですが、既存プロジェクトのシステム構成を変更するには、入念な調査と検証が必要となるため、場合によっては、新規プロジェクトのみ採用した方いい場合もあります。
とはいえ、導入するメリットも魅力的な所はありますので、規模・案件によって使い分ける方がよいかもしれません。

参考文献

GitHub – dtan4/terraforming: Export existing AWS resources to Terraform style (tf, tfstate)

Share on FacebookTweet about this on TwitterShare on LinkedInShare on Google+Email this to someoneBuffer this page