我試圖從 local.tf 獲取函式名稱的值,但我無法獲取它。我有 terraform,tfvars,其中我給出了函式名稱,然后將其傳遞給 variable.tf。從 varibale.tf 我將它傳遞給 local.tf 然后傳遞給 main.tf。我無法在 main.tf 中獲取函式名稱。任何幫助,將不勝感激。terraform.tfvars
config = {
s3= {
//s3 configurations
}
s3_notifications = {
function_name = "test-lambda-mary"
}
}
變數.tf
variable "config" {
type = any
description = "S3 configuration block"
}
本地檔案
function_name = {
for k, v in var.config :
k => lookup(v, "function_name", "")
}
module "all_notifications" {
source = "terraform-aws-modules/s3-bucket/aws//modules/notification"
for_each = var.config
bucket = module.s3_bucket[each.key].this_s3_bucket_id
lambda_notifications = {
lambda = {
function_name = local.function_name[each.key]
function_arn = "arn:aws:lambda:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:function:${local.function_name[each.key]}"
events = ["s3:ObjectCreated:*"]
}
}
}
錯誤
"function_name" doesn't comply with restrictions ("^(arn:[\\w-] :lambda:)?([a-z]{2}-(?:[a-z] -){1,2}\\d{1}:)?(\\d{12}:)?(function:)?([a-zA-Z0-9-_] )(:(\\$LATEST|[a-zA-Z0-9-_] ))?$"): ""
│
│ with module.all_notifications["s3"].aws_lambda_permission.allow["lambda"],
│ on .terraform/modules/all_notifications/modules/notification/main.tf line 63, in resource "aws_lambda_permission" "allow":
│ 63: function_name = each.value.function_name
uj5u.com熱心網友回復:
如果我將 function_name 放在 s3 大括號內,它絕對可以正常作業,但我需要在 s3_notification 中有功能名稱
這看起來是一個很好的提示。您正在迭代var.config哪個有 2 個鍵,其中只有 1 個已function_name定義。因此,當請求模塊s3作為鍵時,該function_value鍵的 將為空字串,AWS 將按預期失敗請求。
您可以過濾for_each = var.config以排除這種情況,例如:
for_each = { for k, v in var.config: k => v if local.function_name[each.key] != ""}
小吹毛求疵:好像模塊的源代碼可能寫錯了。而不是terraform-aws-modules/s3-bucket/aws//modules/notification潛在的它應該是terraform-aws-modules/terraform-aws-s3-bucket//modules/notification。見https://github.com/terraform-aws-modules/terraform-aws-s3-bucket
uj5u.com熱心網友回復:
因為我以前沒有使用過那個模塊,所以在黑暗中刺傷。
但是通過查看您的錯誤訊息:
"function_name" doesn't comply with restrictions ("^(arn:[\\w-] :lambda:)?
看起來function_name您應該傳遞 Lambda 的 ARN,而不是名稱(與變數名稱所說的相反)。
順便說一句,function_arn這里甚至是一個引數嗎?
uj5u.com熱心網友回復:
出現此錯誤是因為 terraform 模塊需要一個有效且強制的函式名稱來[aws_lambda_permission][1]使用module.js 創建資源terraform-aws-modules/s3-bucket/aws//modules/notification。
在您的情況下,您正在回圈var.config包含 s3 和 s3_notifications 部分的模塊,并且在第一次迭代時其獲取函式名稱為 null 因此它拋出此錯誤。
"function_name" doesn't comply with restrictions ("^(arn:[\\w-] :lambda:)?([a-z]{2}-(?:[a-z] -){1,2}\\d{1}:)?(\\d{12}:)?(function:)?([a-zA-Z0-9-_] )(:(\\$LATEST|[a-zA-Z0-9-_] ))?$"): ""
更好地將特定于 s3_notification 的變數拆分為串列,并使用計數迭代模塊,如下所示。
variable "s3_config" {
type = any
default = {
s3 = {
}
}
}
variable "s3_notify_lambda_func" {
type = list
default = ["test-lambda-mary","test"]. #N Numbers of functions
}
data "aws_region" "current" {}
data "aws_caller_identity" "current" {}
module "all_notifications" {
source = "terraform-aws-modules/s3-bucket/aws//modules/notification"
count = length(var.s3_notify_lambda_func) > 0 ? length(var.s3_notify_lambda_func) : 0
bucket = module.s3_bucket[count.index].this_s3_bucket_id
lambda_notifications = {
lambda = {
function_name = var.s3_notify_lambda_func[count.index]
function_arn = "arn:aws:lambda:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:function:${var.s3_notify_lambda_func[count.index]}"
events = ["s3:ObjectCreated:*"]
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/386940.html
標籤:亚马逊网络服务 亚马逊-s3 aws-lambda 地形
上一篇:S3視頻存盤和流媒體有什么區別?
