使用Ruby和lambda打印s3 bucket上载对象密钥?
以下是aws lambda为s3事件提供的测试示例:使用Ruby和lambda打印s3 bucket上载对象密钥?,ruby,amazon-web-services,amazon-s3,aws-lambda,aws-sdk,Ruby,Amazon Web Services,Amazon S3,Aws Lambda,Aws Sdk,以下是aws lambda为s3事件提供的测试示例: { "Records": [ { "eventVersion": "2.0", "eventSource": "aws:s3", "awsRegion": "us-east-2", "eventTime": "1970-01-01T00:00:00.000Z", "eventName": "ObjectCreated:Put", "userIdentity":
{
"Records": [
{
"eventVersion": "2.0",
"eventSource": "aws:s3",
"awsRegion": "us-east-2",
"eventTime": "1970-01-01T00:00:00.000Z",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "EXAMPLE"
},
"requestParameters": {
"sourceIPAddress": "127.0.0.1"
},
"responseElements": {
"x-amz-request-id": "EXAMPLE123456789",
"x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
},
"s3": {
"s3SchemaVersion": "1.0",
"configurationId": "testConfigRule",
"bucket": {
"name": "example-bucket",
"ownerIdentity": {
"principalId": "EXAMPLE"
},
"arn": "arn:aws:s3:::example-bucket"
},
"object": {
"key": "test/key",
"size": 1024,
"eTag": "0123456789abcdef0123456789abcdef",
"sequencer": "0A1B2C3D4E5F678901"
}
}
}
]
}
我特别想知道,如何打印对象:key:
特别是“测试/按键”
我尝试过这种方法和其他几种方法,但都没有成功:
require 'json'
require 'aws-sdk-elastictranscoder'
require "aws-sdk-s3"
def lambda_handler(event:, context:)
src_bkt = "example-bucket"
src_key = event.Records[0].s3.object.key
s3.getObject({
Bucket: src_bkt,
Key: src_key
})
# TODO implement
{ statusCode: 200, body: JSON.generate(src_key) }
end
我得到的响应是失败的响应,如下所示:
Response:
{
"errorMessage": "undefined method `Records' for #<Hash:0x0000561d9afa6618>",
"errorType": "Function<NoMethodError>",
"stackTrace": [
"/var/task/lambda_function.rb:7:in `lambda_handler'"
]
}
record = event["Records"][0]
key = record.dig *%w(s3 object key)
但我在puts/print中添加了如下内容:
put(解析[“记录”][“对象”][“键”])
我会遇到如下错误:
“errorMessage”:“没有将字符串隐式转换为整数”
如果您执行以下操作,该怎么办:
Response:
{
"errorMessage": "undefined method `Records' for #<Hash:0x0000561d9afa6618>",
"errorType": "Function<NoMethodError>",
"stackTrace": [
"/var/task/lambda_function.rb:7:in `lambda_handler'"
]
}
record = event["Records"][0]
key = record.dig *%w(s3 object key)
我认为,您之所以感到困惑,是因为
event
对象是一个散列,其中包含一个包含所有事件记录的数组的keyRecords
。因此,您可以不转换为JSON,而是将记录取出(第一行),然后使用散列的dig
方法访问密钥(我发现在遍历AWS事件记录散列时非常方便) 为什么要像访问对象上的方法一样访问哈希值?您使用的是额外的东西吗?我试图定义“object”:{“key”:“test/key”,
因此,我可以使用该名称在文件上载上创建水印。我已成功使用lambda来完成此操作,但我不知道如何识别从s3上载创建触发器的文件。我需要在s3存储桶中定义一个文件,以便在该文件上创建水印。因此,我正在测试如何识别y键,因此我可以使用它作为文件名,因为数据的表示方式不同,它不是parse[:Records][0][:s3][:object][:key]
(或者parse['Records'][0]['s3']['object']['key'])吗
?不久前,我就开始使用准确的代码,只是使用了双引号。但是现在lambda循环。所以现在我需要弄清楚,这比我之前使用的代码要少。现在我的问题是lambda由于相同的文件上传和反复触发lambda而不断循环。你认为呢是打破循环的好方法……现在,唯一不好的是我使用的是活动存储,因此存储桶需要保持不变。@uno您是否仅在lambda最初上传时尝试触发它,而不是每次更新它?它在PUT上工作,当我更改为POST时,什么也没有发生。因此,用户上传视频时,视频水印是无效的应用,它循环…它希望它在应用水印后停止。我想做POST可以解决这个问题,但它甚至不会触发,除非是on PUT?@uno根据文档,不同的PUT和POST事件类型来自不同的API,可用于访问S3对象。如果您遇到问题,因为您正在重写同一个文件,如果您尝试对项目进行版本控制,并且仅在文件具有特定版本时处理请求,该怎么办?您能举例说明您的意思吗?您是说,只允许例如:.mov文件,然后在.mp4中输出该文件?这样它就不会循环?