【问题标题】:how to store and retrieve url of photos in dynamodb from s3?如何从 s3 存储和检索 dynamodb 中的照片 url?
【发布时间】:2016-03-26 03:18:23
【问题描述】:

我正在努力在 AWS S3 中存储许多图像。

我需要从 S3 检索 URL 并将其存储在 DynamoDB 中。

我不清楚如何通过 NodeJS 做到这一点。有人能解释一下它是如何与 Lambda 函数一起工作的吗?

【问题讨论】:

  • 是的。研究人员,在论坛提问之前阅读文档!
  • 对于一个问题,您必须发布您已采取的步骤、您尝试过的代码以及您遇到的错误。

标签: node.js amazon-web-services amazon-s3 amazon-dynamodb aws-lambda


【解决方案1】:
  1. 确保您的 S3 存储桶全部设置为您需要的任何东西。不知道你为什么想要这个,但我假设你将它设置为私有或公共。
    • 如果您启用了静态托管,则此处的网址将非常
  2. 导航到 Lambda 并设置您的函数。输入名称、描述等,但在代码字段中不输入任何内容(我们会到达那里)
  3. 设置您的 ram 和权限(必须至少具有基本的 DynamoDB 执行权限
  4. 现在它会加载一秒钟,完成后 - 粘贴此代码

    const
        AWS = require( 'aws-sdk' );
    
    AWS.config.region = 'us-east-1';
    
    exports.handler = function( event, context ) {
    
        var ddb = new AWS.DynamoDB(),
            bucket = event.Records[ 0 ].s3.bucket.name,
            key = event.Records[ 0 ].s3.object.key,
            params = {
                TableName: '[table]',
                Item: {
                    hash: '[hash]',
                    range: '[range]',
                    s3key: 'https://s3.amazonaws.com/' + bucket + '/' + key
                }
            };
    
        console.log( '\n\n{\n    Bucket: ' + bucket + ',\n    Key: ' + key + ',\n    URL: ' + params.Item.s3key + '\n}\n' );
    
        ddb.put( params, function( err, data ) {
    
            // respond with whatever you want
            context.succeed( ( err ) ? JSON.stringify( err, null, 2 ) : JSON.stringify( data, null, 2 ) );
    
        } );
    
    };
    

示例: - https://s3.amazonaws.com/cerenity/SOResources/favicon.ico

更新:@agl提醒我,如果不使用“US-Standard”区域,则指定区域为:https://s3-[here].amazonaws.com/

  1. 填写表格、哈希、范围等信息。
  2. 转到Actions => Configure test event => Sample event template => S3 Put 你应该会看到:

    {
        "Records": [
            {
                "eventVersion": "2.0",
                "eventTime": "1970-01-01T00:00:00.000Z",
                "requestParameters": {
                    "sourceIPAddress": "127.0.0.1"
                },
                "s3": {
                    "configurationId": "testConfigRule",
                    "object": {
                        "eTag": "0123456789abcdef0123456789abcdef",
                        "sequencer": "0A1B2C3D4E5F678901",
                        "key": "HappyFace.jpg",
                        "size": 1024
                    },
                    "bucket": {
                        "arn": "arn:aws:s3:::mybucket",
                        "name": "sourcebucket",
                        "ownerIdentity": {
                            "principalId": "EXAMPLE"
                        }
                    },
                    "s3SchemaVersion": "1.0"
                },
                "responseElements": {
                    "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
                    "x-amz-request-id": "EXAMPLE123456789"
                },
                "awsRegion": "us-east-1",
                "eventName": "ObjectCreated:Put",
                "userIdentity": {
                    "principalId": "EXAMPLE"
                },
                "eventSource": "aws:s3"
            }
        ]
    }
    
  3. 现在运行你的测试,你应该在你的数据库中看到一条记录 - 如果没有,继续编辑你的数据库参数直到你得到正确的结果

    • 确保为分配给此 Lambda 函数的角色设置了所有权限
  4. 一旦成功,转到顶部的Event sources 选项卡并选择+ Add event source => Event source type => S3
  5. 应该会出现一个请求类似 S3 信息的菜单。放入您想要的存储桶,前缀、后缀等等 - 然后选择 Event type => Object Created(All) 或列出的方法之一

【讨论】:

    【解决方案2】:

    您需要创建一个将由S3 put event 调用的 Lambda 函数。一个 Lambda 函数使用 event 详细信息(以及相应的 var 获取 JSON。问题是对象的 URL 不会出现在 JSON 中,但您可以使用 JSON 参数构建 url。url 将是这样的:

    https://s3-region.amazonaws.com/bucket/key

    您可以使用AWSSDK for NodeJS 将此 URL 插入 DynamoDB。弗吉尼亚(美国标准)地区的 URL 格式会有所不同。无论如何,HERE 你有更多信息的链接。

    然后,在 S3 控制台或直接在 Lambda 控制台中的存储桶中创建事件,上传文件并瞧瞧。

    问候

    【讨论】:

    • 不是特别详细,但是是的。这是一个初学者用户,需要完整的演练
    猜你喜欢
    • 2012-09-15
    • 2021-07-04
    • 2016-10-16
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多