0
0

『実践Terraform』でterraform applyするとUnsupportedCertificateとエラーが出る

Posted at

はじめに

Terraform初学者です。

実践Terraform』という書籍で勉強しています。

書籍のコードをそのまま記述するとエラーとなってしまう箇所があったため、備忘録としてまとめます。

この記事におけるバージョンは次のとおりです。

  • Terraform: 1.9.5
  • terraform-provider-aws: 5.65.0

問題

第8章 ロードバランサーとDNSのサンプルコードが対象です。

HTTPSリスナーを定義する箇所で次のコードが定義されていました。

lb.tf
resource "aws_lb_listener" "https" {
  load_balancer_arn = aws_lb.example.arn
  port = "443"
  protocol = "HTTPS"
  certificate_arn = aws_acm_certificate.example.arn
  ssl_policy = "ELBSecurityPolicy-2016-08"

  default_action {
    type = "fixed-response"

    fixed_response {
      content_type = "text/plain"
      message_body = "これは『HTTPS』です"
      status_code = "200"
    }
  }
}

書籍のとおりにコードを書き、第8章が終わったタイミングでterraform applyを実行すると次のエラーが出ました(一部の情報は差し替えています)

│ Error: creating ELBv2 Listener (arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/example/[load-balancer-id]): operation error Elastic Load Balancing v2: CreateListener, https response error StatusCode: 400, RequestID: [request-id], api error UnsupportedCertificate: The certificate 'arn:aws:acm:ap-northeast-1:123456789012:certificate/[example-certificate-id]' must have a fully-qualified domain name, a supported signature, and a supported key size.
│ 
│   with aws_lb_listener.https,
│   on lb.tf line 66, in resource "aws_lb_listener" "https":
│   66: resource "aws_lb_listener" "https" {

中身を見るかぎり、HTTPSリスナーの作成時に指定された証明書に問題があるようです。

しかし書籍の中では、証明書の検証を行うaws_acm_certificate_validationも定義しているため、なぜこのエラーが発生するのかわかりませんでした。

原因

結論として、次のようにHTTPSリスナーの定義へdepends_onを記載することで解決しました。

lb.tf
resource "aws_lb_listener" "https" {
  load_balancer_arn = aws_lb.example.arn
  port = "443"
  protocol = "HTTPS"
  certificate_arn = aws_acm_certificate.example.arn
  ssl_policy = "ELBSecurityPolicy-2016-08"

  # この1行を追加
  depends_on = [aws_acm_certificate_validation.example]

  default_action {
    type = "fixed-response"

    fixed_response {
      content_type = "text/plain"
      message_body = "これは『HTTPS』です"
      status_code = "200"
    }
  }
}

元々の書き方だとaws_acm_certificate_validationの作成完了前、つまり検証が完了する前の証明書がALBに紐づけられてしまうため、エラーが発生していました。

depends_onを記述することで「aws_acm_certificate_validationの作成が完了してからHTTPSリスナーを作成する必要がある」という依存関係を明示することができます。

おわりに

実践Terraform』はとてもわかりやすいため、初学者にもおすすめです。

ただし出版が2019年なので現在とは異なる点もあります。

今後もそういった箇所が見つかったら、公式ドキュメントと書籍を行ったり来たりしつつ、さらにTerraformの理解を深めていきたいと思います。

また、この記事に誤りがありましたらコメントにて教えていただけますと幸いです。

参考資料

0
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
0
0