ACM — TLS 証明書
概要
AWS Certificate Manager (ACM) は AWS が無料で発行・自動更新する TLS 証明書サービス。 Public 証明書(インターネット向け)と Private 証明書(社内向け)の両方を扱えます。 ACM 経由で発行された証明書は CloudFront / ALB / API Gateway / NLB / App Runner 等に直接アタッチして使えます。
ポイントは「無料 + 自動更新 + 自前で鍵を管理しなくて良い」。Let's Encrypt のように 90 日ごとの更新を心配する必要がありません。
主な機能
- Public Certificate — Amazon が認証局となる無料の TLS 証明書。インターネット公開サービス向け。
- Private CA (PCA) — 自前 CA を AWS で運用。社内・サービス間 mTLS 用。有料。
- DNS 検証 — ドメイン所有確認。Route 53 に CNAME を 1 個追加するだけ。
- Email 検証 — admin@example.com 等にメール送信。Route 53 を使わない場合の代替。
- ワイルドカード SAN —
*.iigtn.comで全サブドメイン対応。 - 自動更新 — 有効期限の 60 日前に自動更新。DNS 検証なら無人運用。
- マネージドリソース統合 — CloudFront / ALB / API Gateway 等にアタッチして使用。
重要な制約: us-east-1 必須のケース
CloudFront に使う ACM 証明書は us-east-1 (バージニア北部) で発行する必要があります。 他のリージョンで発行した証明書は CloudFront に紐付けできません。
- CloudFront 用 → us-east-1
- ALB / API Gateway / NLB 用 → 各リソースの region と同じ
Terraform では provider alias で us-east-1 を別途宣言する必要がある(よく忘れる)。
使うべきパターン
- HTTPS 化したい全 AWS サービス — CloudFront / ALB / API Gateway / NLB。
- カスタムドメイン —
api.example.comやwww.example.comでの提供。 - ワイルドカード対応 — 1 証明書で多サブドメインカバー。
- 社内 mTLS — Private CA で内部証明書を発行。
使わない方が良いパターン
- EC2 上の Nginx に証明書を置きたい — ACM 証明書は ALB 等のマネージドサービスにアタッチ前提で、EC2 直接ダウンロードは Public 証明書では不可。Let's Encrypt 等を検討。
- AWS 外でホスティング — ACM 発行証明書は AWS マネージドサービスでしか使えない。
- EV (Extended Validation) 証明書が必要 — ACM は DV のみ。EV が要件ならサードパーティで購入。
Terraform 最小サンプル(DNS 検証 + ワイルドカード)
# CloudFront 用なので us-east-1 で発行
provider "aws" {
alias = "us_east_1"
region = "us-east-1"
}
resource "aws_acm_certificate" "wildcard" {
provider = aws.us_east_1
domain_name = "iigtn.com"
subject_alternative_names = ["*.iigtn.com"]
validation_method = "DNS"
lifecycle { create_before_destroy = true }
}
# Route 53 で DNS 検証 CNAME を作成
resource "aws_route53_record" "validation" {
for_each = {
for dvo in aws_acm_certificate.wildcard.domain_validation_options :
dvo.domain_name => {
name = dvo.resource_record_name
record = dvo.resource_record_value
type = dvo.resource_record_type
}
}
zone_id = aws_route53_zone.main.zone_id
name = each.value.name
type = each.value.type
ttl = 60
records = [each.value.record]
}
# 検証完了を待つ (apply が完了するまで)
resource "aws_acm_certificate_validation" "wildcard" {
provider = aws.us_east_1
certificate_arn = aws_acm_certificate.wildcard.arn
validation_record_fqdns = [for r in aws_route53_record.validation : r.fqdn]
}
# CloudFront にアタッチ
resource "aws_cloudfront_distribution" "site" {
# ...
viewer_certificate {
acm_certificate_arn = aws_acm_certificate_validation.wildcard.certificate_arn
ssl_support_method = "sni-only"
minimum_protocol_version = "TLSv1.2_2021"
}
}
用語集
- ACM (AWS Certificate Manager)
- AWS マネージドの TLS 証明書サービス。Public 証明書は無料 + 自動更新。
- DNS 検証 / Email 検証
- ドメイン所有確認の方法。DNS 検証は Route 53 に CNAME 追加で自動化可、Email 検証は admin@... へメール。
- SAN (Subject Alternative Name)
- 1 つの証明書で複数ドメインをカバーする仕組み。
*.iigtn.comのワイルドカードも SAN。 - us-east-1 制約
- CloudFront に使う ACM 証明書は us-east-1 で発行必須。他 region 発行の証明書はアタッチ不可。
- Private CA (PCA)
- AWS マネージドの Private CA。自社 CA を AWS 上で運用、社内 mTLS 等に使う。有料。
- DV / OV / EV
- 証明書の検証レベル。Domain Validation (DV) / Organization (OV) / Extended (EV)。ACM は DV のみ。
- aws_acm_certificate_validation
- Terraform で「証明書検証完了を待つ」リソース。これを使わないと apply タイミングで証明書未検証エラー。