【问题标题】:Reading files from AWS S3 in Golang在 Golang 中从 AWS S3 读取文件
【发布时间】: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 <- &Http{Url: 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 将受到高度赞赏!

【问题讨论】:

标签: go heroku amazon-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 SDKGithub 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)
    } 
    

    【讨论】:

    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多