问题陈述 我正在尝试使用terraform跟随自动化aws api网关,这是我的代码的一部分
用于api网关
resource "aws_api_gateway_rest_api" "rest_api" {
#some code
policy = "${data.template_file.init.rendered}"
}
output "id" {
value = "${aws_api_gateway_rest_api.rest_api.id}"
}
output "execution_arn" {
value = "${aws_api_gateway_rest_api.rest_api.execution_arn}"
}
output "arn" {
value = "${aws_api_gateway_rest_api.rest_api.arn}"
}
用于资源政策 请注意,我要在json策略文档中自动插入api id
data "aws_region" "current" {}
data "aws_caller_identity" "current" {}
data "template_file" "init" {
template = "${file("${path.root}/${var.policy_file_location}")}"
vars = {
current_region = "${data.aws_region.current.name}"
current_aws_account = "${data.aws_caller_identity.current.account_id}"
current_api_id = "${aws_api_gateway_rest_api.rest_api.id}"
}
}
json政策
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:${current_region}:${current_aws_account}:${current_api_id}/*"
}
]
}
当我尝试提供类似于以下操作的资源策略时
错误:周期:module.simple-api-gw.data.template_file.init, module.simple-api-gw.aws_api_gateway_rest_api.rest_api
如何解决此错误?我想在json文件中动态提供api id。
答案 0 :(得分:1)
您正在生成的策略为appropriate to assign to an IAM role or IAM user,以允许他们调用API。将特定策略直接分配给API网关没有任何意义。本质上,您说的是“具有调用API权限的任何人都可以具有调用API的权限”。
策略appropriate for assigning to an API Gateway的作用类似于将请求限制到特定的主体或特定的IP地址。
请参阅上面链接的文档。它概述了两种单独的方法,这些方法用于通过IAM权限或资源策略来控制对API网关的访问。您正在尝试将IAM权限分配为资源策略,该策略将无法正常工作。
答案 1 :(得分:0)
问题是您正在尝试在创建资源时引用该资源的输出。您无需为策略中的资源填充执行信息,而可以使用“ execute-api:/ *”代替。