【问题标题】:Unable to trigger AWS Lambda by upload to AWS S3无法通过上传到 AWS S3 来触发 AWS Lambda
【发布时间】: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


【解决方案1】:

您列出的权限看起来不错,因此我将尝试提供一些可能有助于找到问题的步骤,因为很难具体了解您的问题可能出在哪里。

  1. 执行角色是否与lambda.amazonaws.com的可信实体有信任关系
  2. 您的事件前缀是否与 firehose 中的前缀匹配。在本教程中,它们都是twitter/raw-data/。如果 firehose 正在写入不是事件前缀的路径,则不会调用该事件。
  3. 当你manually invoke它时,lambda 是否会触发任何错误
  4. 当您手动调用 lambda 时,它是否写入日志
  5. 使用虚拟数据测试 lambda(以下示例数据)

命令行

aws lambda invoke \
--invocation-type RequestResponse \
--function-name helloworld \
--region region \
--log-type Tail \
--payload file://dummy_event.json \
--profile adminuser \
outputfile.txt 

示例数据

source

dummy_event.json

{
   "Records":[  
      {  
         "eventVersion":"2.0",
         "eventSource":"aws:s3",
         "awsRegion":"us-west-2",
         "eventTime":"1970-01-01T00:00:00.000Z",
         "eventName":"ObjectCreated:Put",
         "userIdentity":{  
            "principalId":"AIDAJDPLRKLG7UEXAMPLE"
         },
         "requestParameters":{  
            "sourceIPAddress":"127.0.0.1"
         },
         "responseElements":{  
            "x-amz-request-id":"C3D13FE58DE4C810",
            "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD"
         },
         "s3":{  
            "s3SchemaVersion":"1.0",
            "configurationId":"testConfigRule",
            "bucket":{  
               "name":"sourcebucket",
               "ownerIdentity":{  
                  "principalId":"A3NL1KOZZKExample"
               },
               "arn":"arn:aws:s3:::sourcebucket"
            },
            "object":{  
               "key":"HappyFace.jpg",
               "size":1024,
               "eTag":"d41d8cd98f00b204e9800998ecf8427e",
               "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko"
            }
         }
      }
   ]
}

【讨论】:

  • 感谢您的支持 (+1),我已将我正在使用的测试事件添加到问题中。它是 s3:Put 的模板,我稍作修改,但拒绝访问。我在运行测试时看到错误日志和调用。不确定信任关系我会尝试弄清楚如何检查。 Firehose 写入 twitter/raw-data/ 我在那里看到数据。
  • 因为你已经使用 * 来删除你的名字,所以很难确定一些事情。也许用my_bucket 或其他东西替换它。我认为问题在于执行角色的资源,您可能需要arn:aws:s3:::my_bucketarn:aws:s3:::my_bucket/*
  • 当我转到控制台中的执行策略时,它显示“此策略定义了一些不提供权限的操作、资源或条件。要授予访问权限,策略必须具有适用的操作资源或条件。”
  • 查看本指南,了解如何获取有关这些警告的更多信息aws.amazon.com/blogs/security/…
猜你喜欢
  • 2020-02-09
  • 2019-02-26
  • 2018-03-08
  • 1970-01-01
  • 2018-07-12
  • 2020-05-16
  • 2022-06-10
  • 1970-01-01
  • 2018-11-09
相关资源
最近更新 更多