如何在s3中存储和检索dynamodb中的照片网址?

时间:2016-03-25 04:34:53

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

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

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

我不知道如何通过NodeJS做到这一点。有人可以解释它如何与Lambda函数一起工作吗?

2 个答案:

答案 0 :(得分:3)

  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 ) );
    
        } );
    
    };
    
  5. 示例:icon - https://s3.amazonaws.com/cerenity/SOResources/favicon.ico

    更新: @agl提醒我,如果您不使用"美国标准"区域,指定的区域将是: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)或列出的其中一种方法

答案 1 :(得分:0)

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

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

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

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

此致