🍽️
ACMで発行済みの証明書をTerraformでData Sourceとして参照する
はじめに
Terraform以外の手段にて発行したACM(AWS Certificate Manager)の証明書をterrafom import
を使ってTerraform管理下におきました。
しかし、何度も環境全体の作り直し作業をする中で、証明書も作り直しが発生してしまうことを回避したくなったため、この証明書はterraform import
するのではなく、Data Sourceとして扱い、他のリソースから参照のみ行うようにしました。
環境
- Terraform 0.14.3
証明書をTerraform管理外にする
既に証明書をTerraformの管理下に置いているのであれば、terraform state rm
を使って管理外にします。
// -dry-runオプションを付けて実行できるか確認
$ terraform state rm -dry-run module.acm_web.aws_acm_certificate.this
Would remove module.acm_web.aws_acm_certificate.this
// -dry-runオプション無しで実行
$ terraform state rm module.acm_web.aws_acm_certificate.this
Removed module.acm_web.aws_acm_certificate.this
Successfully removed 1 resource instance(s).
証明書をData Resourceにする
これまで証明書をresourceとしてきましたが、これをdata(Data Source)にします。
なお、今回もモジュール化しています。
main.tf
module "acm_web" {
source = "../modules/acm"
domain_name = "web.example.com"
}
modules/acm/acm_certificate.tf
- resource "aws_acm_certificate" "this" {
- domain_name = var.domain_name
- validation_method = "DNS"
-
- lifecycle {
- create_before_destroy = true
- }
- }
+ data "aws_acm_certificate" "this" {
+ domain = var.domain_name
+ }
modules/acm/variables.tf
variable "domain_name" {
type = string
}
こうすることで、例えば以下のように、ALBなどでACMのARNを参照できるようになります。
main.tf
module "web" {
source = "../shared/modules/alb"
acm = module.acm_web.this
// 略
}
modules/alb/alb.tf
resource "aws_alb_listener" "https" {
certificate_arn = var.acm.arn
// 略
}
variable "acm" {}
Data Sourceとなった証明書の情報を見る
Data Sourceもterraform state show
コマンドで情報を見ることができます。
$ terraform state show module.acm_web.data.aws_acm_certificate.this
data "aws_acm_certificate" "this" {
arn = "arn:aws:acm:ap-northeast-1:xxxxxxxxxxxx:certificate/xxx..."
domain = "web.example.com"
id = "arn:aws:acm:ap-northeast-1:xxxxxxxxxxxx:certificate/xxx..."
most_recent = false
tags = {}
}
上記の通り、arn
などを参照できることが確認できました。
Discussion