【Terraform】ACMを使用してALBにHTTPSでアクセスする

Terraform

 

どのサイトでもHTTPS化することが求められる時代になっています。

 

今回はTerraformAWSを使用して、ALBにHTTPSアクセスできるようにします!

また、HTTPでアクセスした場合にはHTTPSへリダイレクトするようにもします

 

本記事で使っているexample.comというドメインは例として挙げているだけなので
各々取得したドメインを使用してください

 

現状

 

 

  1. Route53でALBをAliasレコードとして登録している
  2. ALBはNginxをインストールしているEC2へリクエストを振り分ける
  3. 1.と2.よりexample.comでアクセスすると、Nginxの画面が表示される
  4. ALBにSSL証明書は適用していないため、HTTPのみでアクセスできる

 

コマンドで現状を確認すると

 

ゴール

 

 

ACMでSSL証明書を作成しALBに適用することで

  1. HTTPSでアクセス
  2. HTTP⇒HTTPSのリダイレクト

をできるようにします

 

Terraformで構築していく

ACMでSSL証明書を作成

 

aws_acm_certificateでSSL証明書を作成します

プロパティ 説明
domain_name 証明書のドメイン名。
validation_method 検証方法。今回はDNS認証としています。
後ほどRoute53に検証用レコードを作成します。
subject_alternative_names SANsの設定。今回はワイルドカードを設定しておきます。
create_before_destroy 旧リソースを削除する前に新リソースを作成するか。
trueにしておくと、証明書を作り変えるときに
旧証明書がALBにアタッチされたまま削除しようとしてエラーになることを防げます。

 

 

SSL証明書をRoute53で検証

 

このパートはハマりポイントが多いので注意してください!

 

aws_route53_recordでDNS検証用レコードをRoute53に作成します

aws_acm_certificate.cert.domain_validation_optionsはSet型のため、

for文でmap型へ変換し、for_eachで1つずつ取り出しながらレコードを作成しています。

プロパティ 説明
name レコード名。map型のnameプロパティに入っている
type レコードタイプ。typeプロパティに入っている
records レコード値。List型。recordプロパティに入っている
zone_id ホストゾーンのID。
ttl TTL。
allow_overwrite レコードの上書きを許すか。
証明書にワイルドカードを含めた場合にはtrueにしないとエラーになる

 

なぜ、allow_overwrite を true にするのか?は↓をご覧ください!

 

 

また、aws_acm_certificate_validationを使用してDNS検証が完了するまで待ちます

aws_route53_record.cert を Set→Listへ変換してvalidation_record_fqdnsに指定します。

 

このパートの詳しいことは下記の記事をご参考ください

 

 

ALBのHTTPSリスナーを作成

 

HTTPSリスナーを作成します。

ALBの443ポートへ来たアクセスをターゲットグループの80ポートへながします

 

プロパティ 説明
load_balancer_arn ALBのARN。
port リクエストを受け取るリスナーのポート。443とします
protocol リスナーが受け取るプロトコル。HTTPSとします
ssl_policy セキュリティポリシー。
AWSによるとELBSecurityPolicy-TLS13-1-0-2021-06が推奨
certificate_arn SSL証明書のARN。aws_acm_certificateで作成したものを指定。
default_action リクエストが来た時のALBの挙動を設定。
type デフォルトアクションのタイプ。
ターゲットグループにリクエストを流すのでforwardを指定
target_group_arn リクエストを流すターゲットグループのARN。

 

 

HTTPリスナーのアクションをリダイレクトへ変更

 

HTTPリスナーを修正して、HTTPSへリダイレクトするようにします

 

具体的にはdefault_actionのtypeをredirectにして、

リダイレクト先のポート、プロトコル、スタータスコードを指定します

 

 

(必要に応じて)ALBの443ポートへの通信を許可

 

意外に忘れやすいSecurity Groupで許可すること!

かくいう私も忘れていて慌てて後から設定追加しました(笑)

 

設定内容はインバウンドルールにインターネットからの443ポートへの通信を許可すること。

 

 

完成したコード

 

ハイライトされている部分が今回追加したコードになります

 

 

動作確認

 

terraform applyを実行して正常終了したら、動作確認をしていきます

 

HTTPSでのアクセス

 

 

HTTPSに対して200とNginxの画面も返ってきています

やったー

 

HTTP⇒HTTPSのリダイレクト

 

 

HTTPにcurlを投げると、301でhttps://example.comにリダイレクトされています

 

無事終わりましたー

 

参考

 

Application Load Balancer 用の HTTPS リスナーを作成する - Elastic Load Balancing
Application Load Balancer の HTTPS リスナーについて説明します。
Terraform Registry
Terraform Registry
TerraformでDNSレコード,ACM証明書,ALBをプロビジョニングする際に入れておいたほうが良いコード | DevelopersIO
状況 ALBがフロントにあるWebアプリケーションです。https通信のためにACM証明書を作りALBにアタッチします。またクライアントがアクセスするFQDNに対応するDNSレコードはRoute53ホストゾーンに作成しま …
【Terraform】ACMでSSL証明書を作成しDNS認証するときに遭遇したエラーたち
Terraformを使ってACMでSSL証明書を発行しようとした際にいくつかエラーにはまったので、記事にしておきます。 ゴール Terraformを使ってACMでSSL証明書を発行する 認証方法はRou...

 

コメント

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