【问题标题】:Terraform : Error with Comply with restrictionsTerraform:遵守限制错误
【发布时间】:2021-02-03 19:34:29
【问题描述】:

在 terraform 中,尝试将 S3 存储桶作为我的 lambda 触发器并授予权限。对于这个用例,创建 S3 资源并尝试在触发逻辑中引用该 lambda 函数。但是当我引用代码失败并出现以下错误时。

# Creating Lambda resource


resource "aws_lambda_function" "test_lambda" {
  filename      = "output/welcome.zip"
  function_name = var.function_name
  role          = var.role_name
  handler       = var.handler_name
  runtime       = var.run_time
}



# Creating s3 resource for invoking to lambda function



resource "aws_s3_bucket" "bucket" {
  bucket = "source-bucktet-testing"
  acl    = "private"

  tags = {
    Name        = "source-bucktet-testing"
    Environment = "Dev"
  }
}


# Adding S3 bucket as trigger to my lambda and giving the permissions


resource "aws_s3_bucket_notification" "aws-lambda-trigger" {
  bucket = "aws_s3_bucket.bucket.id"
  lambda_function {
    lambda_function_arn = "aws_lambda_function.test_lambda.arn"
    events              = ["s3:ObjectCreated:*"]
    filter_prefix       = "file-prefix"
    filter_suffix       = "file-extension"
}
}
resource "aws_lambda_permission" "test" {
  statement_id  = "AllowS3Invoke"
  action        = "lambda:InvokeFunction"
  function_name = "aws_lambda_function.test_lambda.function_name"
  principal = "s3.amazonaws.com"
  source_arn = "arn:aws:s3:::aws_s3_bucket.bucket.id"
}

错误信息:

【问题讨论】:

    标签: amazon-s3 terraform


    【解决方案1】:

    function_name 传递给aws_lambda_function 资源的值无效。 AWS Lambda 函数名称只能包含字母、数字、连字符或下划线,不能包含空格。您需要更改 var.function_name 的值以符合这些限制。

    【讨论】:

    • 感谢您的回复。更改 var.function_name 后也会出现同样的问题。错误:“function_name”不符合限制(“^(arn:[\\w-]+:lambda:)?([az]{2}-(?:[az]+-){1,2 }\\d{1}:)?(\\d{12}:)?(函数:)?([a-zA-Z0-9-]+)(:(\\$LATEST|[ a-zA-Z0-9-]+))?$"): "aws_lambda_function.test_lambda.var.function_name" on main.tf line 78, in resource "aws_lambda_permission" "test": 78: function_name = "aws_lambda_function.test_lambda.var.function_name"
    • 此错误是因为您没有插入 aws_lambda_permission 资源的值。您正在传递文字字符串"aws_lambda_function.test_lambda.function_name",将其更改为"${aws_lambda_function.test_lambda.function_name}" @KarthikeyanRasipalayDurairaj
    • 现在正在解决兼容性问题:警告:仅插值表达式在 main.tf 第 78 行,资源“aws_lambda_permission”“test”:78:function_name =“${aws_lambda_function.test_lambda。 function_name}" Terraform 0.11 及更早版本要求通过插值语法提供所有非常量表达式,但现在已弃用此模式。要消除此警告,请删除此表达式开头的“${ 序列和末尾的 }”序列,只留下内部表达式。
    • 删除"${" 就像它推荐的那样,只留下aws_lambda_function.test_lambda.function_name
    • @KarthikeyanRasipalayDurairaj 如果答案解决了您的问题,请将其标记为已接受。
    【解决方案2】:

    您的var.function_name 必须无效。

    here 与 ARN 一起解释了允许的函数名称格式:

    The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.
    
    Type: String
    
    Length Constraints: Minimum length of 1. Maximum length of 140.
    
    Pattern: (arn:(aws[a-zA-Z-]*)?:lambda:)?([a-z]{2}(-gov)?-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))? 
    

    【讨论】:

    • 在这种情况下,我如何声明而不是下面的语句:unction_name = "aws_lambda_function.test_lambda.var.function_name"。你能建议我吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2021-01-08
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多