首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用AWS函数从SNS主题触发器读取和复制S3库存数据

用AWS函数从SNS主题触发器读取和复制S3库存数据
EN

Stack Overflow用户
提问于 2019-01-30 01:38:38
回答 1查看 2K关注 0票数 2

我是一名数据分析员,是AWS lambda函数的新手。我有一个s3桶,在这里存储来自数据湖的库存数据,它是使用S3管理选项卡下的库存特性生成的。

因此,假设库存数据(报告)如下所示:

代码语言:javascript
复制
s3://my-bucket/allobjects/data/report-1.csv.gz
s3://my-bucket/allobjects/data/report-2.csv.gz
s3://my-bucket/allobjects/data/report-3.csv.gz

不管文件内容如何,我都为S3://my/allobjects/data/设置了一个事件设置,它在GET或PUT等任何事件中都会通知SNS主题。(由于严格的治理,我无法更改此工作流)

现在,我试图用这个SNS主题创建一个Lambda函数,并简单地将S3库存特性生成的库存报告文件移到下面。

代码语言:javascript
复制
s3://my-bucket/allobjects/data/ 

并将其重新划分如下:

代码语言:javascript
复制
s3://my-object/allobjects/partitiondata/year=2019/month=01/day=29/report-1.csv.gz
s3://my-object/allobjects/partitiondata/year=2019/month=01/day=29/report-2.csv.gz
s3://my-object/allobjects/partitiondata/year=2019/month=01/day=29/report-3.csv.gz

如何使用阅读SNS主题的lambda函数(node.js或python很好)实现这一点?任何帮助都是非常感谢的。

我根据我在网上找到的一些smaple代码尝试过这样的方法,但是没有帮助。

代码语言:javascript
复制
console.log('Loading function');

var AWS = require('aws-sdk');  
AWS.config.region = 'us-east-1';

exports.handler = function(event, context) {  
console.log("\n\nLoading handler\n\n");
var sns = new AWS.SNS();

sns.publish({
    Message: 'File(s) uploaded successfully',
    TopicArn: 'arn:aws:sns:_my_ARN'
}, function(err, data) {
    if (err) {
        console.log(err.stack);
        return;
    }
    console.log('push sent');
    console.log(data);
    context.done(null, 'Function Finished!');  
});
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-30 03:01:52

首选的方法是Amazon事件直接触发AWS函数。但是,由于您不能更改此端口,因此流将是:

  • Amazon事件将向Amazon主题发送消息。
  • AWS函数订阅了SNS主题,因此它被触发并接收来自S3的消息。
  • Lambda函数提取桶和键,然后将S3调用到copy_object()到另一个位置。)没有移动命令。您需要将对象复制到一个新的桶/键中。)

event字段的内容类似于:

代码语言:javascript
复制
{
    "Records": [
        {
            "EventSource": "aws:sns",
            "EventVersion": "1.0",
            "EventSubscriptionArn": "...",
            "Sns": {
                "Type": "Notification",
                "MessageId": "1c3189f0-ffd3-53fb-b60b-dd3beeecf151",
                "TopicArn": "...",
                "Subject": "Amazon S3 Notification",
                "Message": "{\"Records\":[{\"eventVersion\":\"2.1\",\"eventSource\":\"aws:s3\",\"awsRegion\":\"ap-southeast-2\",\"eventTime\":\"2019-01-30T02:42:07.129Z\",\"eventName\":\"ObjectCreated:Put\",\"userIdentity\":{\"principalId\":\"AWS:AIDAIZCFQCOMZZZDASS6Q\"},\"requestParameters\":{\"sourceIPAddress\":\"54.1.1.1\"},\"responseElements\":{\"x-amz-request-id\":\"...",\"x-amz-id-2\":\"..."},\"s3\":{\"s3SchemaVersion\":\"1.0\",\"configurationId\":\"...\",\"bucket\":{\"name\":\"stack-lake\",\"ownerIdentity\":{\"principalId\":\"...\"},\"arn\":\"arn:aws:s3:::stack-lake\"},\"object\":{\"key\":\"index.html\",\"size\":4378,\"eTag\":\"...\",\"sequencer\":\"...\"}}}]}",
                "Timestamp": "2019-01-30T02:42:07.212Z",
                "SignatureVersion": "1",
                "Signature": "...",
                "SigningCertUrl": "...",
                "UnsubscribeUrl": "...",
                "MessageAttributes": {}
            }
        }
    ]
}

因此,需要从Message中提取上传对象的名称。

您可以使用这样的代码:

代码语言:javascript
复制
import json

def lambda_handler(event, context):

    for record1 in event['Records']:
        message = json.loads(record1['Sns']['Message'])

        for record2 in message['Records']:

            bucket = record2['s3']['bucket']['name'])
            key = record2['s3']['object']['key'])

            # Do something here with bucket and key

    return {
        'statusCode': 200,
        'body': json.dumps(event)
    }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54432187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档