![](/img/trans.png)
[英]“KeyError: 'Records'” in AWS S3 - Lambda trigger
[英]Terraform AWS S3 to Lambda Notification Trigger
我正在尝试编写要使用 S3 触发的 lambda 函数。 Lambda 函数的创建成功,但“aws_s3_bucket_notification”资源在terraform:apply
失败,出现MethodNotAllowed
错误, status code 405
:
Error: Error applying plan:
20-Sep-2018 15:23:53 1 error(s) occurred:
20-Sep-2018 15:23:53 * aws_s3_bucket_notification.my-trigger: 1 error(s) occurred:
20-Sep-2018 15:23:53 * aws_s3_bucket_notification.my-trigger: Error putting S3 notification configuration: MethodNotAllowed: The specified method is not allowed against this resource.
20-Sep-2018 15:23:53 status code: 405, request id:<hidden>, host id:<hidden>
这是我设置通知触发器的代码:
resource "aws_s3_bucket_notification" "my-trigger" {
bucket = "my-bucket"
lambda_function {
lambda_function_arn = "${aws_lambda_function.my-function.arn}"
events = ["s3:ObjectCreated:*"]
filter_prefix = "file-prefix"
filter_suffix = "file-extension"
}
}
这是从 S3 触发 Lambda 的权限:
resource "aws_lambda_permission" "s3-lambda-permission" {
statement_id = "AllowExecutionFromS3Bucket"
action = "lambda:InvokeFunction"
function_name = "${aws_lambda_function.my-function.arn}"
principal = "s3.amazonaws.com"
source_arn = "arn:aws:s3:::my-bucket"
}
提前致谢!
所以我尝试了和你一样的设置,
...
// lambda resource
resource "aws_s3_bucket_notification" "my-trigger" {
bucket = "my-bucket"
lambda_function {
lambda_function_arn = "${aws_lambda_function.my-function.arn}"
events = ["s3:ObjectCreated:*"]
filter_prefix = "AWSLogs/"
filter_suffix = ".txt"
}
}
resource "aws_lambda_permission" "test" {
statement_id = "AllowS3Invoke"
action = "lambda:InvokeFunction"
function_name = "${aws_lambda_function.my-function.arn}"
principal = "s3.amazonaws.com"
source_arn = "arn:aws:s3:::my-bucket"
}
...
我的 S3 存储桶策略是这样的:
{
"Version": "2012-10-17",
"Id": "AWSConsole-AccessLogs-Policy-1534800162725",
"Statement": [
{
"Sid": "AWSConsoleStmt-1534800162725",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::my-bucket/AWSLogs/123456789012/*"
}
]
}
并且成功创建了 s3 通知。
所以我认为现在你应该检查两件事:
确保您的 aws_lambda_permission 在您的 s3 通知之前实际创建。 我正在使用 terraform 0.10.2,但以前版本中可能存在错误,因此不会在 s3 通知之前创建此 lambda 权限。
检查您的 s3 存储桶策略。 它可能明确拒绝 lambda 访问。 如果有的话,一定要摆脱那些。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.