sav*_*vsr 5 interpolation amazon-s3 amazon-web-services terraform
我正在尝试编写一个用于将存储桶策略附加到 AWS S3 存储桶的 terraform 模块。这是代码:
data "aws_iam_policy_document" "make_objects_public" {
# if policy_name == <this-policy-name>, then generate policy
count = "${var.policy_name == "make_objects_public" ? 1 : 0}"
statement {
...
}
}
resource "aws_s3_bucket_policy" "bucket_policy" {
# if policy_name != "", then add the generated policy
count = "${var.policy_name != "" ? 1 : 0}"
bucket = "${var.bucket_name}"
policy = "${data.aws_iam_policy_document.<policy-name-goes-here>.json}"
}
Run Code Online (Sandbox Code Playgroud)
我想policy_name
在获取由aws_iam_policy_document
. 我尝试了几件事,但遗憾的是它们不起作用。这在 terraform 中可能吗?
我尝试了这些黑客:
policy = "${data.aws_iam_policy_document."${var.policy_name}".json}"
policy = "${"${format("%s", "data.aws_iam_policy_document.${var.policy_name}.json")}"}"
policy = "${format("%s", "$${data.aws_iam_policy_document.${var.policy_name}.json}")}"
Run Code Online (Sandbox Code Playgroud)
谢谢。
不支持动态资源名称,因为 Terraform 必须在开始处理插值之前构建依赖关系图,因此这些关系必须是显式的。
这种设置的推荐方法是将系统分解为小模块,然后调用模块可以一起使用这些模块来生成所需的结果,而无需重复所有细节。
在这种特殊情况下,您可以将每个策略拆分为自己的可重用模块,然后再编写一个可重用模块来创建 S3 存储桶并将给定策略与其关联。然后,调用配置可以选择性地实例化适合其需求的策略模块以及通用 S3 存储桶模块,以创建所需的结果:
module "policy" {
# policy-specific module; only contains the policy data source
source = "../policies/make_objects_public"
# (any other arguments the policy needs...)
}
module "s3_bucket" {
# S3 bucket module creates a bucket and attaches a policy to it
source = "../s3_bucket" # general resource for S3 buckets with attached policies
name = "example"
policy = "${module.policy.policy_json}" # an output from the policy module above
}
Run Code Online (Sandbox Code Playgroud)
除了避免动态资源选择的需要之外,这还通过将策略生成与 S3 存储桶创建解耦来提高灵活性,并且原则上允许具有异常需求的调用模块完全跳过实例化策略模块并直接使用aws_iam_policy_document
。
上述模式有点类似于依赖注入技术,其中系统被分成小组件(在本例中为模块),然后根配置以适合特定用例的方式“连接”这些组件。这种方法与一般技术具有非常相似的优点和缺点。
归档时间: |
|
查看次数: |
1240 次 |
最近记录: |