输出中每个参考索引的地形



我有一个模块,我使用for_each以编程方式生成几个lambdas。

resource "aws_lambda_function" "profile" {
for_each = local.lambdas
function_name = each.value.lambda_name
role          = var.lambda_assume_role_arn
image_uri     = each.value.ecr_repository_uri
package_type  = "Image"
vpc_config {
security_group_ids = [var.rds_security_group_id]
subnet_ids         = var.subnet_ids
}
}

我需要在output.tf

中导出这两个生成的lambdas
output "aws_lambda_function_pre_sign_up_arn" {
value       = aws_lambda_function.profile[9].arn
}
output "aws_lambda_function_post_confirmation_arn" {
value       = aws_lambda_function.profile[0].arn
}

当我应用时,得到一个错误:

╷
│ Error: Invalid index
│ 
│   on ../modules/services/profile/ouptput.tf line 2, in output "aws_lambda_function_pre_sign_up_arn":
│    2:   value       = aws_lambda_function.profile[9]
│     ├────────────────
│     │ aws_lambda_function.profile is object with 10 attributes
│ 
│ The given key does not identify an element in this collection value. An object only supports looking up attributes by name, not by numeric index.
╵
╷
│ Error: Invalid index
│ 
│   on ../modules/services/profile/ouptput.tf line 7, in output "aws_lambda_function_post_confirmation_arn":
│    7:   value       = aws_lambda_function.profile[0]
│     ├────────────────
│     │ aws_lambda_function.profile is object with 10 attributes
│ 
│ The given key does not identify an element in this collection value. An object only supports looking up attributes by name, not by numeric index.
╵

这里是局部变量的一个片段。一共有10个单位。

locals {
service = "profile"
lambdas = {
assign_default_group = {
lambda_name                  = "${lower(var.company)}-${local.service}-${var.environment}-assign_default_group",
ecr_repository_name          = "${lower(var.company)}/${local.service}/${var.environment}/lambda/assign_default_group",
ecr_repository_uri           = "xxx.dkr.ecr.${var.region}.amazonaws.com/${lower(var.company)}/${local.service}/${var.environment}/lambda/assign_default_group:latest"
lambda_environment_variables = {
RDS_STORAGE_URL      = var.storage_url
COGNITO_USER_POOL_ID = jsondecode(data.aws_secretsmanager_secret_version.profile.secret_string)["cognito_user_pool_id"]
}
},
create_account = {
lambda_name                  = "${lower(var.company)}-${local.service}-${var.environment}-create_account",
ecr_repository_name          = "${lower(var.company)}/${local.service}/${var.environment}/lambda/create_account",
ecr_repository_uri           = "xxx.dkr.ecr.${var.region}.amazonaws.com/${lower(var.company)}/${local.service}/${var.environment}/lambda/create_account:latest"
lambda_environment_variables = {
RDS_STORAGE_URL = var.storage_url
}
},
...

正如在评论中提到的,使用for_each元参数创建的资源索引是不可能的[1]。如果需要使用索引,则应该使用count元参数[2]。如果您决定继续使用for_each,您可以通过以下方式获取所需的输出:

output "aws_lambda_function_pre_sign_up_arn" {
value       = aws_lambda_function.profile["first_key"].arn
}
output "aws_lambda_function_post_confirmation_arn" {
value       = aws_lambda_function.profile["last_key"].arn
}

因为我不知道哪个键是第一个(我猜是assign_default_group),哪个是最后一个(为了示例,让我们使用create_account),上面变成:

output "aws_lambda_function_pre_sign_up_arn" {
value       = aws_lambda_function.profile["assign_default_group"].arn
}
output "aws_lambda_function_post_confirmation_arn" {
value       = aws_lambda_function.profile["create_account"].arn
}

但是根据输出名称,可能有一个名为post_confirmation的键和一个名为pre_sign_up的键,所以您可以使用它们作为键值。

如果您需要为多个Lambda函数获取某个属性(无论是ARN还是其他),您可以执行以下操作:

output "lambda_arns" {
value = {
for k, v in aws_lambda_function.profile : k => v.arn
}
}

这将返回一个键/值对的映射,其中key将再次是来自局部变量lambdas的键,而值将是Lambda函数ARN。

或者,您可以使用values内置函数[3]和splat表达式[4]来仅派生值,返回结果将是一个列表(您可以通过索引值引用元素):

output "lambda_arns" {
value = values(aws_lambda_function.profile)[*].arn
}

可能有更多不同的方法来获取值,但这取决于您想要获得的输出类型。


[1] https://www.terraform.io/language/meta-arguments/for_each referring-to-instances

[2] https://www.terraform.io/language/meta-arguments/count referring-to-instances

[3] https://www.terraform.io/language/functions/values

[4] https://www.terraform.io/language/expressions/splat

最新更新