【ドメインhttps化・ACM(SSL)証明書発行】terraform AWS環境構築 第2回

AWS

AWSRails + Nginxな環境をTerraformで構築してみようと思います。

はじめに

本連載で一つずつインフラを構築していきます。

ドメインのhttps化したり、ECSを使用したコンテナオーケストレーションを用いてアプリケーションをデプロイします。

この記事ではドメインのhttps化・ACM(SSL)証明書の取得を行います。

環境は以下です。

OS Cataline 10.15.6
Terraform 0.14.4

 

 

 

基本構文などこちらにまとめてますので、よかったらみてください!
AWS Terraform 基本コード まとめ

連載一覧

やること

以下の定義と作成をします。

ドメインhttps化・ACM(SSL)証明書

acmモジュールの作成

https化を定義するモジュールを作成します。

terraformフォルダ内にacmフォルダを作成しましょう。

acmモジュールを使用できるように./main.tfに以下の記述を追記します。

module "acm" {
  source = "./acm"

  domain = var.domain
}

acmモジュール内でdomainを受け取れるように、variable.tfを用意します。

./acm/variable.tf

variable "domain" {}

ディレクトリ構成は以下のようにしています。

[terraform] $ tree 
. 
├── acm
│   ├── main.tf
│   └── variable.tf
├── network 
│   ├── main.tf 
│   └── variable.tf 
├── env 
│   └── backend.config 
├── main.tf 
├── backend.tf 
├── provider.tf 
├── terraform.tfvars 
└── variable.tf

用意できたら、terraformの初期化を行いましょう。

[terraform] $ terraform init -backend-config=env/backend.config -upgrade

ACM(SSL)証明書リクエスト

検証方法をDNSACM証明書をリクエストします。

./acm/main.tf に以下を追記します。

resource "aws_acm_certificate" "this" {
  domain_name = var.domain

  validation_method = "DNS"

  lifecycle {
    create_before_destroy = true
  }
}
  • domain_name:検証するドメイン名
  • validation_method:検証方法
  • lifecycleterraform destroyしても消去しない

検証用レコード

ホストゾーンに検証用のレコードを作成します。

ホストゾーンはData Sourceを使用して取得しますので、data.tfを用意しておきます。

./acm/data.tf

data "aws_route53_zone" "this" {
  name         = var.domain
  private_zone = false
}
  • name:ドメイン名
  • private_zone:プライベートホストゾーンかどうか

./acm/main.tf に以下を追記します。

resource "aws_route53_record" "this" {
  depends_on = [aws_acm_certificate.this]

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

  zone_id = data.aws_route53_zone.this.zone_id
  name    = each.value.name
  records = [each.value.record]
  ttl     = 60
  type    = each.value.type
}
  • name:レコード名
  • record:レコード値
  • type:レコードタイプ
  • zone_id:ホストゾーンのID
  • ttl:TTL

ACM証明書とCHAMEレコード紐付け

作成したACM証明書と、先程作成した検証用レコードのCNAMEレコードの連携をします。

./acm/main.tf に以下を追記します。

resource "aws_acm_certificate_validation" "this" {
  certificate_arn = aws_acm_certificate.this.arn

  validation_record_fqdns = [for record in aws_route53_record.this : record.fqdn]
}
  • certificate_arn:検証中ACM証明書のARN
  • validation_record_fqdns:検証するFQDNのリスト。DNS検証方法のみ指定可能。

それでは、terraform plan, apply して確認しましょう。

CNAMEレコード作成されていますね。

証明書発行されているのも確認できましたね。

まとめ

ACM証明書はロードバランサー構築で使用するので、アウトプット変数を定義しておきましょう。

./acm/output.tf

output "acm_id" {
  value = aws_acm_certificate.this.id
}

./output.tf

output "vpc_id" {
  value = module.network.vpc_id
}

output "public_subnet_ids" {
  value = module.network.public_subnet_ids
}

output "private_subnet_ids" {
  value = module.network.private_subnet_ids
}

# 追記
output "acm_id" {
  value = module.acm.acm_id
}

今回、作成したコードとディレクトリ構成は以下になります。

[terraform] $ tree 
. 
├── acm
│   ├── data.tf
│   ├── main.tf
│   ├── output.tf
│   └── variable.tf
├── network 
│   ├── main.tf 
│   ├── output.tf 
│   └── variable.tf
├── env
│   └── backend.config
├── main.tf
├── output.tf
├── backend.tf
├── provider.tf
├── terraform.tfvars
└── variable.tf

./acm/main.tf

resource "aws_acm_certificate" "this" {
  domain_name = var.domain

  validation_method = "DNS"

  lifecycle {
    create_before_destroy = true
  }
}
resource "aws_route53_record" "this" {
  depends_on = [aws_acm_certificate.this]

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

  zone_id = data.aws_route53_zone.this.zone_id
  name    = each.value.name
  records = [each.value.record]
  ttl     = 60
  type    = each.value.type
}

resource "aws_acm_certificate_validation" "this" {
  certificate_arn = aws_acm_certificate.this.arn

  validation_record_fqdns = [for record in aws_route53_record.this : record.fqdn]
}

./acm/variable.tf

variable "domain" {}

./acm/data.tf

data "aws_route53_zone" "this" {
  name         = var.domain
  private_zone = false
}

おわり

これで、ドメインhttps化・ACM(SSL)証明書の取得は完了しました。お疲れさまでした!

何か疑問に思うことがあれば、何でもコメントしてください!

次回は、このドメインからサービスにアクセスできるようにロードバランサーを構築します。

参考サイト

https化 - Terraformで構築するAWS
Terraform で AWS Certificate Manager 無料証明書を発行する(AWS Provider 3.0.0 以降の場合) | DevelopersIO
ACM の無料証明書発行、Terraform でやると面倒くさいかと思ってましたが、めっちゃ楽やん

 

コメント

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