AWS S3事件 - 客户端标识

时间:2017-11-19 20:44:57

标签: amazon-web-services amazon-s3 aws-lambda amazon-sns

我希望允许多个客户端将文件上传到S3存储桶(或存储桶)。 S3创建事件将触发将向SNS主题添加消息的通知。这有效,但我在确定如何识别哪个客户端上传文件时遇到问题。我可以通过明确检查上传文件的子文件夹/ S3名称来实现此功能,但我更愿意自动将客户端标识符添加为SNS消息的属性。

这可能吗?我的另一个想法是使用Lambda函数作为中间人来添加属性并将其传递给SNS主题,但是如果可能的话,我还想在没有Lambda函数的情况下这样做。

2 个答案:

答案 0 :(得分:5)

从S3发送到SNS的Event Message Structure包含一个字段:

     "userIdentity":{  
        "principalId":"Amazon-customer-ID-of-the-user-who-caused-the-event"
     },

但是,这还取决于上传对象时使用的凭据:

  • 如果用户拥有个人AWS凭证,则会提供访问密钥
  • 如果您使用预签名网址允许上传,则访问密钥将属于预签名网址和您的应用程序(生成预签名)中使用的密钥URL)将负责跟踪请求上传的用户
  • 如果您为每个客户生成临时凭证(例如,通过调用AssumeRole,则会返回角色的ID

(我没有测试上述所有情况,所以请测试它们以确认 Amazon-customer-of-the-user-who-cause-the-event 的定义。)

如果您的目标是在邮件中添加您自己的客户端标识符,那么最好的方法是:

  • 配置事件通知以触发Lambda函数
  • 您的Lambda函数使用上述标识符来确定应用程序中的哪个用户标识符触发了通知(可能是咨询应用程序用户信息的数据库)
  • Lambda函数将消息发送给SNS或您希望接收消息的系统(如果您直接发送,可能不需要SNS)

答案 1 :(得分:0)

您可以在上传文件之前将用户定义的元数据添加到文件中:

private final static String CLIENT_ID = "client-id";

ObjectMetadata meta = new ObjectMetadata();
meta.addUserMetadata(CLIENT_ID, "testid");
s3Client.putObject(<bucket>, <objectKey>, <inputstream of the file>, meta);

然后下载S3文件时:

ObjectMetadata meta = s3Client.getObjectMetadata(<bucket>, <objectKey>);
String clientId = meta.getUserMetaDataOf(CLIENT_ID);

希望这就是你要找的东西。