Go ๐ฅ๐๋ฅผ ์ฌ์ฉํ์ฌ S3์์ ํ์ผ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ์ฝ๊ธฐ
12682 ๋จ์ด machinelearnings3goaws
์ ์ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ธฐ๋ณธ ์์ ํ
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
)
์ ์ญ ๋ณ์ ๋ฐ ๊ตฌ์กฐ์ฒด ์ ์.
๋ช ๊ฐ์ง ๊ธฐ๋ณธ ๊ตฌ์กฐ์ฒด์ ์ ์ญ ๋ณ์๋ฅผ ์ ์ํ์ฌ ์์ํฉ๋๋ค.
type S3Bucket struct {
Bucket string `json:"bucket"`
Key string `json:"key"`
}
type Metrics struct {
RMSE string `json:"rmse"`
MAE string `json:"mae"`
MAPE string `json:"mape"`
}
var pageNum int = 0
var s3Buckets []S3Bucket
var finalMetrics []Metrics
var sess *session.Session
์ธ์ ์ ์์ํฉ๋๋ค.
๋จผ์ SDK๊ฐ ๊ณต์ ์๊ฒฉ ์ฆ๋ช ํ์ผ ~/.aws/credentials์์ ์๊ฒฉ ์ฆ๋ช ์ ๋ก๋ํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ธ์ ์ ์ด๊ธฐํํ๊ณ ์ Amazon S3 ์๋น์ค ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํฉ๋๋ค.
sess, err := session.NewSession(&aws.Config{
Region: aws.String(conf.AWS_REGION),
})
if err != nil {
exitErrorf("Unable to create a new session %v", err)
}
ํ์ด์ง ๋งค๊น์ ์ฌ์ฉํ์ฌ ๋ฒํท์ ํญ๋ชฉ ๋์ด.
AWS ๋ฌธ์๋
ListObjectsV2
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒํท์ ํ์ผ์ ์ก์ธ์คํ๋ ์๋ง ์ ๊ณตํฉ๋๋ค. ์ด์ ์ด ํจ์์์ ๋ฐ์ํ ๋ฌธ์ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ ๋ง์ด ํํฐ๋งํ๊ธฐ ์ํด ๊ฒฐ๊ณผ์ ์์ฒด ์ฌ์ฉ์ ์ ์ ํจ์๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ํ์ฉํ์ง ์์ต๋๋ค. ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ๊ฐ ์์ฒญ๊ณผ ํจ๊ป ๋ฒํท์ ๊ฐ์ฒด(์ต๋ 1,000๊ฐ)๋ฅผ ๋ฐํํ๋ค๋ ๊ฒ์
๋๋ค. ์ฌ๊ธฐ์๋ ์ฝ๊ณ ์ถ์ ํ์ผ์ ํ์ ๊ฒฝ๋ก๊ฐ ํฌํจ๋ฉ๋๋ค.ListObjectsV2
S3 ๋ฒํท ํธ๋ฆฌ์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋์ดํ๋ฉฐ ํ์ผ์ด ํฌํจ๋์ง ์์ ๊ฐ์ฒด๋ ํฌํจํฉ๋๋ค. ํน์ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ํ๋ ค๋ฉด ํจ์๋ฅผ ์ ์ฉํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋์ ListObjectsV2Pages
์ ์ฌ์ฉํฉ๋๋ค. ListObjectsV2Pages
๋ ListObjectsV2
์์
์ ํ์ด์ง๋ฅผ ๋ฐ๋ณตํ์ฌ ๊ฐ ํ์ด์ง์ ๋ํ ์๋ต ๋ฐ์ดํฐ๋ก ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ๋ฐ๋ณต์ ์ค์งํ๋ ค๋ฉด false
๋ฅผ ๋ฐํํฉ๋๋ค.์๋์ ๊ฐ์ด ํ์ด์ง์
.json
ํ์ผ๋ง ๋์์ผ๋ก ์ง์ ํ๊ณ s3Bucket slice
์ ์ถ๊ฐํ๊ณ ์ถ์ต๋๋ค. ์ด ๋ถ๋ถ์ ์ฐ๋ฆฌ๊ฐ ๊ฐ ํ์ผ์ ์์น๋ฅผ โโ์ ์ ์๋๋ก ํ์ฌ ๋ด์ฉ์ ์ ๊ทผํ ์ ์๋๋ก ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ค์ํฉ๋๋ค!๊ธฐ๋ณธ ๋ฒํท ์ด๋ฆ์ S3_BUCKET์ผ๋ก ์ ๋ฌํ๊ณ ๊ฐ์ฒด ๊ฒฝ๋ก๊ฐ ์๋ ๊ฒฝ์ฐ S3_PREFIX์ ์ ๋ฌํฉ๋๋ค.
svc := s3.New(sess)
err = svc.ListObjectsV2Pages(&s3.ListObjectsV2Input{Bucket: aws.String(S3_BUCKET), Prefix: aws.String(S3_PREFIX)},
func(page *s3.ListObjectsV2Output, lastPage bool) bool {
pageNum++
for _, item := range page.Contents {
if strings.Contains(*item.Key, "json") {
s3Buckets = append(s3Buckets, S3Bucket{Bucket: conf.S3_BUCKET, Key: *item.Key})
}
}
return pageNum < 100
})
if err != nil {
exitErrorf("Unable to list items in bucket %q, %v", conf.S3_BUCKET, err)
}
๊ฐ์ฒด ์ฝํ ์ธ ์ ์ก์ธ์คํฉ๋๋ค.
s3buckets
์ฌ๋ผ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ Bucket
์์ Key
๋ฐ struct
์ ์ก์ธ์คํ์ฌ 'Object' ์ ๋ณด(๋๋ ํ์ผ)๋ฅผ ์์ฒญํ ๋ค์ ๊ฐ์ฒด ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.for _, item := range s3Buckets {
requestInput := &s3.GetObjectInput{
Bucket: aws.String(item.Bucket),
Key: aws.String(item.Key),
}
result, err := svc.GetObject(requestInput)
if err != nil {
log.Print(err)
}
๋ด์ฉ์ ์ฌ๋ผ์ด์ค๋ก ์ฝ๊ธฐ
JSON ํ์ผ '๊ฒฐ๊ณผ'๋
ioutil.Readall()
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ Metrics ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค๋ก ๋์ฝ๋ฉ๋ ๋ฐ์ดํธ ์ฌ๋ผ์ด์ค๋ฅผ ๋ฐํํ๋ json.Unmarshal()
ํจ์๋ก ์ฝ์ต๋๋ค.JSON์
struct
๋ก ์ฝ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ์ฐพ์ ์ต๊ณ ์ ์์ต์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. Parsing JSON defer result.Body.Close()
body, err := ioutil.ReadAll(result.Body)
if err != nil {
log.Print(err)
}
bodyString := fmt.Sprintf("%s", body)
var metrics Metrics
err = json.Unmarshal([]byte(bodyString), &metrics)
if err != nil {
fmt.Println("twas an error")
}
finalMetrics = append(finalMetrics, metrics)
}
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ ๋ค์ผ! ์ด์ ํน์ ๋ฒํท์์ JSON ํ์ผ์ ๊ฐ์ ธ์ค๊ณ ๊ฒฐ๊ณผ๋ฅผ
struct
๋ก ๊ตฌ๋ฌธ ๋ถ์ํ์ต๋๋ค. ์ ์๊ฐ์, ํนํ ๊ธฐ๊ณ ํ์ต์์ S3 ํ์ผ์ ๋ด์ฉ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋ฅผ ๋ค์ด ๊ณผ๊ฑฐ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ณด๊ณ ๋น๊ตํ๊ฑฐ๋ ๋ชจ๋ธ์ ์ถ๊ฐํ ์ถ๊ฐ ๋ฐ์ดํฐ ๊ธฐ๋ฅ์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ํ๋ ์์ง๋์ด์๊ฒ ๋งค์ฐ ์ค์ํฉ๋๋ค.
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(Go ๐ฅ๐๋ฅผ ์ฌ์ฉํ์ฌ S3์์ ํ์ผ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ์ฝ๊ธฐ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/seanyboi/fetching-and-reading-files-from-s3-using-go-4180ํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค