網頁

2022/5/5

Golang 從本機讀取AWS S3 bucket object檔案內容

在locahost的Go應用程式中以AWS提供的SDK aws-sdk-go-v2讀取S3 bucket中的object內容。


範例環境:

  • Go 1.18


事前要求

參考「AWS 建立IAM管理使用者及credentials」設定供應用程式存取AWS需要的IAM管理員credentials。

參考「AWS 建立S3 bucket並上傳檔案」建立S3 bucket及上傳hello.txt檔案。。


下載AWS SDK Go V2 modules

在專案根目錄執行以下命令下載需要的aws-sdk-go-v2 modules。

  • go get github.com/aws/aws-sdk-go-v2
  • go get github.com/aws/aws-sdk-go-v2/config
  • go get github.com/aws/aws-sdk-go-v2/service/s3


讀取S3 bucket的檔案內容

呼叫config.LoadDefaultConfig()傳入region參數建立aws.Conifg物件,AWS SDK預設會讀取$HOME/.aws/credentials的access keys來通過權限驗證,然後依此參數建立s3.Client來存取S3 bucket objects。

建立s3.GetObjectInput設定要讀取檔案的bucket及object key後傳入s3.Client.GetObject()取得s3.GetObjectOutput,然後從s3.GetObjectOutput.Body讀取object內容。

main.go

package main

import (
    "context"
    "fmt"
    "io/ioutil"

    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/s3"
)

func main() {
    ctx := context.TODO()

    client := NewS3Client(ctx)

    bucket := "s3-demo-bucket-202112151320"
    key := "hello.txt"
    in := CreateGetObjectInput(bucket, key)
    content := GetObjectContent(ctx, client, in)
    fmt.Printf("content=%s\n", content)
}

func NewS3Client(ctx context.Context) *s3.Client {
    cfg, err := config.LoadDefaultConfig(
        ctx,
        config.WithRegion("ap-northeast-1"),
    )
    if err != nil {
        panic(err)
    }
    return s3.NewFromConfig(cfg) // Create an Amazon S3 service client
}

func CreateGetObjectInput(bucket string, key string) *s3.GetObjectInput {
    return &s3.GetObjectInput{
        Bucket: &bucket,
        Key:    &key,
    }
}

func GetObjectContent(ctx context.Context, client *s3.Client, input *s3.GetObjectInput) string {
    output, err := client.GetObject(ctx, input)
    if err != nil {
        panic(err)
    }

    b, err := ioutil.ReadAll(output.Body) // Body is Reader
    if err != nil {
        panic(err)
    }
    defer output.Body.Close()

    return string(b)
}


github


測試

執行Go應用程式印出以下結果。content為object hello.txt的內容

content=hello world


沒有留言:

張貼留言