amazon-web-services - 无法通过上传到 AWS S3 来触发 AWS Lambda

标签 amazon-web-services amazon-s3 aws-lambda

我正在尝试构建一个 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(如果该值不存在,请选择创建新角色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"
    }
  ]
}

最佳答案

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

  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"
            }
         }
      }
   ]
}

关于amazon-web-services - 无法通过上传到 AWS S3 来触发 AWS Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49693751/

相关文章:

amazon-web-services - 通过awscli和boto3, secret 管理器在EC2中的运行速度极慢

python - S3 的 Django 存储后端

amazon-web-services - AWS API 网关身份验证(Cognito 与自定义授权器)

amazon-web-services - 减少无服务器部署包的大小

amazon-web-services - 模板包含错误。 : Template format error: YAML not well-formed

amazon-web-services - 将 S3 对象 ID 传递给 EC2 实例的最佳方式?

amazon-s3 - 亚马逊 EC2 : Moving an EBS volume snapshot to s3

java - 如何在Alexa Skill + Lambda + Js中使用SSML

amazon-web-services - Elastic Beanstalk 重定向缺少冒号?

ruby-on-rails - Rails – 如何将文件从本地主机导入到 heroku db