AWSにRails + Nginxな環境をTerraformで構築してみようと思います。
はじめに
本連載で一つずつインフラを構築していきます。
ドメインのhttps化したり、ECSを使用したコンテナオーケストレーションを用いてアプリケーションをデプロイします。
この記事ではドメインのhttps化・ACM(SSL)証明書の取得を行います。
環境は以下です。
OS | Cataline 10.15.6 |
Terraform | 0.14.4 |
基本構文などこちらにまとめてますので、よかったらみてください!
AWS Terraform 基本コード まとめ
連載一覧
- terraform AWS環境構築 事前準備
- 【ネットワーク環境構築】terraform AWS環境構築 第1回
- 【ドメインhttps化・ACM(SSL)証明書発行】terraform AWS環境構築 第2回 ←ここ
- 【ロードバランサー構築】terraform AWS環境構築 第3回
- 【ECS Fargate(nginx)実行】terraform AWS環境構築 第4回
- 【RDS構築】terraform AWS環境構築 第5回
- 【Docker/ECR作成】terraform AWS環境構築 第6回
- 【ECS Fargate(rails + nginx)実行】terraform AWS環境構築 第7回
- 【CircleCIによるCI/CD】terraform AWS環境構築 番外
やること
以下の定義と作成をします。
ドメインhttps化・ACM(SSL)証明書
acmモジュールの作成
https化を定義するモジュールを作成します。
terraformフォルダ内にacmフォルダを作成しましょう。
acmモジュールを使用できるように./main.tfに以下の記述を追記します。
module "acm" { source = "./acm" domain = var.domain }
acmモジュール内でdomainを受け取れるように、variable.tfを用意します。
./acm/variable.tf
variable "domain" {}
ディレクトリ構成は以下のようにしています。
[terraform] $ tree . ├── acm │ ├── main.tf │ └── variable.tf ├── network │ ├── main.tf │ └── variable.tf ├── env │ └── backend.config ├── main.tf ├── backend.tf ├── provider.tf ├── terraform.tfvars └── variable.tf
用意できたら、terraformの初期化を行いましょう。
[terraform] $ terraform init -backend-config=env/backend.config -upgrade
ACM(SSL)証明書リクエスト
検証方法をDNSでACM証明書をリクエストします。
./acm/main.tf に以下を追記します。
resource "aws_acm_certificate" "this" { domain_name = var.domain validation_method = "DNS" lifecycle { create_before_destroy = true } }
- domain_name:検証するドメイン名
- validation_method:検証方法
- lifecycle:terraform destroyしても消去しない
検証用レコード
ホストゾーンに検証用のレコードを作成します。
ホストゾーンはData Sourceを使用して取得しますので、data.tfを用意しておきます。
./acm/data.tf
data "aws_route53_zone" "this" { name = var.domain private_zone = false }
- name:ドメイン名
- private_zone:プライベートホストゾーンかどうか
./acm/main.tf に以下を追記します。
resource "aws_route53_record" "this" { depends_on = [aws_acm_certificate.this] for_each = { for dvo in aws_acm_certificate.this.domain_validation_options : dvo.domain_name => { name = dvo.resource_record_name record = dvo.resource_record_value type = dvo.resource_record_type } } zone_id = data.aws_route53_zone.this.zone_id name = each.value.name records = [each.value.record] ttl = 60 type = each.value.type }
- name:レコード名
- record:レコード値
- type:レコードタイプ
- zone_id:ホストゾーンのID
- ttl:TTL
ACM証明書とCHAMEレコード紐付け
作成したACM証明書と、先程作成した検証用レコードのCNAMEレコードの連携をします。
./acm/main.tf に以下を追記します。
resource "aws_acm_certificate_validation" "this" { certificate_arn = aws_acm_certificate.this.arn validation_record_fqdns = [for record in aws_route53_record.this : record.fqdn] }
- certificate_arn:検証中ACM証明書のARN
- validation_record_fqdns:検証するFQDNのリスト。DNS検証方法のみ指定可能。
それでは、terraform plan, apply して確認しましょう。
CNAMEレコード作成されていますね。
証明書発行されているのも確認できましたね。
まとめ
ACM証明書はロードバランサー構築で使用するので、アウトプット変数を定義しておきましょう。
./acm/output.tf
output "acm_id" { value = aws_acm_certificate.this.id }
./output.tf
output "vpc_id" { value = module.network.vpc_id } output "public_subnet_ids" { value = module.network.public_subnet_ids } output "private_subnet_ids" { value = module.network.private_subnet_ids } # 追記 output "acm_id" { value = module.acm.acm_id }
今回、作成したコードとディレクトリ構成は以下になります。
[terraform] $ tree . ├── acm │ ├── data.tf │ ├── main.tf │ ├── output.tf │ └── variable.tf ├── network │ ├── main.tf │ ├── output.tf │ └── variable.tf ├── env │ └── backend.config ├── main.tf ├── output.tf ├── backend.tf ├── provider.tf ├── terraform.tfvars └── variable.tf
./acm/main.tf
resource "aws_acm_certificate" "this" { domain_name = var.domain validation_method = "DNS" lifecycle { create_before_destroy = true } } resource "aws_route53_record" "this" { depends_on = [aws_acm_certificate.this] for_each = { for dvo in aws_acm_certificate.this.domain_validation_options : dvo.domain_name => { name = dvo.resource_record_name record = dvo.resource_record_value type = dvo.resource_record_type } } zone_id = data.aws_route53_zone.this.zone_id name = each.value.name records = [each.value.record] ttl = 60 type = each.value.type } resource "aws_acm_certificate_validation" "this" { certificate_arn = aws_acm_certificate.this.arn validation_record_fqdns = [for record in aws_route53_record.this : record.fqdn] }
./acm/variable.tf
variable "domain" {}
./acm/data.tf
data "aws_route53_zone" "this" { name = var.domain private_zone = false }
おわり
これで、ドメインhttps化・ACM(SSL)証明書の取得は完了しました。お疲れさまでした!
何か疑問に思うことがあれば、何でもコメントしてください!
次回は、このドメインからサービスにアクセスできるようにロードバランサーを構築します。
参考サイト
コメント