在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)
}
測試
執行Go應用程式印出以下結果。content為object hello.txt
的內容
content=hello world
沒有留言:
張貼留言