如何从 s3 在 dynamodb 中存储和检索照片的 url?

Div*_*a G 3 amazon-s3 amazon-web-services node.js amazon-dynamodb aws-lambda

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

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

我不清楚如何通过 NodeJS 做到这一点。有人可以解释一下它如何与 Lambda 函数一起使用吗?

iSk*_*ore 5

  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 ) );
    
        } );
    
    };
    
    Run Code Online (Sandbox Code Playgroud)

例子:图标- 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"
            }
        ]
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在运行测试,您应该在数据库中看到一条记录 - 如果没有,请继续编辑数据库参数,直到获得正确的结果

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