在Terraform中从另一个模块检索ARN

48次阅读
没有评论

问题描述

在使用Terraform时遇到了一个问题,他想要从一个模块中获取KMS密钥的ARN,然后在另一个模块的S3存储桶中使用该ARN。他尝试了一些方法,但不确定如何在S3资源中访问从一个模块输出的ARN值。

解决方案

以下解决方案基于Terraform 0.12+版本。确保备份所有配置文件,并在尝试之前阅读相关文档。

使用输出传递ARN值

在Terraform中,一个模块可以通过输出(outputs)将数据传递给调用它的模块。在这种情况下,我们可以从KMS模块输出ARN值,然后在S3模块中使用该值。

步骤

  1. modules/kms/_outputs.tf中,输出KMS密钥的ARN值:
output "kms_arn" {
  value = aws_kms_key.key.arn
}
  1. modules/S3/main.tf中,使用引用来获取KMS密钥的ARN值:
module "s3_bucket" {
  source            = "./modules/S3"
  kms_master_key_id = module.kms.kms_arn
}
  1. modules/S3/variables.tf中定义变量以接收ARN值:
variable "kms_master_key_id" {
  default = ""
}
  1. modules/S3/main.tf中,将变量传递给S3存储桶的配置:
resource "aws_s3_bucket" "bucket" {
  bucket = "09432804238423098"
  acl    = "private"

  versioning {
    enabled = false
  }

  force_destroy = true

  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        kms_master_key_id = var.kms_master_key_id
        sse_algorithm     = "aws:kms"
      }
    }
  }
}

备选方案:使用脚本

如果输出传递的方法无法满足需求,您还可以考虑使用脚本来在Terraform之外处理启动顺序。

步骤

  1. 在您的Terraform配置中,不直接引用ARN,而是在脚本中获取ARN并将其传递给Terraform。

  2. 编写一个脚本,例如bash脚本,来处理启动顺序:

#!/bin/bash

# 使用Terraform启动KMS模块
terraform apply -target=module.kms

# 获取KMS的ARN值
kms_arn=$(terraform output -module=module.kms kms_arn)

# 使用Terraform启动S3模块,并传递KMS的ARN值作为变量
terraform apply -var="kms_master_key_id=${kms_arn}" -target=module.s3_bucket

请注意,脚本方法可能会增加配置的复杂性,并需要您自己确保依赖关系正确。

无论您选择哪种方法,都请确保在尝试之前备份所有配置,并在生产环境中谨慎测试。

以上是解决您问题的两种方法,您可以根据实际情况选择其中一种来满足您的需求。

正文完