【AWSチュートリアル】Route53でホストゾーンの作成&ACMでSSL証明書を作成する。

Route53&ACM ACM
スポンサーリンク

今回はALBで使用するドメインとSSL証明書をRoute53、ACMを使って作成していきます。

Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over...
スポンサーリンク

前提

  1. 前回までの記事を読んでいること!

今回の目標

以下のリソースを作成します。

  • Route53にて「study-infra.tk」のホストゾーンを作成する。
  • ACMで「study-infra.tk」用のSSL証明書を作成する。

freenomで無料ドメインを取得する。

まずは、登録するドメインをfreenomと呼ばれるサイトで取得します。(こちら無料で取得することができます。)

Freenom - 誰でも利用できる名前

Route53でホストゾーンを作成する。

「study-infra.tk」用のホストゾーンを作成していきます。

使用するリソースは、 aws_route53_zone です。

terraform/system/modules/common/route53.tf

resource "aws_route53_zone" "study_infra_tk" {
  # ホストゾーンで管理したいドメイン記載する。
  name = "study-infra.tk"
}

3行で済みました。

Nameserverの移行が必要なため、一旦ここで terraform apply を実行します。

まずは、後述している「Terraform実行」の1〜5までの作業を実施しておきます。

準備が完了したら、planからapplyまで実行します。

$ terraform plan -var-file=staging.tfvars -target=module.common.aws_route53_zone.study_infra_tk

$ terraform apply -var-file=staging.tfvars -target=module.common.aws_route53_zone.study_infra_tk

Route53に登録されたNSレコードをfreenom側に登録する。

登録するNSレコードはこちら。これらのNSレコードをfreenomに登録します。

ACMでSSL証明書を作成する。

次は、「study-infra.tk」に対してSSL証明書を発行します。

使用するリソースは、 aws_acm_certificate です。

terraform/system/modules/common/acm.tf

resource "aws_acm_certificate" "study_infra_tk" {
  # SSL証明書に登録したいドメイン。
  domain_name       = "study-infra.tk"

  # サブドメインも登録したいため、ワイルドカードのドメインも追加。
  subject_alternative_names = ["*.study-infra.tk"]

  # SSL証明書を発行するために登録されたドメインが正しいか検証する必要があります。
  # Eメールか、指定されたレコードをRoute53に登録するかのどちらかを選択できます。
  # Route53で検証する場合は自動的にSSL証明書が更新されるので、今回はそちらを選択。
  validation_method = "DNS"
}

Route53にてACM検証用のレコードを登録する。

ACMの検証方法に「DNS」を選択したので、検証用のレコードをホストゾーンに登録する必要があります。

terraform/system/modules/common/route53.tf

+ resource "aws_route53_record" "acm_validation_study_infra_tk" {
+   for_each = {
+     for dvo in aws_acm_certificate.study_infra_tk.domain_validation_options : dvo.domain_name => {
+       name = dvo.resource_record_name
+       record = dvo.resource_record_value
+       type = dvo.resource_record_type
+     }
+   }

    # 今回SSL証明書に登録するドメインは通常のドメインとサブドメインになります。
    # この場合、登録が必要な検証用のCNAMEレコードは1種類になります。そのため、
    # 1レコードを上書くような動作になるため有効にします。
+   allow_overwrite = true
+   name = each.value.name
+   records = [each.value.record]
+   ttl = 60
+   type = each.value.type
+   zone_id = aws_route53_zone.study_infra_tk.id
+ }

少しトリッキーなことをしているので解説します。

まずは for の部分から。

    for dvo in **aws_acm_certificate.study_infra_tk.domain_validation_options** : dvo.domain_name => {
      name = dvo.resource_record_name
      record = dvo.resource_record_value
      type = dvo.resource_record_type
    }

aws_acm_certificate.study_infra_tk.domain_validation_options では以下のようなオブジェクトの配列がかえされます。

[
          + {
              + domain_name           = "*.study-infra.tk"
              + resource_record_name  = "XXX.study-infra.tk."
              + resource_record_type  = "CNAME"
              + resource_record_value = "YYY.ZZZ.acm-validations.aws."
            },
            ...
],

これを domain_name 毎に取り出し、以下のような形式のオブジェクトに変換しています。

    {
      + *.study-infra.tk = {
          + name   = "XXX.study-infra.tk."
          + record = "YYY.ZZZ.acm-validations.aws."
          + type   = "CNAME"
        }
      + study-infra.tk   = {
          + name   = "XXX.study-infra.tk."
          + record = "YYY.ZZZ.acm-validations.aws."
          + type   = "CNAME"
        }
    }

そしてこれらを for_each = {} で繰り返し、複数の resource を作成しているという仕組みになっています。

ACMで検証用のリソースを作成する。

ドメイン検証用のリソースを作成します。

使用するリソースは、 aws_acm_certificate_validation です。

terraform/system/modules/common/acm.tf

resource "aws_acm_certificate_validation" "study_infra_tk" {
  certificate_arn = aws_acm_certificate.study_infra_tk.arn
  validation_record_fqdns = [ for record in aws_route53_record.acm_validation_study_infra_tk : record.fqdn]
}

validation_record_fqdns では for を使ってレコードを効率的に処理しています。

Terraformを実行する。

※ホストゾーンを既に作成しているため、1〜5の作業は飛ばしてもOK。

1. /study-infra-aws-tutorial/terraform/system/staging/example.tfbackendを修正する。

  • bucket:Stateを管理するS3バケット名に変更する。
  • role_arn:Terraform実行用RoleのARNに変更する。
bucket   = "sample-bucket"
region   = "ap-northeast-1"
key      = "study-infra-tutorial/system/staging.tfstate"
encrypt  = true
role_arn = "arn:aws:iam::111111111:role/study-infra-terraform-role"

2. /study-infra-aws-tutorial/terraform/system/staging/staging.tfvars を作成する。

  • iam_role_for_terraform:Terraform実行用RoleのARNに変更する。
  • bucket:Stateを管理するS3バケット名に変更する。
  • role_arn:Terraform実行用RoleのARNに変更する。
iam_role_for_terraform = "arn:aws:iam::111111111:role/study-infra-terraform-role"

network_remote_state_config = {
  bucket   = "sample-bucket"
  key      = "study-infra-tutorial/staging.tfstate"
  region   = "ap-northeast-1"
  role_arn = "arn:aws:iam::111111111:role/study-infra-terraform-role"
}

3.Dockerイメージをビルドする。

$ docker build \
  -t study-infra-tf:${IMAGE_VERSION} \
  --build-arg AWS_ACCESS_KEY=${AWS_ACCESS_KEY} \
  --build-arg AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
  --build-arg ENV=${ENV} \
  .

4.コンテナを起動して接続する。

$ pwd
-> 「***/study-infra-aws-tutorial」に居ること。

$ docker run --rm -v $PWD/terraform:/tf -it [ImageID] ash

5.Terraformを初期化する。

$ cd /tf/system/stating

$ terraform init -backend-config=example.tfbackend
Initializing modules...
- network in ../modules

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.68.0...
- Installed hashicorp/aws v3.68.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.
$

6. terraform plan を実行する。

planの結果、エラーが無いようであればOKです。

$ terraform plan -var-file=staging.tfvars

...

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

───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
$

7. terraform apply を実行してリソースを構築する。

$ terraform apply -var-file=staging.tfvars

...

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 ←入力してEnterキーを押下!

...

Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
$

以上で、Route53にてホストゾーンの作成とACMにてSSL証明書の作成ができました。

これにて本記事は終了です。

コメント

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