【Terraform】指定したドメインでCloudFrontにアクセスできない。。。
Route53 で CloudFront とドメインを関連付け、ACM を適用しました。
だけど、そのドメインにアクセスしてもうまく表示されなかったので、解決していきます。
※Terraform を使って構築しています
環境
- WSL で Ubuntsu を使用
- Terraform v1.4.2
ゴール
https://<用意したドメイン(test.hisui-app.com)>/index.html
にアクセスし、下記が表示されるようにしたい
現状
- <用意したドメイン(test.hisui-app.com)>/index.htmlのA レコードに CloudFront のエイリアスを指定
- ACM にて、test.hisui-app.com のSSL 証明書を取得済み。
- test.hisui-app.com に HTTPS でアクセスできない。。。
- CloudFront のオリジンには S3 を設定
- オリジンのS3 には index.html がアップロードされている
- <CloudFront のドメイン>/index.htmlにアクセスすると、index.html が表示される
- <用意したドメイン(test.hisui-app.com)>/index.htmlにアクセスすると 下記のように403 エラーが表示される
原因調査
- test.hisui-app.com に HTTPS でアクセスできない。。。
- <CloudFront のドメイン>/index.htmlにアクセスすると、index.html が表示される
上記より、CloudFront - S3 間はうまくいっており、ACM - CloudFront がダメかな
と予想しました。
調べてみると、
CloudFront が HTTPS 通信のみを要求していますが、ACM が適用されておらず HTTP でアクセスしていたこと
が原因みたいです。
要は、CloudFront に ACM を適用できていなかったんですねぇ。。。
下記の AWS 公式ドキュメントを見ても、 HTTP でアクセスすると 403 エラーが返ってくるみたい
対処 ①:CloudFront と ACM を紐づける
CloudFront と ACM を紐づけていきます
こちらを参考に、下記のようにコードを修正してみます
# CloudFrontを定義
resource "aws_CloudFront_distribution" "main" {
...
viewer_certificate {
acm_certificate_arn = aws_acm_certificate.cert.arn
ssl_support_method = "sni-only"
minimum_protocol_version = "TLSv1"
}
}
# ACM証明書を定義
resource "aws_acm_certificate" "cert" {
domain_name = "test.hisui-app.com"
validation_method = "DNS"
lifecycle {
create_before_destroy = true
}
}
これで terraform applyします
エラー ②:ACM のリージョンがダメ
ん、エラーが出ました。。。
╷
│ Error: updating CloudFront Distribution (********): InvalidViewerCertificate: The specified SSL certificate doesn't exist, isn't in us-east-1 region, isn't valid, or doesn't include a valid certificate chain.
│ status code: 400, request id: ********
│
│ with aws_CloudFront_distribution.main,
│ on CloudFront.tf line 2, in resource "aws_CloudFront_distribution" "main":
│ 2: resource "aws_CloudFront_distribution" "main" {
│
╵
DeepL で翻訳してみると
指定されたSSL証明書が存在しない、
us-east-1リージョンにない、有効でない、
または有効な証明書チェーンを含んでいない場合です。
ということらしい。
確かに AWS 公式ドキュメントを見ても
CloudFront に適用する場合にはバージニア北部 (us-east-1) リージョンにないとダメらしい
対処 ②:ACM のリージョンをバージニア北部へ
ACM をバージニア北部 (us-east-1) リージョンに作っていきます
ただ、ほかのリソースは基本 東京(ap-northeast-1)リージョンに作成したいので、
エイリアスを使用していきます。
下記のように provider を指定します。
alias を指定していないほうはデフォルトで使用されます。
# デフォルトではこちらの値が使われる
provider "aws" {
region = "ap-northeast-1"
}
# こちらを指定するには
# provider = aws.virginia
# と記述する
provider "aws" {
alias = "virginia"
region = "us-east-1"
}
そして、ACM のみ virginia というエイリアスを設定した provider を指定します。
# ACM証明書を定義
resource "aws_acm_certificate" "cert" {
domain_name = local.domain_name
validation_method = "DNS"
# バージニア北部リージョンを指定したproviderを使用
provider = aws.virginia
lifecycle {
create_before_destroy = true
}
}
これで terraform applyします
エラー ③:aws_acm_certificate_validation 修正
╷
│ Error: reading ACM Certificate (arn:aws:acm:us-east-1*******:certificate/**********): couldn't find resource
│
│ with aws_acm_certificate_validation.cert,
│ on acm.tf line 13, in resource "aws_acm_certificate_validation" "cert":
│ 13: resource "aws_acm_certificate_validation" "cert" {
│
ACM が見つからないって言ってますね。。。
対処 ③:aws_acm_certificate_validation 修正
aws_acm_certificate_validation のほうもバージニア北部リージョンにする必要がありました
resource "aws_acm_certificate_validation" "cert" {
certificate_arn = aws_acm_certificate.cert.arn
validation_record_fqdns = flatten([ values(aws_route53_record.cert)[*].fqdn ])
provider = aws.virginia
}
これで terraform applyします
とりあえず通りました!
エラー ④:サポートされていないプロトコルが使用
test.hisui-app.com/index.html にアクセスしてみると、以下のエラーが。
「サポートされていないプロトコルが使用されています。」???
対処 ④:エイリアスの設定
CloudFront に対して任意のドメインを使用するには代替ドメインを設定する必要があります。
これを Terraform に落とし込みます
resource "aws_CloudFront_distribution" "main" {
aliases = [ "test.hisui-app.com" ]
...
}
これで terraform applyします
動作確認
test.hisui-app.com/index.html にアクセスしてみます
無事、表示されました!!!(HTTPS でアクセスできてます)
参考
Discussion