【发布时间】:2018-04-06 13:18:57
【问题描述】:
我正在尝试构建一个 Kibana 仪表板,其中包含通过 AWS Kinesis firehose 收集的 twitter 数据,其中数据传递到 S3 存储桶,该存储桶触发 Lambda 函数,该函数将数据传递到 AWS Elastic Search,然后传递到 Kibana。我正在关注这个博客https://aws.amazon.com/blogs/big-data/building-a-near-real-time-discovery-platform-with-aws/
数据正在正确加载到 S3 存储桶中,但它从未到达 Kibana,我相信这是因为 Lambda 函数没有像我希望的那样被 S3 中的事件触发(没有调用或日志)。我认为这是因为我没有正确设置权限。 Lambda函数可以通过测试事件手动调用。
在 Lambda 函数页面上,我选择了一个名为 lambda_s3_exec_role 的现有角色,该角色附加了 AWSLambdaExecute 策略,但我觉得我遗漏了其他更特定于 S3 的内容。我无法在创建 lambda 函数部分的博客中遵循这一行,因为我不认识这些选项:
“10.选择lambda_s3_exec_role(如果该值不存在,选择Create new role S3执行角色)。”
谁能帮我为 Lambda 函数创建适当的角色/策略,或者找出问题所在?
来自我目前拥有的 Lambda 函数的查看权限:
功能政策
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "****",
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "****",
"Condition": {
"ArnLike": {
"AWS:SourceArn": "arn:aws:s3:::****"
}
}
}
]
}
执行角色
{
"roleName": "lambda_s3_exec_role",
"policies": [
{
"document": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:*"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::*"
}
]
},
"name": "AWSLambdaExecute",
"id": "****",
"type": "managed",
"arn": "arn:aws:iam::aws:policy/AWSLambdaExecute"
}
]
}
【问题讨论】:
-
您能否提供权限(查看权限 - 钥匙图标)-> 来自 Lambda UI(AWS 控制台)的功能策略/执行角色?
-
问题确实指向权限。要么 lambda 出现问题,并且您无权将日志发送到 Cloudwatch,要么正如您所说,缺少 S3 权限。不看角色很难说。可以发在这里,或者检查一下是否有S3和CW权限?
-
对我来说权限看起来不错,最后要检查的是 S3 存储桶:属性 ->(高级设置 ->)事件。您可以在那里检查是否附加了正确的 Lambda 以及哪些事件(屏幕截图很有用;))
-
当我导航到 AWSLambdaExecute 策略时,它显示“此策略定义了一些不提供权限的操作、资源或条件。要授予访问权限,策略必须具有具有适用资源或条件的操作.” 并且在显示更多内容时,它对 CloudWatch 日志说“一个或多个操作没有适用的资源。” S3部分没有警告。
-
嗯...也许尝试在 UI 上将某些内容上传到该存储桶并检查 Lambda 日志是否已触发。如果不是 - 肯定是配置有问题。基本上,S3 存储桶事件应该指向该 Lambda,如果 Lambda 有权访问 CloudWatch - 应该会出现日志。您可以通过从 UI 手动调用来 100% 确认 Lambda 有权写入 CloudWatch Logs(事件可能为空 - 仅检查是否会出现一些日志流)
标签: amazon-web-services amazon-s3 aws-lambda