web-dev-qa-db-ja.com

GolangでAWS S3からファイルを読み取る

Herokuにgolangコードをデプロイしようとしています。私のコードは入力としてテキストファイルを必要とし、S3バケットからこのテキストファイルを取得する必要があります。私のgo-codeは入力としてファイル名を取ります、誰かが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")
}

誰かがreading S3からテキストファイルへのファイルのための良いライブラリを提案できますか? Herokuにファイルを展開する必要があるため、S3からファイルをダウンロードできません。

たとえば、コードスニペットは大歓迎です!

5
user3710436

以下のコードスニペットが動作するはずです(適切な依存関係がインストールされている場合)。

    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 を確認してください。

7
Ammar Mohammed

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)
} 
1