🍽️

ACMで発行済みの証明書をTerraformでData Sourceとして参照する

2021/01/15に公開

はじめに

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