amazon-s3 - Terraform 0.12:桶的输出列表,用作另一个模块的输入并迭代
问题描述
我正在使用 Tf 0.12。我有一个输出存储桶列表的 s3 模块,我想将其用作我拥有的云端模块的输入。
我面临的问题是,当我这样做时,terraform plan/apply
我收到以下错误count.index is 0 |var.redirect-buckets is tuple with 1 element
我尝试了各种移动 count.index 调用的方法,但无济于事。我的示例代码如下。
module.s3
resource "aws_s3_bucket" "redirect" {
count = length(var.redirects)
bucket = element(var.redirects, count.index)
}
mdoule.s3.output
output "redirect-buckets" {
value = [aws_s3_bucket.redirect.*]
}
module.cdn.variables
...
variable "redirect-buckets" {
description = "Redirect buckets"
default = []
}
....
错误在这里抛出
module.cdn
resource "aws_cloudfront_distribution" "redirect" {
count = length(var.redirect-buckets)
default_cache_behavior {
// Line below throws the error, one amongst many
target_origin_id = "cloudfront-distribution-origin-${var.redirect-buckets[count.index]}.s3.amazonaws.com"
....
//Another error throwing line
target_origin_id = "cloudfront-distribution-origin-${var.redirect-buckets[count.index]}.s3.amazonaws.com"
任何帮助是极大的赞赏。
解决方案
模块.s3
resource "aws_s3_bucket" "redirects" {
for_each = var.redirects
bucket = each.value
}
您的重定向变量定义需要更改为以下内容:
variable "redirects" {
type = map(string)
}
模块.s3.输出:
output "redirect_buckets" {
value = aws_s3_bucket.redirects
}
模块.cdn
resource "aws_cloudfront_distribution" "redirects" {
for_each = var.redirect_buckets
default_cache_behavior {
target_origin_id = "cloudfront-distribution-origin-${each.value.id}.s3.amazonaws.com"
}
重定向存储桶的变量定义需要更改为这样的(注意下划线,在某些情况下使用 skewercase 会表现得很奇怪,不值得):
variable "redirect_buckets" {
type = map(object(
{
id = string
}
))
}
根模块
module "s3" {
source = "../s3" // or whatever the path is
redirects = {
site1 = "some-bucket-name"
site2 = "some-other-bucket"
}
}
module "cdn" {
source = "../cdn" // or whatever the path is
redirects_buckets = module.s3.redirect_buckets
}
从示例的角度来看,这很有趣,但您不需要在此处使用 S3 的输出,因为您只需将相同的重定向映射交给 cdn 模块并在这些映射上使用 for_each。
有一个名为 Terragrunt 的工具,它封装了 Terraform 并支持依赖项。
推荐阅读
- javascript - JavaScript值中的小写和合并单词
- solr - solrj v4.3.1 使用空数组列表更新多值字段的 Solr 失败
- sony - 适用于 C# Windows 应用程序的索尼远程控制 API
- android - 无法读取原生 JSON 数据
- asp.net-mvc - MVC - 使用文本框获取日期
- ruby-on-rails - Rubymine 没有在第一个 Rails 测试中执行代码
- c# - JSON字典错误
- symfony - 动态参数取决于环境变量(Vhost)
- c# - 如何使用反射获取静态 void main() 的命名空间?
- r - 求解方程以找到余数为零的除数