问题描述
在使用Terraform时遇到了一个问题,他想要从一个模块中获取KMS密钥的ARN,然后在另一个模块的S3存储桶中使用该ARN。他尝试了一些方法,但不确定如何在S3资源中访问从一个模块输出的ARN值。
解决方案
以下解决方案基于Terraform 0.12+版本。确保备份所有配置文件,并在尝试之前阅读相关文档。
使用输出传递ARN值
在Terraform中,一个模块可以通过输出(outputs)将数据传递给调用它的模块。在这种情况下,我们可以从KMS模块输出ARN值,然后在S3模块中使用该值。
步骤
- 在
modules/kms/_outputs.tf
中,输出KMS密钥的ARN值:
output "kms_arn" {
value = aws_kms_key.key.arn
}
- 在
modules/S3/main.tf
中,使用引用来获取KMS密钥的ARN值:
module "s3_bucket" {
source = "./modules/S3"
kms_master_key_id = module.kms.kms_arn
}
- 在
modules/S3/variables.tf
中定义变量以接收ARN值:
variable "kms_master_key_id" {
default = ""
}
- 在
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之外处理启动顺序。
步骤
-
在您的Terraform配置中,不直接引用ARN,而是在脚本中获取ARN并将其传递给Terraform。
-
编写一个脚本,例如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
请注意,脚本方法可能会增加配置的复杂性,并需要您自己确保依赖关系正确。
无论您选择哪种方法,都请确保在尝试之前备份所有配置,并在生产环境中谨慎测试。
以上是解决您问题的两种方法,您可以根据实际情况选择其中一种来满足您的需求。
正文完