【问题标题】:AWS S3 Event - Client IdentificationAWS S3 事件 - 客户识别
【发布时间】:2017-11-19 20:44:56
【问题描述】:
我希望允许多个客户端可以将文件上传到 S3 存储桶(或多个存储桶)。 S3 创建事件将触发一个通知,该通知会将消息添加到 SNS 主题。这可行,但我在决定如何识别哪个客户端上传文件时遇到问题。我可以通过显式检查上传文件的子文件夹/S3 名称来实现此功能,但我更愿意自动将客户端标识符作为属性添加到 SNS 消息中。
这可能吗?我的另一个想法是使用 Lambda 函数作为中间人来添加属性并将其传递给 SNS 主题,但如果可能的话,我想再次不使用 Lambda 函数。
【问题讨论】:
标签:
amazon-web-services
amazon-s3
aws-lambda
amazon-sns
【解决方案1】:
从 S3 发送到 SNS 的Event Message Structure 包含一个字段:
"userIdentity":{
"principalId":"Amazon-customer-ID-of-the-user-who-caused-the-event"
},
不过,这也取决于上传对象时使用的凭据:
- 如果用户拥有他们的个人 AWS 凭证,则将提供访问密钥
- 如果您使用 预签名 URL 来允许上传,则访问密钥将属于预签名 URL 和您的应用程序(生成预签名URL) 将负责跟踪请求上传的用户
- 如果您正在为每个客户端生成临时凭据(例如通过调用AssumeRole,那么将返回角色的 ID
(以上所有案例我都没有测试过,所以请大家测试一下确认Amazon-customer-ID-of-the-user-who-caused-the-event的定义 .)
如果您的目标是将您自己的客户端标识符放入消息中,那么最好的方法是:
- 配置事件通知以触发 Lambda 函数
- 您的 Lambda 函数使用上述标识符来确定您的应用程序中的哪个用户标识符触发了通知(可能是查阅应用程序用户信息数据库)
- Lambda 函数将消息发送到 SNS 或您希望接收消息的任何系统(如果您直接发送,则可能不需要 SNS)
【解决方案2】:
您可以在上传文件之前将用户定义的元数据添加到文件中,如下所示:
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);
希望这是您正在寻找的。p>