AWS S3 事件 - 客户端识别
AWS S3 Event - Client Identification
我希望允许多个客户端将文件上传到一个(或多个)S3 存储桶。 S3 创建事件将触发一个通知,该通知将向 SNS 主题添加一条消息。这行得通,但我在决定如何确定哪个客户端上传了文件时遇到了问题。我可以通过显式检查上传文件的 subfolder/S3 名称来实现这一点,但我更愿意自动将客户端标识符作为属性添加到 SNS 消息中。
这可能吗?我的另一个想法是使用 Lambda 函数作为中间人来添加属性并将其传递给 SNS 主题,但如果可能的话,我还是希望在没有 Lambda 函数的情况下这样做。
从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)
您可以在上传文件之前将用户定义的元数据添加到您的文件中,如下所示:
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);
希望这就是您要找的。
我希望允许多个客户端将文件上传到一个(或多个)S3 存储桶。 S3 创建事件将触发一个通知,该通知将向 SNS 主题添加一条消息。这行得通,但我在决定如何确定哪个客户端上传了文件时遇到了问题。我可以通过显式检查上传文件的 subfolder/S3 名称来实现这一点,但我更愿意自动将客户端标识符作为属性添加到 SNS 消息中。
这可能吗?我的另一个想法是使用 Lambda 函数作为中间人来添加属性并将其传递给 SNS 主题,但如果可能的话,我还是希望在没有 Lambda 函数的情况下这样做。
从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)
您可以在上传文件之前将用户定义的元数据添加到您的文件中,如下所示:
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);
希望这就是您要找的。