golang aws-sdk-go 之 s3 服务
s3 是 aws 提供的分布式文件服务,价格比较优惠,经常被用来作为日志的持久化存储,大数据处理结果的输入输出等
s3 服务提供命令行工具,可以很方便地上传、下载、删除文件,普通 golang 程序如果需要访问 s3 上文件,一种简单方式可以先将 s3 上文件下载到本地,然后直接访问本地文件即可,但是这种方式需要一个额外的步骤,下载到本地,有额外的运维成本,需要额外的磁盘空间,使用上面不是很灵活,此外,微服务应该尽可能地降低对本地数据的依赖,这种设计也不符合微服务的设计思想
使用 aws-sdk-go 可以直接访问 s3 服务,实现文件的上传和读取
以下使用的代码:https://github.com/hatlonely/hellogolang/blob/master/internal/aws-sdk-go/s3_test.go
创建会话
首先需要创建一个会话,后续的访问都可以通过这个会话进行,如果访问的服务需要授权,也可以在 config 里面指定授权文件
sess := session.Must(session.NewSession(&aws.Config{Region: aws.String(endpoints.ApSoutheast1RegionID),
}))
service := s3.New(sess)
这里必须指定 s3 桶所在的地区
上传文件
fp, err := os.Open("s3_test.go")
So(err, ShouldBeNil)
defer fp.Close()ctx, cancel := context.WithTimeout(context.Background(), time.Duration(30)*time.Second)
defer cancel()_, err = service.PutObjectWithContext(ctx, &s3.PutObjectInput{Bucket: aws.String("hatlonely"),Key: aws.String("test/s3_test.go"),Body: fp,
})
So(err, ShouldBeNil)
使用 PutObjectWithContext
实现文件的上传,这里只能实现文件的上传,不能实现文件的写入,所以只能先将文件写入到本地,然后再整个上传
可以通过 context 设置访问超时时间
下载文件
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(30)*time.Second)
defer cancel()out, err := service.GetObjectWithContext(ctx, &s3.GetObjectInput{Bucket: aws.String("hatlonely"),Key: aws.String("test/s3_test.go"),
})
So(err, ShouldBeNil)
defer out.Body.Close()
scanner := bufio.NewScanner(out.Body)
for scanner.Scan() {Println(scanner.Text())
}
使用 GetObjectWithContext
接口读取文件,文件的内容在 out.Body 中,可以使用 scanner 接口,不断地按行读取文件内容
最后要记得调用 out.Body.Close()
,释放资源
遍历目录
var objkeys []stringctx, cancel := context.WithTimeout(context.Background(), time.Duration(30)*time.Second)
defer cancel()out, err := service.ListObjectsWithContext(ctx, &s3.ListObjectsInput{Bucket: aws.String("hatlonely"),Prefix: aws.String("test/"),
})
So(err, ShouldBeNil)
for _, content := range out.Contents {objkeys = append(objkeys, aws.StringValue(content.Key))
}
Println(objkeys)
大数据一般都是并发输出,每个节点都会输出一个文件,到一个指定的目录下面,所以有时候我们需要去获取一个目录下面到底有哪些文件,可以使用 ListObjectsWithContext
遍历一个目录下所有的文件,这个函数是递归的
var objkeys []stringctx, cancel := context.WithTimeout(context.Background(), time.Duration(30)*time.Second)
defer cancel()err := service.ListObjectsPagesWithContext(ctx, &s3.ListObjectsInput{Bucket: aws.String("hatlonely"),Prefix: aws.String("test/"),
}, func(output *s3.ListObjectsOutput, b bool) bool {for _, content := range output.Contents {objkeys = append(objkeys, aws.StringValue(content.Key))}return true
})
So(err, ShouldBeNil)
Println(objkeys)
也可以使用 ListObjectsPagesWithContext
传入一个回调函数,用于处理每个文件
参考链接
- aws-sdk-go:https://github.com/aws/aws-sdk-go
- aws-sdk-go api:https://docs.aws.amazon.com/sdk-for-go/api/
转载请注明出处
本文链接:http://hatlonely.github.io/2018/03/04/golang-aws-sdk-go-%E4%B9%8B-s3-%E6%9C%8D%E5%8A%A1/
golang aws-sdk-go 之 s3 服务相关推荐
- aws s3 php,Amazon S3 预签名 POSTs 与 AWS SDK for PHP 版本 3 - 适用于 PHP 的 AWS 开发工具包...
AWS 文档中描述的 AWS 服务或功能可能因区域而异.要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门. 本文属于机器翻译版本.若本译文内容与英语原文存在差异,则一律以英文原文为准. Am ...
- Node.js 和 AWS S3 服务实现的在线文件存储系统
Node.js 和 AWS S3 服务实现的在线文件存储系统 一. 安装依赖 在开始之前,需要确保 Node.js 和 npm 已经安装在你的计算机上.然后在命令行中运行以下命令安装依赖: npm i ...
- Unity接入AWS S3过程,AWS SDK for Unity 踩坑记录
AWS S3,亚马逊的资源服务器服务,最近在研究这一块内容.记录一下踩坑的内容. 研究了AWS SDK for unity和AWS SDK for .net 两部分 unity很难接,主要原因是官方没 ...
- 树莓派Zero W发布;亚马逊 AWS S3 服务出现故障 | IoT黑板报
树莓派Zero W发布,配有Wi-Fi和蓝牙售价10美元 @cnBeta 为了庆祝树莓派的第五个生日,树莓派基金会推出了树莓派Zero W,它本质上是树莓派Zero ,但是添加了许多用户一直要求的功能 ...
- Spring Boot项目集成AWS SDK连接到AWS S3,实现上传下载功能
本文主要描写在Spring Boot项目里集成AWS SDK连接到AWS S3,实现上传下载功能的具体代码和注意事项.如有不足和错误之处,欢迎指正. AWS S3相关介绍 AWS S3(官网): ht ...
- java对接上传AWS的S3服务
话不多说上干货 首先需要引入aws的maven包 <dependency><groupId>com.amazonaws</groupId><artifactI ...
- 使用docker 搭建 ceph 开发环境,使用aws sdk 存储数据
本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/79553386 1,关于ceph Ceph是加州大学Santa Cruz分校的Sa ...
- aws搭建java项目_开发人员指南 - AWS SDK for Java 1.x - 适用于 Java 的 AWS 开发工具包...
本文属于机器翻译版本.若本译文内容与英语原文存在差异,则一律以英文原文为准. 开发人员指南 - AWS SDK for Java 1.x 适用于 Java 的 AWS 开发工具包为 Amazon We ...
- AWS SDK for Java 2.0 使用的基础入门
背景 AWS SDK for Java提供适用于 Amazon Web Services 的 Java API.利用此开发工具包,开发者可以轻松构建使用 Amazon S3.Amazon EC2.Dy ...
- php 5.4 aws,使用 Amazon EC2 管理 AWS SDK for PHP 实例 - 适用于 PHP 的 AWS 开发工具包
AWS 文档中描述的 AWS 服务或功能可能因区域而异.要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门. 本文属于机器翻译版本.若本译文内容与英语原文存在差异,则一律以英文原文为准. 使用 ...
最新文章
- Centos7 搭建 k8s 环境教程,一次性成功
- Swfit Array 遍历 map flatMap filter reduce
- MonoRail学习-介绍篇(一)
- linux打开anaconda的jupyter_Linux Centos7安装anaconda3和jupyter
- 数据类型(简单数据类型、简单数据类型传参、复杂数据类型传参)
- ECS Linux 服务器解除ssh登陆后被锁定或暂停输入输出的终端
- Leetcode 242.有效的字母异位词 By Python
- ping命令两种返回信息的区别
- 大雁塔尺寸_西安容易被误解的两座建筑 不是只有大小之分 游客来了才知道原因...
- Safari兼容IE
- 芭比Q了,腰间盘给整突出了
- 工字型钢弹性截面模量计算公式_截面模量计算方法
- R语言使用dplyr包进行数据聚合统计计算滑动窗口统计值(Window Statistics)、计算滑动分组四分位差(IQR、四分位距)并合并生成的统计数据到原数据集中
- 增量式(相对式)编码器与绝对式编码器工作原理
- centos8 处理挖矿程序攻击
- SIP开源项目opensip,Freeswitch
- 项目七总结 创建于使用触发器
- R-VQA: Learning Visual Relation Facts with Semantic Attention for Visual Question Answering
- 构建岗位胜任力模型至关重要
- 跨模态学习能力再升级,EasyNLP 电商文图检索效果刷新 SOTA