1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWSにてドメインを取得した後、Terraformを使用してAWS Certificate Managerの証明書を発行した

Last updated at Posted at 2024-11-09

前書き

表題の構築を行ったので、備忘録も兼ねて記載します。

AWS Certificate Managerの概要

  • ウェブサイトやアプリケーションのセキュリティを強化する為に、SSL/TLS証明書の発行、管理、展開を自動化するサービス
  • ウェブ通信の暗号化が簡単に実現、データの機密性を確保、なりすましを防止が可能になる
  • ACMで発行された証明書は自動で更新される為、証明書の有効期限を気にする必要がない

主な機能

証明書の発行と管理

  • 無料での証明書発行: ELBCloudFrontAPI Gateway等のAWSリソースで利用可能
  • 自動更新: 証明書の有効期限切れの心配が不要

ドメイン検証

  • DNS検証: 自動化が可能で、手動操作を減らし、証明書の再発行や更新時の再検証が不要
  • Email検証: 手動で確認する必要があり、DNS検証よりも手間がかかる

AWSサービスとの統合

  • Elastic Load Balancing (ELB): HTTPS通信の実現
  • Amazon CloudFront: セキュアなコンテンツ配信
  • Amazon API Gateway: APIエンドポイントの暗号化

セキュリティの向上

  • 通信の暗号化によるデータ保護
  • デジタル証明書で通信相手の正当性を保証

料金

  • 無料: ACMで発行する証明書は無料
  • 有料証明書のインポート: 他の認証機関から購入した証明書の管理も可能(ただし自動更新は不可)

ネームサーバーの概要

ドメイン名とIPアドレスを関連付ける役割を担うサーバー。これにより、人間が覚えやすいドメイン名を入力する事で、インターネット上の特定のサーバーやウェブサイトへアクセスを出来る様にする

主な機能

ドメイン名とIPアドレスの変換

  • ドメイン名をIPアドレスに変換し、ウェブブラウザや他のアプリケーションが適切なサーバーに対して接続を出来る様にする

DNSゾーン情報の管理

  • DNSゾーン情報を保持し、レコード(Aレコード、CNAMEレコードなど)を管理する

名前解決の委任

  • 上位のネームサーバーから委任されたゾーンの名前解決を行い、問い合わせに応じて情報を提供する

高可用性と負荷分散

  • 複数のネームサーバーを配置して、サービスが常に利用できる状態を保つ
  • 1つのサーバーが故障しても他のサーバーが代わりに動作し、サービスを継続出来る
  • 複数のサーバーに対して、アクセスの負荷を分散させる事で、処理速度を維持し、過負荷によるパフォーマンス低下を防ぐ

キャッシング

  • 一時的に名前解決の結果をキャッシュし、再度の問い合わせ時に応答速度を向上させる

レコードの種類と説明

Aレコード (Address Record)

  • ドメイン名を IPv4アドレスに紐づける レコード
  • example.com192.0.2.1のようなIPアドレスへ変換する為に使用する
  • ドメイン名を入力する事で指定のサーバーへアクセスが出来る様になる

CNAMEレコード (Canonical Name Record)

  • あるドメイン名を 別のドメイン名にエイリアスとして関連付ける レコード
  • www.example.comexample.comにマッピングする事で、example.comのIPアドレスが変わった際にwww.example.comも自動的にその新しいアドレスを参照する様になる
  • CNAMEレコードを設定する事で、管理が容易になる

前提条件

  • Terraformの実行環境がある
  • AWSの操作権限がある
  • Terraformのバージョンは、v1.5.0以上
  • 著者は、AWS-Vaultを使用して、AWSの認証関連の構築を行っている

構築方法

ドメインの発行

  • 下記の公式の手順に従い、新規ドメインを作成する
  • 構築が完了するとRoute53のホストゾーンに作成したドメインが表示される

基本構成

main.tf
module "route53" {
  source = "../../modules/route53"
}

module "acm" {
  source = "../../modules/ssl"
}

ディレクトリ構成

.
├── .terraform/
│   └── # terraformに必要なファイル、ディレクトリが自動生成される
├── .terraform.lock.hcl # 自動生成
├── .gitignore
├── providers.tf
├── variables.tf
├── terraform.tfvars
├── main.tf
└── modules/
    ├── ssl/
    │   ├── acm.tf
    │   ├── variables.tf
    │   └── output.tf
    └── route53/
        ├── route53.tf
        ├── variables.tf
        └── output.tf

Route53

  • ACM証明書の作成を完了させる為には、Route53のzone_idが必要になる為、最初に構築を行う
  • Terrformimport機能を使い、ホストゾーンの情報とTerraformを紐付ける
# 構文
terraform import aws_route53_zone.example ホストゾーン ID

# 入力例
terraform import aws_route53_zone.example Z0**************4I
  • 下記のコマンドでimportしたaws_route53_zoneの詳細内容を確認
# 詳細確認
terraform state show route53.aws_route53_zone.example

# 表示内容
# module.route53.aws_route53_zone.example:
resource "aws_route53_zone" "example" {
    arn                 = "arn:aws:route53:::hostedzone/Z0**************4I"
    comment             = "Managed by Terraform"
    force_destroy       = false
    id                  = "Z0**************4I"
    name                = "example.jp"
    name_servers        = [
        "ns-****.awsdns-**.org",
        "ns-****.awsdns-**.co.uk",
        "ns-***.awsdns-**.com",
        "ns-***.awsdns-**.net",
    ]
    primary_name_server = "ns-***.awsdns-**.com"
    tags                = {}
    tags_all            = {}
    zone_id             = "Z0**************4I"
}
  • terraform state showで取得した内容を下記に貼り付ける
  • 必須は、nameのみである為、ドメインのみ記載する
route53.tf
resource "aws_route53_zone" "example" {
  name = "example.jp"
}

ACM

acm.tf
# ACM (AWS Certificate Manager) に新しいSSL/TLS証明書を作成する
resource "aws_acm_certificate" "example" {
  domain_name               = "example.jp"
  validation_method         = "DNS"
  subject_alternative_names = ["*.example.jp"]
  lifecycle {
    create_before_destroy = true
  }   
}


# Route 53のホストゾーンに関する情報を取得するためのTerraformデータソースを定義
data "aws_route53_zone" "example" {
  name         = "example.com"
  private_zone = false
}

# Route 53にCNAMEレコードを作成して、ACM証明書のDNS検証に必要な設定を行う
resource "aws_route53_record" "example" {
    
    # ACM証明書のドメイン検証のオプションをループさせて、それぞれのドメイン名をキーにし、検証レコード情報をマッピングする
    # 各ドメイン名に対して必要なレコード名、レコードの値、レコードタイプをfor_eachブロックに格納し、Route 53のDNSレコードを作成する際に使用する
  for_each = {
    for dvo in aws_acm_certificate.example.domain_validation_options : dvo.domain_name => {
      name   = dvo.resource_record_name
      record = dvo.resource_record_value
      type   = dvo.resource_record_type
    }
  }

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

# ACM証明書のDNS検証を完了させる
resource "aws_acm_certificate_validation" "example" {
  certificate_arn         = aws_acm_certificate.example.arn
  validation_record_fqdns = [for record in aws_route53_record.example : record.fqdn]
}

aws_acm_certificate内で使用しているメソッドと説明

メソッド/設定項目 説明
domain_name 証明書を適用するドメイン名を指定する
validation_method 証明書の有効性を確認する方法を指定する。今回は、DNSを使用する
subject_alternative_names 証明書に追加のサブドメイン(ワイルドカードなど)を指定する
lifecycle.create_before_destroy 新しいリソースを作成してから古いリソースを削除する

aws_route53_record内で使用しているメソッドと説明

メソッド/設定項目 説明
for_each aws_acm_certificatedomain_validation_optionsをループ処理し、ドメイン名をキーにして、レコード情報を作成する
allow_overwrite レコードの上書きを許可する設定。trueに設定する事で、既存のレコードを上書きできる
name DNSレコードの名前を指定。ここでは each.value.nameによりループ処理の値を使用する
records レコードの値を指定する。each.value.recordでループ処理で取得した値を配列として設定する
ttl Time To Live(TTL)、レコードの有効期間を秒単位で指定する。今回は、60 秒を設定した
type レコードのタイプを指定する。ループ処理で取得した each.value.typeを使用する
zone_id Route 53のホストゾーンのIDを指定する。data.aws_route53_zone.example.zone_idを使用して指定されたゾーンに登録する

aws_acm_certificate_validation内で使用しているメソッドと説明

メソッド/プロパティ 説明
certificate_arn ACM証明書のARN (Amazon Resource Name)を指定し、この証明書を検証する為に使用する
validation_record_fqdns 検証に使用する完全修飾ドメイン名(FQDN)のリストを指定する。aws_route53_record.exampleFQDNをループして抽出し、ACMDNS検証に使用する

補足

FQDN、ドメイン、リファラーの違いに関する比較表

用語 表示例 説明
FQDN (Fully Qualified Domain Name) www.example.com. 完全修飾ドメイン名の略で、特定のホストをインターネット上で一意に識別するための完全な名前。例えば、www.example.com.のようにトップレベルドメインまで含めた名前を示す
ドメイン (Domain) example.com ネットワーク内で識別される名前の範囲。example.comexample.orgのように、ウェブサイトやメールサービスの基盤となる名前。FQDNはこのドメイン名を含むが、必ずしもホスト名まで含まない事もある
リファラー (Referrer) https://source.example.com/page ウェブブラウザやHTTPリクエストで、あるウェブページにアクセスした際に、そのアクセス元のURLを示す情報。リンクをクリックした時に、どのページから来たかをサーバーに知らせる目的で使用する

参考資料

まとめ

今回は、ドメイン発行やACMの設定を行いました。ドメインの知識や証明書に関する事が理解出来てとても良い経験になりました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?