【问题标题】:Terraform AWS optional logging for S3 bucket用于 S3 存储桶的 Terraform AWS 可选日志记录
【发布时间】:2019-08-23 23:46:43
【问题描述】:

我正在尝试使用链接中示例中的 terraform 创建 S3 存储桶 https://www.terraform.io/docs/providers/aws/r/s3_bucket.html 我已经创建了一个 S3 模块。

我面临的问题是,对于某些存储桶,我不想启用日志记录。 这如何在 terraform 中实现。

 logging {
        target_bucket = "${aws_s3_bucket.log_bucket.id}"
        target_prefix = "log/"   
}

对 target_bucket 和 target_prefix 使用空字符串会导致 terraform 尝试创建 target_bucket。

另外,我正在尝试使用一个模块。

【问题讨论】:

  • 您不想启用日志记录吗?然后从模块中删除日志记录部分 - 它不是强制性的
  • 我希望为某些存储桶启用日志记录,而不是为其他存储桶启用日志记录,但使用模块。

标签: amazon-s3 terraform terraform-provider-aws


【解决方案1】:

使用 terraform 0.12+ 中更新的动态块支持,如果我们想要像这样记录,我们会传递一个包含记录设置的单项数组:

variable "logging" {
  type        = list
  default     = []
  description = "to enable logging set this to [{target_bucket = 'xxx' target_prefix = 'logs/'}]"
}

resource "aws_s3_bucket" "s3bucket" {
  dynamic "logging" {
    for_each = [for l in var.logging : {
      target_bucket = l.target_bucket
      target_prefix = l.target_prefix
    }]
    content {
      target_bucket = logging.value.target_bucket
      target_prefix = logging.value.target_prefix
    }
  }
}

【讨论】:

  • 使用动态可以工作,但你永远不会传入一个日志对象数组。
【解决方案2】:

会飞。 如果您想将日志记录的值设为可选,请首先将您的模块设为 aws_s3_bucket.tf:

resource "aws_s3_bucket" "b" {
  bucket = "my-tf-test-bucket"
  acl    = "private"

  logging = "${var.logging}"
}

variable "logging" {
  type    = "list"
  default = []
}

然后在子文件夹example中添加您的模板module.tf

module "s3" {
  source = "../"

  logging = [
    {
      target_bucket = "loggingbucketname"
      target_prefix = "log/"
    },
  ]
}

provider "aws" {
  region  = "eu-west-1"
  version = "2.4.0"
}

这是您的具有日志记录的版本。

接下来修改你的 module.tf 看起来像

  module "s3" {
      source = "../"
   }

    provider "aws" {
      region  = "eu-west-1"
      version = "2.4.0"
    }

那是你没有的版本。这适用于: Terraform v0.11.11 + provider.aws v2.4.0

更新 这是 v0.12.5 的答案。 模块现在是:

resource "aws_s3_bucket" "b" {
  bucket = "my-tf-test-bucket"
  acl    = "private"

  logging {
    target_bucket = var.logging["target_bucket"]
    target_prefix = var.logging["target_prefix"]
  }
}

variable "logging" {
  type=map
  default={
      target_bucket = ""
      target_prefix = ""
  }
}

使用带有日志记录的模块变为(您的模块路径可能不同):

module "s3" {
  source = "../"
  logging={
    target_bucket = aws_s3_bucket.log_bucket.id
    target_prefix = "log/"
  }
}

provider "aws" {
  region  = "eu-west-1"
  version = "2.34.0"
}

resource "aws_s3_bucket" "log_bucket" {
  bucket = "my-tf-log-bucket"
  acl    = "private"
}

和没有:

module "s3" {
  source = "../"
}

provider "aws" {
  region  = "eu-west-1"
  version = "2.34.0"
}

【讨论】:

  • 不幸的是,至少在 v0.12.5 中不再有效。产生错误:logging = var.logging An argument named "logging" is not expected here. Did you mean to define a block of type "logging"?
猜你喜欢
  • 2019-11-07
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
相关资源
最近更新 更多