Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services AWS S3事件-客户端标识_Amazon Web Services_Amazon S3_Aws Lambda_Amazon Sns - Fatal编程技术网

Amazon web services AWS S3事件-客户端标识

Amazon web services AWS S3事件-客户端标识,amazon-web-services,amazon-s3,aws-lambda,amazon-sns,Amazon Web Services,Amazon S3,Aws Lambda,Amazon Sns,我希望允许多个客户端可以将文件上传到一个S3存储桶(或多个存储桶)。s3create事件将触发一个通知,向SNS主题添加消息。这是可行的,但我在决定如何识别哪个客户端上传了文件时遇到了问题。我可以通过显式检查上传文件的子文件夹/S3名称来实现这一点,但我更愿意自动将客户机标识符作为属性添加到SNS消息中 这可能吗?我的另一个想法是使用Lambda函数作为中间人来添加属性并将其传递给SNS主题,但是如果可能的话,我还是希望不使用Lambda函数来添加属性。从S3发送到SNS的消息包括一个字段:

我希望允许多个客户端可以将文件上传到一个S3存储桶(或多个存储桶)。s3create事件将触发一个通知,向SNS主题添加消息。这是可行的,但我在决定如何识别哪个客户端上传了文件时遇到了问题。我可以通过显式检查上传文件的子文件夹/S3名称来实现这一点,但我更愿意自动将客户机标识符作为属性添加到SNS消息中

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

从S3发送到SNS的消息包括一个字段:

     "userIdentity":{  
        "principalId":"Amazon-customer-ID-of-the-user-who-caused-the-event"
     },
但是,这还取决于上载对象时使用的凭据:

  • 如果用户有自己的个人AWS凭据,则将提供访问密钥
  • 如果您使用预签名URL来允许上载,则访问密钥将属于预签名URL中使用的密钥,并且您的应用程序(生成预签名URL)将负责跟踪请求上载的用户
  • 如果您正在为每个客户端生成临时凭据(例如通过调用),则将返回角色的ID
(我没有测试上述所有案例,所以请测试它们以确认导致事件的用户的Amazon客户ID的定义。)

如果您的目标是将自己的客户端标识符放入消息中,那么最好的方法是:

  • 配置事件通知以触发Lambda函数
  • Lambda函数使用上述标识符来确定应用程序中触发通知的用户标识符(可能是查阅应用程序用户信息数据库)
  • Lambda函数将消息发送到SNS或您希望接收消息的任何系统(如果您直接发送,则可能不需要SNS)
    • 从S3发送到SNS的数据包括一个字段:

           "userIdentity":{  
              "principalId":"Amazon-customer-ID-of-the-user-who-caused-the-event"
           },
      
      但是,这还取决于上载对象时使用的凭据:

      • 如果用户有自己的个人AWS凭据,则将提供访问密钥
      • 如果您使用预签名URL来允许上载,则访问密钥将属于预签名URL中使用的密钥,并且您的应用程序(生成预签名URL)将负责跟踪请求上载的用户
      • 如果您正在为每个客户端生成临时凭据(例如通过调用),则将返回角色的ID
      (我没有测试上述所有案例,所以请测试它们以确认导致事件的用户的Amazon客户ID的定义。)

      如果您的目标是将自己的客户端标识符放入消息中,那么最好的方法是:

      • 配置事件通知以触发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);
      
      private final静态字符串CLIENT\u ID=“CLIENT ID”;
      ObjectMetadata meta=新的ObjectMetadata();
      meta.addUserMetadata(客户端ID,“testid”);
      s3Client.putObject(,,meta);
      
      然后在下载S3文件时:

      ObjectMetadata meta = s3Client.getObjectMetadata(<bucket>, <objectKey>);
      String clientId = meta.getUserMetaDataOf(CLIENT_ID);
      
      ObjectMetadata meta=s3Client.getObjectMetadata(,);
      字符串clientId=meta.getUserMetaDataOf(客户端ID);
      

      希望这就是您要查找的内容。

      您可以在上载文件之前向文件中添加用户定义的元数据,如下所示:

      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);
      
      private final静态字符串CLIENT\u ID=“CLIENT ID”;
      ObjectMetadata meta=新的ObjectMetadata();
      meta.addUserMetadata(客户端ID,“testid”);
      s3Client.putObject(,,meta);
      
      然后在下载S3文件时:

      ObjectMetadata meta = s3Client.getObjectMetadata(<bucket>, <objectKey>);
      String clientId = meta.getUserMetaDataOf(CLIENT_ID);
      
      ObjectMetadata meta=s3Client.getObjectMetadata(,);
      字符串clientId=meta.getUserMetaDataOf(客户端ID);
      

      希望这就是您想要的。

      非常感谢!!!这也适用于预签名URL。非常感谢!!!这也适用于预签名URL。