• [ 云计算 | AWS 实践 ] 使用 Java 更新现有 Amazon S3 对象


    在这里插入图片描述

    本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。

    本文同步于个人公众号:【云计算洞察

    更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。

    本系列已更新博文:

    一、前言

    Amazon Simple Storage Service(Amazon S3)是一种广泛使用的存储服务,提供了可扩展、安全和持久的对象存储功能。在某些情况下,我们需要更新已存在于 Amazon S3 中的对象。在 S3 中,对象是不可变的,这意味着我们不能直接修改对象的内容。但是,我们可以通过覆盖对象内容的方式来有效地“更新”它。

    本篇文章将介绍如何使用 AWS Java SDK,将位于同一 AWS S3 路径下的现有文件内容替换为新内容。

    二、前期准备

    2.1 导入Maven 依赖

    首先,我们需要确保AWS SDK Maven依赖包已合并到项目中,让我们创建一个新的 Java 项目并将以下 Maven 依赖项添加到 pom.xml 文件中:

    <dependency>
        <groupId>software.amazon.awssdkgroupId>
        <artifactId>s3artifactId>
        <version>2.21.0version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.1 准备几个必要信息

    要使用AWS SDK,我们需要以下几个要素:

    AWS 帐户:首先,需要一个Amazon Web Services(AWS)帐户。如果尚未拥有,可直接在 AWS 控制台创建。

    AWS 安全凭证:这些安全凭证是我们访问 AWS API 操作所需的访问密钥。可通过两种方式获取:使用 AWS 根帐户凭证中的“安全凭证”页面,或在 IAM 控制台中获取 IAM 用户凭证。

    选择AWS区域(Region):同时需要选择一个 AWS 区域来存储 Amazon S3 数据。需注意,S3 存储价格因区域不同而异。详细信息可参考官方文档(点击这里)。

    三、更新 S3 对象的步骤

    3.1.初始化 S3 客户端

    首先,我们需要创建客户端连接来访问 Amazon S3 Web 服务。为此,我们将使用 AmazonS3 接口:

    无论是你怎么写,都要先初始化 S3 客户端对象,之后在进行操作即可,记住这个步骤。

    AWSCredentials credentials = new BasicAWSCredentials(
            "AWS AccessKey",
            "AWS secretKey"
    );
    
    • 1
    • 2
    • 3
    • 4

    然后我们将配置客户端:

    AmazonS3 s3client = AmazonS3ClientBuilder.standard()
            .withRegion(Regions.fromName("us-east-1"))
            .withCredentials(new AWSStaticCredentialsProvider(credentials))
            .build();
    
    • 1
    • 2
    • 3
    • 4

    3.2 将新对象上传到 S3

    现在我们可以使用 AWS Java SDK 在方法 putObject() 中将文件上传到 S3 存储桶:

    PutObjectRequest request = PutObjectRequest.builder()
        .bucket(bucketName)
        .key(key)
        .build();
    
    return s3Client.putObject(request, Path.of(file.toURI()));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    下面是调用上述代码的代码片段:

    s3Service.putObject(
        AWS_BUCKET,
        "Document/helloWord.txt",
        new File("/Users/bluetata/Document/helloWord.txt")
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.3 上传(覆盖)对象

    由于 S3 中的对象是不可变的,因此“更新”对象涉及用新内容覆盖该对象。因此,为了更新,我们需要使用与添加文档相同的参数集来调用相同的putObject()方法:

    public PutObjectResponse updateObject(String bucketName, String key, java.io.File file) {
        return this.putObject(bucketName, key, file);
    }
    
    • 1
    • 2
    • 3

    此代码将用提供的新内容替换现有对象。如果具有给定键的对象不存在,S3 将创建一个新对象

    3.4 验证更新

    我们可能想要验证对象是否已成功更新。实现此目的的一种方法是检索对象的元数据并检查lastModified日期,或者计算对象的校验和并将其与预期值进行比较。

    HeadObjectRequest req = HeadObjectRequest.builder()
        .bucket(bucketName)
        .key(key)
        .build();
    
    HeadObjectResponse response = s3Client.headObject(request);
    System.out.println("Last Modified: " + response.lastModified());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    四、注意事项(重要)

    需要牢记的是,在 S3 中,覆盖对象实际上是一次PUT操作,这可能会导致成本增加。在进行 S3 操作时,请时刻注意成本影响。

    如果存储桶启用了版本控制,覆盖对象不会删除旧版本,而是会创建该对象的新版本。因此,我们会拥有对象的多个版本,每个版本都有独特的 ID。在需要时,我们可以检索任何以前的版本。

    最后,如果元数据与该对象关联,请注意覆盖该对象将使用 PUT 操作期间提供的新元数据替换旧元数据。如果我们想保留旧的元数据,我们必须在请求中显式设置它。

    五、文末总结

    虽然我们不能直接修改 S3 对象的内容,但是利用适用于 Java 的 AWS 开发工具包,可以轻松地用新内容覆盖对象。务必牢记的是:比如避免硬编码凭据以及了解操作可能带来的成本影响。通过这些步骤,我们能够自信地使用 Java 对 S3 对象进行管理和更新。

    文末已经更新了 4 篇关于在 AWS 中各种操作 S3 的博文,希望对你有所帮助,更多博文敬请关注本博客。

    [ 本文作者 ]   bluetata
    [ 原文链接 ]   https://bluetata.blog.csdn.net/article/details/134498219
    [ 最后更新 ]   11/20/2023 2:08
    [ 版权声明 ]   如果您在非 CSDN 网站内看到这一行,
    说明网络爬虫可能在本人还没有完整发布的时候就抓走了我的文章,
    可能导致内容不完整,请去上述的原文链接查看原文。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    推荐系统实践读书笔记-06利用社交网络数据
    Spring AOP案例:测试业务层接口万次执行效率
    无往不利,最大利益
    Unity图形节点插件xNode简单使用说明
    虹科分享 | 如何将工程从CANoe转移到CanEasy?
    STL库--stack
    020python-类与对象
    深入浅出数据结构二叉树
    手写一个泛型双向链表
    leetcode-62.不同路径
  • 原文地址:https://blog.csdn.net/dietime1943/article/details/134498219