其中一个 cmets 询问如何在 dynamic block 内使用 for_each 时使用索引。
简答
这可以通过参考<name-of-dynamic-block>.key来完成(key是索引)。
一个例子
用例
我将举一个用例,我有一个 S3 存储桶,里面有多个文件夹,每个文件夹都有一个指向它的专用云端分发。
我想要在 AWS 范围内的东西
假设我在 s3 存储桶中有 2 个文件夹:name1 和 name2。
所以我必须创建一个如下所示的aws_s3_bucket_policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "<arn-of-cloudfront-distribution-1>"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::some-bucket/name1/*"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "<arn-of-cloudfront-distribution-2>"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::some-bucket/name2/*"
}
]
}
(*) 为简洁起见,删除了云端发行版的创建。
如何使用 Terraform 实现这一目标
所以我有一个需要在我的 s3 存储桶中创建的文件夹列表:
variable "all_s3_folders" {
type = list(string)
default = []
description = "All folders inside the bucket"
}
我为每个文件夹创建了一个 cloudfront 分发(为简洁起见已删除)和一个 cloudfront 源访问身份(请参阅oai)资源。
我们将根据文件夹数量上的count 创建这些资源:
resource "aws_cloudfront_origin_access_identity" "oai" {
count = length(var.all_s3_folders)
comment = "some-comment"
}
现在我们需要将每个文件夹(+ 其相关的云端分发和 oai)添加为存储桶策略中的条目。
我想使用带有for_each 的动态块,但不依赖count.index。
但我仍然需要使用索引遍历 aws_cloudfront_origin_access_identity 资源。
所以,
为了在动态块内使用for_each 时使用索引,您只需引用<name-of-dynamic-block>.key - 这里是statement.key
data "aws_iam_policy_document" "my-doc" {
dynamic "statement" {
for_each = var.folders_array
content {
effect = "Allow"
actions = [
"s3:GetObject"
]
resources = [
"${aws_s3_bucket.my_s3_bucket.arn}/${statement.value}/*" # <--Using statement value
]
principals {
type = "AWS"
identifiers = [some_cloudfront_resource[statement.key].id] # <--Using statement key
}
}
}
}