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 服务相关推荐

  1. aws s3 php,Amazon S3 预签名 POSTs 与 AWS SDK for PHP 版本 3 - 适用于 PHP 的 AWS 开发工具包...

    AWS 文档中描述的 AWS 服务或功能可能因区域而异.要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门. 本文属于机器翻译版本.若本译文内容与英语原文存在差异,则一律以英文原文为准. Am ...

  2. Node.js 和 AWS S3 服务实现的在线文件存储系统

    Node.js 和 AWS S3 服务实现的在线文件存储系统 一. 安装依赖 在开始之前,需要确保 Node.js 和 npm 已经安装在你的计算机上.然后在命令行中运行以下命令安装依赖: npm i ...

  3. Unity接入AWS S3过程,AWS SDK for Unity 踩坑记录

    AWS S3,亚马逊的资源服务器服务,最近在研究这一块内容.记录一下踩坑的内容. 研究了AWS SDK for unity和AWS SDK for .net 两部分 unity很难接,主要原因是官方没 ...

  4. 树莓派Zero W发布;亚马逊 AWS S3 服务出现故障 | IoT黑板报

    树莓派Zero W发布,配有Wi-Fi和蓝牙售价10美元 @cnBeta 为了庆祝树莓派的第五个生日,树莓派基金会推出了树莓派Zero W,它本质上是树莓派Zero ,但是添加了许多用户一直要求的功能 ...

  5. Spring Boot项目集成AWS SDK连接到AWS S3,实现上传下载功能

    本文主要描写在Spring Boot项目里集成AWS SDK连接到AWS S3,实现上传下载功能的具体代码和注意事项.如有不足和错误之处,欢迎指正. AWS S3相关介绍 AWS S3(官网): ht ...

  6. java对接上传AWS的S3服务

    话不多说上干货 首先需要引入aws的maven包 <dependency><groupId>com.amazonaws</groupId><artifactI ...

  7. 使用docker 搭建 ceph 开发环境,使用aws sdk 存储数据

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/79553386 1,关于ceph Ceph是加州大学Santa Cruz分校的Sa ...

  8. aws搭建java项目_开发人员指南 - AWS SDK for Java 1.x - 适用于 Java 的 AWS 开发工具包...

    本文属于机器翻译版本.若本译文内容与英语原文存在差异,则一律以英文原文为准. 开发人员指南 - AWS SDK for Java 1.x 适用于 Java 的 AWS 开发工具包为 Amazon We ...

  9. AWS SDK for Java 2.0 使用的基础入门

    背景 AWS SDK for Java提供适用于 Amazon Web Services 的 Java API.利用此开发工具包,开发者可以轻松构建使用 Amazon S3.Amazon EC2.Dy ...

  10. php 5.4 aws,使用 Amazon EC2 管理 AWS SDK for PHP 实例 - 适用于 PHP 的 AWS 开发工具包

    AWS 文档中描述的 AWS 服务或功能可能因区域而异.要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门. 本文属于机器翻译版本.若本译文内容与英语原文存在差异,则一律以英文原文为准. 使用 ...

最新文章

  1. Centos7 搭建 k8s 环境教程,一次性成功
  2. Swfit Array 遍历 map flatMap filter reduce
  3. MonoRail学习-介绍篇(一)
  4. linux打开anaconda的jupyter_Linux Centos7安装anaconda3和jupyter
  5. 数据类型(简单数据类型、简单数据类型传参、复杂数据类型传参)
  6. ECS Linux 服务器解除ssh登陆后被锁定或暂停输入输出的终端
  7. Leetcode 242.有效的字母异位词 By Python
  8. ping命令两种返回信息的区别
  9. 大雁塔尺寸_西安容易被误解的两座建筑 不是只有大小之分 游客来了才知道原因...
  10. Safari兼容IE
  11. 芭比Q了,腰间盘给整突出了
  12. 工字型钢弹性截面模量计算公式_截面模量计算方法
  13. R语言使用dplyr包进行数据聚合统计计算滑动窗口统计值(Window Statistics)、计算滑动分组四分位差(IQR、四分位距)并合并生成的统计数据到原数据集中
  14. 增量式(相对式)编码器与绝对式编码器工作原理
  15. centos8 处理挖矿程序攻击
  16. SIP开源项目opensip,Freeswitch
  17. 项目七总结 创建于使用触发器
  18. R-VQA: Learning Visual Relation Facts with Semantic Attention for Visual Question Answering
  19. 构建岗位胜任力模型至关重要
  20. 跨模态学习能力再升级,EasyNLP 电商文图检索效果刷新 SOTA

热门文章

  1. 【Android】DatePicker时间选择器
  2. linux百度云下载脚本,百度网盘Linux版下载
  3. 教你如何在Windows XP使用定时关机命令
  4. Actors 基于消息驱动的异步编程模型
  5. 微软人工智能公开课.md
  6. Servlet的三个名字
  7. 【C#】Message类的属性Msg所关联的消息ID
  8. delphi7中的局部变量和全局变量
  9. 这程序还厉害的。。。
  10. Activity类的7个生命周期方法