1.aws s3介绍
aws s3(amazon simple storage service)是亚马逊提供的一种对象存储服务,旨在提供可扩展、高可用性和安全的数据存储解决方案。以下是aws s3的一些主要特点和功能:
1.1. 对象存储
- 对象存储模型:s3使用对象存储模型,数据以对象的形式存储在桶(bucket)中。每个对象由数据、元数据和唯一的标识符(键)组成。
- 桶(bucket):桶是存储对象的容器。每个桶都有一个唯一的名称,并且可以在全球范围内访问。
1.2. 高可用性和耐久性
- 耐久性:s3提供99.999999999%(11个9)的数据耐久性,确保数据在多个设施中冗余存储。
- 高可用性:s3设计为具有高可用性,确保用户可以随时访问存储的数据。
1.3. 可扩展性
弹性扩展:s3可以自动扩展以处理任意数量的数据和请求,无需用户进行容量规划。
1.4. 安全性
- 访问控制:s3提供多种访问控制机制,包括桶策略、iam策略和acl(访问控制列表),以确保只有授权用户能够访问数据。
- 加密:支持在传输和静态存储时对数据进行加密,提供多种加密选项,包括服务器端加密(sse)和客户端加密。
1.5. 数据管理和分析
- 版本控制:s3支持对象版本控制,允许用户保留和恢复对象的多个版本。
- 生命周期管理:用户可以设置生命周期规则,以自动转移或删除不再需要的数据。
- 事件通知:s3可以配置事件通知,以便在对象创建、删除等操作时触发lambda函数、sns通知等。
1.6. 集成和兼容性
- 与其他aws服务集成:s3与aws的其他服务(如ec2、lambda、cloudfront等)无缝集成,支持数据分析、备份、内容分发等多种场景。
- 兼容性:s3兼容restful api,支持多种编程语言和sdk,方便开发者进行集成和使用。
1.7. 使用场景
- 备份和恢复:用于数据备份和恢复解决方案。
- 静态网站托管:可以托管静态网站,支持自定义域名和https。
- 大数据分析:用于存储和分析大数据集,支持与aws glue、amazon athena等服务集成。
- 媒体存储:用于存储和分发音频、视频和图像等媒体文件。
1.8. 定价
按需计费:s3采用按需计费模式,用户只需为实际使用的存储空间和请求付费。定价根据存储类型、数据传输和请求数量等因素而异。
2.aws的访问密钥(access key)和秘密密钥(secret key)
要获取aws的访问密钥(access key)和秘密密钥(secret key),请按照以下步骤操作:
2.1. 登录到aws管理控制台
访问 aws管理控制台 并使用你的aws账户登录。
2.2. 访问iam(身份与访问管理)
- 在控制台主页,找到并点击“iam”服务。
- 在左侧菜单中,选择“用户”。
2.3. 创建新用户(如果需要)
如果你还没有用户,或者想为特定的应用创建一个新用户,可以按照以下步骤创建:
- 点击“添加用户”。
- 输入用户名,并选择“编程访问”选项。
- 点击“下一步:权限”。
2.4. 设置权限
你可以选择将用户添加到现有的用户组,或者直接为用户附加权限策略。
如果你只需要s3的访问权限,可以选择“创建策略”,并使用以下json示例来创建一个只允许访问s3的策略:
{ "version": "2012-10-17", "statement": [ { "effect": "allow", "action": "s3:", "resource": "" } ] }
完成后,点击“下一步:标签”,然后点击“下一步:查看”。
确认信息无误后,点击“创建用户”。
2.5. 获取访问密钥和秘密密钥
- 创建用户后,你将看到一个成功页面,其中包含“访问密钥 id”和“秘密访问密钥”。
- 注意:秘密访问密钥只会在此时显示一次,请务必将其安全保存。如果丢失,你需要重新生成密钥。
2.6. 配置密钥
将获取到的“访问密钥 id”和“秘密访问密钥”填入你的application.properties
文件中:
cloud.aws.credentials.access-key=your_access_key cloud.aws.credentials.secret-key=your_secret_key
2.7. 安全性注意事项
- 不要将密钥硬编码:在生产环境中,建议使用环境变量或aws secrets manager来管理密钥。
- 最小权限原则:只授予用户所需的最小权限,以降低安全风险。
- 定期轮换密钥:定期更换访问密钥以增强安全性。
通过以上步骤,你就可以获取aws的访问密钥和秘密密钥,并在spring boot应用中进行配置。
3.代码工程
要在spring boot应用中对接aws s3服务,实现文件的上传和查询,你可以按照以下步骤进行:
3.1. 添加依赖
在你的pom.xml
中添加aws sdk的依赖:
<?xml version="1.0" encoding="utf-8"?> <project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactid>springboot-demo</artifactid> <groupid>com.et</groupid> <version>1.0-snapshot</version> </parent> <modelversion>4.0.0</modelversion> <artifactid>aws-s3</artifactid> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-autoconfigure</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> <scope>test</scope> </dependency> <dependency> <groupid>com.amazonaws</groupid> <artifactid>aws-java-sdk-s3</artifactid> <version>1.12.300</version> <!-- 请根据需要选择合适的版本 --> </dependency> </dependencies> </project>
3.2. 配置aws凭证
你可以通过环境变量、系统属性或配置文件来配置aws凭证。以下是使用application.properties
的示例:
cloud.aws.credentials.access-key=xxxx cloud.aws.credentials.secret-key=xxxx cloud.aws.region.static=xxx cloud.aws.s3.bucket=xxx proxy.host=127.0.0.1 proxy.port=1080
3.3. 创建s3配置类
创建一个配置类来初始化s3客户端:
package com.et.aws.config; import com.amazonaws.clientconfiguration; import com.amazonaws.auth.awsstaticcredentialsprovider; import com.amazonaws.auth.basicawscredentials; import com.amazonaws.client.builder.awsclientbuilder; import com.amazonaws.services.s3.amazons3; import com.amazonaws.services.s3.amazons3clientbuilder; import org.springframework.beans.factory.annotation.value; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import java.net.inetsocketaddress; import java.net.proxy; @configuration public class s3config { @value("${cloud.aws.credentials.access-key}") private string accesskey; @value("${cloud.aws.credentials.secret-key}") private string secretkey; @value("${cloud.aws.region.static}") private string region; @value("${proxy.host:}") // 代理主机 private string proxyhost; @value("${proxy.port:}") // 代理端口 private int proxyport; @bean public amazons3 amazons3() { basicawscredentials awscredentials = new basicawscredentials(accesskey, secretkey); amazons3clientbuilder builder = amazons3clientbuilder.standard() .withregion(region) .withcredentials(new awsstaticcredentialsprovider(awscredentials)); // 如果代理主机和端口不为空,则配置代理 if (!proxyhost.isempty() && proxyport > 0) { proxy proxy = new proxy(proxy.type.http, new inetsocketaddress(proxyhost, proxyport)); builder.withclientconfiguration(new clientconfiguration().withproxyhost(proxyhost).withproxyport(proxyport)); } return builder.build(); } }
3.4. 实现文件上传和查询功能
创建一个服务类来处理文件的上传和查询:
package com.et.aws.service; import com.amazonaws.services.s3.amazons3; import com.amazonaws.services.s3.model.objectlisting; import com.amazonaws.services.s3.model.s3objectsummary; import org.springframework.beans.factory.annotation.autowired; import org.springframework.beans.factory.annotation.value; import org.springframework.stereotype.service; import org.springframework.web.multipart.multipartfile; import java.io.ioexception; import java.io.inputstream; import java.util.arraylist; import java.util.list; @service public class s3service { @autowired private amazons3 amazons3; @value("${cloud.aws.s3.bucket}") private string bucketname; public string uploadfile(multipartfile file) throws ioexception { string filename = file.getoriginalfilename(); inputstream inputstream = file.getinputstream(); amazons3.putobject(bucketname, filename, inputstream, null); return filename; } public list<string> listfiles() { objectlisting objectlisting = amazons3.listobjects(bucketname); list<string> filenames = new arraylist<>(); for (s3objectsummary objectsummary : objectlisting.getobjectsummaries()) { filenames.add(objectsummary.getkey()); } return filenames; } }
3.5. 创建控制器
创建一个控制器来处理http请求:
package com.et.aws.controller; import com.et.aws.service.s3service; import org.springframework.beans.factory.annotation.autowired; import org.springframework.http.responseentity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.multipartfile; import java.io.ioexception; import java.util.list; @restcontroller @requestmapping("/api/s3") public class s3controller { @autowired private s3service s3service; @postmapping("/upload") public responseentity<string> uploadfile(@requestparam("file") multipartfile file) { try { string filename = s3service.uploadfile(file); return responseentity.ok("file uploaded: " + filename); } catch (ioexception e) { return responseentity.status(500).body("file upload failed: " + e.getmessage()); } } @getmapping("/files") public responseentity<list<string>> listfiles() { list<string> files = s3service.listfiles(); return responseentity.ok(files); } }
以上只是一些关键代码,所有代码请参见下面代码仓库
代码仓库
github.com/harries/springboot-demo(aws-s3)
4. 测试
启动你的spring boot应用,并使用postman或其他工具测试文件上传和查询功能。
上传文件
发送post请求到/api/s3/upload
,并在请求中附加文件。
查询文件
发送get请求到/api/s3/files
,将返回存储在s3中的文件列表。
注意事项
- 确保你的aws iam用户具有对s3的访问权限。
- 根据需要处理异常和错误情况。
- 你可以根据需要扩展功能,例如文件删除、文件下载等。
通过以上步骤,你就可以在spring boot应用中成功对接aws s3服务,实现文件的上传和查询。
以上就是springboot对接aws s3实现上传和查询的详细内容,更多关于springboot aws s3的资料请关注代码网其它相关文章!
发表评论