Golang 调用 aws-sdk 操作 S3对象存储

前言

因为业务问题,要写一个S3对象存储管理代码,由于一直写Go,所以这次采用了Go,Go嘛,快,自带多线程,这种好处就不用多说了吧。

基础的功能

  1. 查看S3中包含的bucket
  2. bucket中的文件/文件夹
  3. bucket的删除
  4. bucket的创建
  5. bucket的文件上传
  6. bucket的文件下载
  7. bucket的文件删除

aws-sdk 的安装

玩Golang你还能不会那啥?对吧,那啥?那飞机!那飞机场,安上~

go get github.com/aws/aws-sdk-go

aws-sdk-go 的基础使用

构建基础的S3连接

访问S3的时候,咱们需要access_key,secret_key,对象存储访问IP这三个参数,我们首先要创建一个aws的config,说白了,我们需要定义aws的配置,这样它才知道要怎么访问,去哪里访问等问题。

构建一个S3连接代码如下

package main
import (
"fmt"
"os"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
_ "github.com/aws/aws-sdk-go/service/s3/s3manager"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
)
func main() { access_key := "xxxxxxxxxxxxx"
secret_key := "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
end_point := "http://xx.xx.xx.xx:7480" //endpoint设置,不要动 sess, err := session.NewSession(&aws.Config{
Credentials: credentials.NewStaticCredentials(access_key, secret_key, ""),
Endpoint: aws.String(end_point),
Region: aws.String("us-east-1"),
DisableSSL: aws.Bool(true),
S3ForcePathStyle: aws.Bool(false), //virtual-host style方式,不要修改
})
}

这时候需要你自己去定义一下access_key,secret_key,end_point这三个参数

接下来所有的代码,都是以这个连接模板,为核心,后面我就用同上代替配置,请注意!

所有的代码都传到GIT上了,到时候会给出地址,不懂得copy下来吧!

查看S3中包含的bucket

查看所有的bucket

package main
import (
导入包同上
) func exitErrorf(msg string, args ...interface{}) {
fmt.Fprintf(os.Stderr, msg+"\n", args...)
os.Exit(1)
} func main() { 配置同上 svc := s3.New(sess)
result, err := svc.ListBuckets(nil)
if err != nil {
exitErrorf("Unable to list buckets, %v", err)
} fmt.Println("Buckets:") for _, b := range result.Buckets {
fmt.Printf("* %s created on %s\n",
aws.StringValue(b.Name), aws.TimeValue(b.CreationDate))
} for _, b := range result.Buckets {
fmt.Printf("%s\n", aws.StringValue(b.Name))
} }

列出bucket中的文件/文件夹

查看某个bucket中包含的文件/文件夹

package main
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/service/s3"
"fmt"
"os"
) func exitErrorf(msg string, args ...interface{}) {
fmt.Fprintf(os.Stderr, msg+"\n", args...)
os.Exit(1)
} func main() { 配置同上 // bucket后跟,go run ....go bucketname
bucket := os.Args[1]
fmt.Printf(bucket)
fmt.Printf("\n") svc := s3.New(sess) params := &s3.ListObjectsInput{
Bucket: aws.String(bucket),
}
resp, err := svc.ListObjects(params) if err != nil {
exitErrorf("Unable to list items in bucket %q, %v", bucket, err)
} for _, item := range resp.Contents {
fmt.Println("Name: ", *item.Key)
fmt.Println("Last modified:", *item.LastModified)
fmt.Println("Size: ", *item.Size)
fmt.Println("Storage class:", *item.StorageClass)
fmt.Println("")
} }

bucket的创建

创建bucket

package main

import (
导包同上
) func exitErrorf(msg string, args ...interface{}) {
fmt.Fprintf(os.Stderr, msg+"\n", args...)
os.Exit(1)
} func main() { 配置同上 bucket := os.Args[1] if len(os.Args) != 2 {
exitErrorf("Bucket name required\nUsage: %s bucket_name",
os.Args[0])
} // Create S3 service client
svc := s3.New(sess) params := &s3.CreateBucketInput{
Bucket: aws.String(bucket),
} _, err = svc.CreateBucket(params) if err != nil {
exitErrorf("Unable to create bucket %q, %v", bucket, err)
} // Wait until bucket is created before finishing
fmt.Printf("Waiting for bucket %q to be created...\n", bucket) err = svc.WaitUntilBucketExists(&s3.HeadBucketInput{
Bucket: aws.String(bucket),
}) if err != nil {
exitErrorf("Error occurred while waiting for bucket to be created, %v", bucket)
} fmt.Printf("Bucket %q successfully created\n", bucket)
}

bucket的文件上传

往某个固定的bucket里传文件

package main

import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
"fmt"
"os"
) func exitErrorf(msg string, args ...interface{}) {
fmt.Fprintf(os.Stderr, msg+"\n", args...)
os.Exit(1)
} func main() { 配置同上 if len(os.Args) != 3 {
exitErrorf("bucket and file name required\nUsage: %s bucket_name filename",
os.Args[0])
} bucket := os.Args[1]
filename := os.Args[2] file, err := os.Open(filename)
if err != nil {
exitErrorf("Unable to open file %q, %v", err)
} defer file.Close() uploader := s3manager.NewUploader(sess) _, err = uploader.Upload(&s3manager.UploadInput{
Bucket: aws.String(bucket),
Key: aws.String(filename),
Body: file,
})
if err != nil {
// Print the error and exit.
exitErrorf("Unable to upload %q to %q, %v", filename, bucket, err)
} fmt.Printf("Successfully uploaded %q to %q\n", filename, bucket)
}

bucket的文件下载

下载某个bucket中的某个文件

package main

import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/service/s3/s3manager" "fmt"
"os"
) func exitErrorf(msg string, args ...interface{}) {
fmt.Fprintf(os.Stderr, msg+"\n", args...)
os.Exit(1)
} func main() { 配置同上 if len(os.Args) != 3 {
exitErrorf("Bucket and item names required\nUsage: %s bucket_name item_name",
os.Args[0])
} bucket := os.Args[1]
item := os.Args[2] file, err := os.Create(item)
if err != nil {
exitErrorf("Unable to open file %q, %v", err)
} defer file.Close() downloader := s3manager.NewDownloader(sess) numBytes, err := downloader.Download(file,
&s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(item),
})
if err != nil {
exitErrorf("Unable to download item %q, %v", item, err)
} fmt.Println("Downloaded", file.Name(), numBytes, "bytes")
}

bucket的文件删除

删除某个bucket里面的某个文件

package main

import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/service/s3"
"fmt"
"os"
) func exitErrorf(msg string, args ...interface{}) {
fmt.Fprintf(os.Stderr, msg+"\n", args...)
os.Exit(1)
} func main() { 配置同上 if len(os.Args) != 3 {
exitErrorf("Bucket and object name required\nUsage: %s bucket_name object_name",
os.Args[0])
} bucket := os.Args[1]
obj := os.Args[2] svc := s3.New(sess) _, err = svc.DeleteObject(&s3.DeleteObjectInput{Bucket: aws.String(bucket), Key: aws.String(obj)})
if err != nil {
exitErrorf("Unable to delete object %q from bucket %q, %v", obj, bucket, err)
} err = svc.WaitUntilObjectNotExists(&s3.HeadObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(obj),
}) fmt.Printf("Object %q successfully deleted\n", obj)
}

代码所在地

https://github.com/Alexanderklau/Go_poject/tree/master/Go-Storage

Golang 调用 aws-sdk 操作 S3对象存储的更多相关文章

  1. 【系统设计】S3 对象存储

    在本文中,我们设计了一个类似于 Amazon Simple Storage Service (S3) 的对象存储服务.S3 是 Amazon Web Services (AWS) 提供的一项服务, 它 ...

  2. ceph 007 双向池同步 rgw对象网关配置 s3对象存储

    增量导入导出要基于快照 导出的过程当中害怕镜像被修改所以打快照.快照的数据是不会变化的 镜像级别的双向同步 镜像主到备,备到主.一对一 就算是池模式的双向同步,镜像也具有主备关系 双向同步,池模式 [ ...

  3. AWS S3 对象存储服务

    虽然亚马逊云非常牛逼,虽然亚马逊云财大气粗,虽然亚马逊用的人也非常多,可是这个文档我简直无法接受,特别是客服,令人发指的回复速度,瞬间让人无语,可是毕竟牛逼.忍了,躺一次坑而已 1.图片上传 1.1 ...

  4. 【Python】使用 boto 调用 S3 对象存储API

    代码示例: import logging #from django.conf import settings import boto from boto.s3.key import Key impor ...

  5. 使用s3fs-fuse 挂载minio s3 对象存储

    minio 是一个aws s3 兼容的对象存储系统,我们可以通过s3fs 进行数据桶的挂载,这样可以做好多方便的事情 环境准备 使用docker-compose 运行 minio docker-com ...

  6. s3对象存储

    bkstorages 模块帮助你在蓝鲸应用中使用多种文件存储服务作为后端,用于加速静态资源,管理用户上传文件. 自定静态文件 storage 如果通过修改配置文件满足不了你的需求,你随时可以通过继承 ...

  7. PHP 上传文件至阿里云OSS对象存储

    简述 1.阿里云开通对象存储服务 OSS 并创建Bucket 2.下载PHP SDK至框架扩展目录,点我下载 3.码上code 阿里云操作 开通对象存储服务 OSS 创建 Bucket 配置Acces ...

  8. 010 Ceph RGW对象存储

    一.对象存储 1.1 介绍 通过对象存储,将数据存储为对象,每个对象除了包含数据,还包含数据自身的元数据 对象通过Object ID来检索,无法通过普通文件系统操作来直接访问对象,只能通过API来访问 ...

  9. swift对象存储安装

    对象存储服务概览 OpenStack对象存储是一个多租户的对象存储系统,它支持大规模扩展,可以以低成本来管理大型的非结构化数据,通过RESTful HTTP 应用程序接口. 它包含下列组件: 代理服务 ...

随机推荐

  1. 如何在github上部署自己的前端项目

    很多时候我们想需要一个地址就可以访问自己的前端作品, 但是注册一个服务器和域名是需要花钱,很多小伙伴都不愿意, 其实这种前端静态页面github就可以帮我们预览其效果,而且只要在有网的情况下都可以访问 ...

  2. Apache 配置IP站点

    配置临时生效 IP: [root@Nagios-Server extra]# ifconfigeth0:0 192.168.1.126/24 up [root@Nagios-Server extra] ...

  3. Django视图中使用本地缓存

    Django服务器视图使用缓存可以大大减小服务器的压力,对数据实时性要求不高的场景使用缓存非常适合. 使用Django本地缓存 1. 在settings.py配置CACHES CACHES = { ' ...

  4. 04javascript02

    1.BOM编程 1.1入门 BOM就是浏览器对象模型编程,通过javascript引擎提供的四个浏览器对象,操作浏览器,这叫BOM编程. 1.2window对象(重点) <!DOCTYPE ht ...

  5. 北京师范大学第十五届ACM决赛-重现赛C Captcha Cracker (字符串模拟)

    链接:https://ac.nowcoder.com/acm/contest/3/C 来源:牛客网 Captcha Cracker 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26 ...

  6. pam模块

    main 循环监控 独立的程序 根据配置防护 登陆 ca cert 私有口令 openssl 证书口令??

  7. 创建kudu数据集测试总结

    参考文档: https://cloud.tencent.com/developer/article/1474797 https://www.tgshenghe.com/a77nr1/nzt9t1.ht ...

  8. Mybatis SQL 使用JAVA 静态资源

    常量:${@com.htsc.backtest.component.Global@PAGE_SIZE} 静态方法:${@com.htsc.backtest.component.Global@doMet ...

  9. linux 时区问题

    1.java项目发现 服务器时间不正确,修改了服务器时间之后依然没解决. 2.java虚拟机的时区也需要设置:

  10. Vuejs使用scoped(私有) style为v-html中标签添加CSS样式

    最近使用Vue框架的时候遇到一个问题,就是后台把数据写好了,而且写好的数据的某些内容是html格式的,使用Vue框架的v-html虽然可以很简单的就把数据转换成html的标签渲染在页面上,但是有些样式 ...