在 Golang 中从 AWS S3 读取文件
Posted
技术标签:
【中文标题】在 Golang 中从 AWS S3 读取文件【英文标题】:Reading files from AWS S3 in Golang 【发布时间】:2018-08-22 07:40:39 【问题描述】:我正在尝试在 Heroku 上部署 golang 代码。我的代码需要一个文本文件作为输入,我需要从 S3 存储桶中获取这个文本文件。我的 go-code 将文件名作为输入,有人可以提供一个代码 sn-p 用于从 S3 读取文件并将其内容存储到文件中吗?
我的 GOlang 代码-
func getDomains(path string) (lines []string, Error error)
file, err := os.Open(path)
if err != nil
log.Fatalln(err)
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan()
lines = append(lines, scanner.Text())
return lines, scanner.Err()
func Process(w http.ResponseWriter, r *http.Request)
urls := make(chan *Http, Threads*10)
list, err := getDomains("**NEED A TEXT FILE FROM S3 HERE as an argument**")
if err != nil
log.Fatalln(err)
var wg sync.WaitGroup
for i := 0; i < Threads; i++
wg.Add(1)
go func()
for url := range urls
url.DNS()
wg.Done()
()
for i := 0; i < len(list); i++
Progress := fmt.Sprintln(w, len(list))
urls <- &HttpUrl: list[i], Num: Progress
close(urls)
wg.Wait()
fmt.Printf("\r%s", strings.Repeat(" ", 100))
fmt.Fprintln(w, "\rTask completed.\n")
有人可以推荐一个好的库来读取从 S3 到文本文件的文件吗?我无法从 S3 下载文件,因为我必须在 Heroku 上部署它。
例如代码 sn-p 将受到高度赞赏!
【问题讨论】:
见aws.amazon.com/sdk-for-go。 aws 文档中有一个下载功能,我需要一个功能来读取文件 GetObject 从 S3 获取一个对象。 【参考方案1】:下面的代码 sn-p 应该可以工作(假设您已经安装了正确的依赖项):
package main
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
"fmt"
"log"
"os"
)
func main()
// NOTE: you need to store your AWS credentials in ~/.aws/credentials
// 1) Define your bucket and item names
bucket := "<YOUR_BUCKET_NAME>"
item := "<YOUR_ITEM_NAME>"
// 2) Create an AWS session
sess, _ := session.NewSession(&aws.Config
Region: aws.String("us-west-2"),
)
// 3) Create a new AWS S3 downloader
downloader := s3manager.NewDownloader(sess)
// 4) Download the item from the bucket. If an error occurs, log it and exit. Otherwise, notify the user that the download succeeded.
file, err := os.Create(item)
numBytes, err := downloader.Download(file,
&s3.GetObjectInput
Bucket: aws.String(bucket),
Key: aws.String(item),
)
if err != nil
log.Fatalf("Unable to download item %q, %v", item, err)
fmt.Println("Downloaded", file.Name(), numBytes, "bytes")
更多详情可以查看AWS Go SDK和Github Example
【讨论】:
file
是从哪里来的?
来自 Github 示例
file 指向下载对象的本地文件。所以,这行文件 err := os.Create(item) 应该是文件 err := os.Create("item_local")。现在,当您运行上述程序时,它会下载到 item_local 并将其放置在您运行程序的任何位置。【参考方案2】:
使用当前稳定的 AWS lib for go:
sess := session.Must(session.NewSession(&aws.Config
....
))
svc := s3.New(sess)
rawObject, err := svc.GetObject(
&s3.GetObjectInput
Bucket: aws.String("toto"),
Key: aws.String("toto.txt"),
)
buf := new(bytes.Buffer)
buf.ReadFrom(rawObject.Body)
myFileContentAsString := buf.String()
【讨论】:
【参考方案3】:这是一个使用SDK V2获取对象的函数(改编自https://github.com/aws/aws-sdk-go-v2中的示例):
注意:无错误处理 - 仅限演示代码。
package s3demo
import (
"os"
"context"
"fmt"
"io/ioutil"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/aws/awserr"
"github.com/aws/aws-sdk-go-v2/aws/external"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func GetObjectWithV2SDKDemo()
bucket := "YOUR_BUCKET"
key := "YOUR_OBJECT_KEY"
fileName := "YOUR_FILE_PATH"
// may need AWS_PROFILE and AWS_REGION populated as environment variables
cfg, err := external.LoadDefaultAWSConfig()
if err != nil
panic("failed to load config, " + err.Error())
svc := s3.New(cfg)
ctx := context.Background()
req := svc.GetObjectRequest(&s3.GetObjectInput
Bucket: aws.String(bucket),
Key: aws.String(key),
)
resp, err := req.Send(ctx)
if err != nil
panic(err)
s3objectBytes, err := ioutil.ReadAll(resp.Body)
if err != nil
panic(err)
// create file
f, err := os.Create(fileName)
defer f.Close()
if err != nil
panic(err)
bytesWritten, err := f.Write(s3objectBytes)
if err != nil
panic(err)
fmt.Printf("Fetched %d bytes for S3Object\n", bytesWritten)
fmt.Printf("successfully downloaded data from %s/%s\n to file %s", bucket, key, fileName)
【讨论】:
现在有点过时了(例如,s3.New(cfg)
现在是 s3.NewFromConfig(cfg)
等)。直接按照github.com/aws/aws-sdk-go-v2/tree/main/example/service/s3 中的例子可能会更好。以上是关于在 Golang 中从 AWS S3 读取文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 aws.s3 包从 AWS S3 一次读取多个 CSV 文件对象
如何使用 Python 在 myBucket 中上传 CSV 文件并在 S3 AWS 中读取文件
如何在 java 中使用 spark 从 AWS S3 读取 .xls 文件?并且无法读取 sheetName
AWS EMR 文件已存在:Hadoop 作业读取和写入 S3