Backend/🩡 Go

ν…Œν¬ λΈ”λ‘œκ·Έ λͺ¨μ•„보기 개발 기둝 (2) : Go 언어와 μ„œλ²„λ¦¬μŠ€ ν”„λ ˆμž„μ›Œν¬

Hugehoo 2024. 10. 22. 23:00

μ„œλ‘ 

이 글은 Golang μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ Serverless framework λ₯Ό μ΄μš©ν•΄ AWS Lambda 에 λ°°ν¬ν•˜λŠ” 과정을 닀룬닀.

ν˜„μž¬ μš΄μ˜μ€‘μΈ μ‚¬μ΄λ“œ ν”„λ‘œμ νŠΈ(πŸ”— ν…Œν¬ λΈ”λ‘œκ·Έ λͺ¨μ•„보기) λŠ” Go μ–Έμ–΄λ₯Ό 기반으둜 AWS Lambda(μ΄ν•˜ λžŒλ‹€)에 λ°°ν¬λ˜μ–΄ μžˆλ‹€. 처음 λžŒλ‹€λ₯Ό 배울 땐 AWS Console μ—μ„œ 일일이 API Gateway λ₯Ό μ„€μ •ν•˜κ³  Lambda ν•¨μˆ˜μ˜ μ½”λ“œλ₯Ό 직접 μž‘μ„±ν•œ 기얡이 λ‚˜λŠ”λ°, λ‹Ήμ‹œλ§Œ 해도 κ°„λ‹¨ν•œ 파이썬 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 정도라 AWS Console 에 μ½”λ“œλ₯Ό λ³΅λΆ™ν•˜λŠ” μ •λ„λ‘œ λžŒλ‹€λ₯Ό 맛보기 ν–ˆλ‹€.

 

ν•˜μ§€λ§Œ μ‹€μ œλ‘œ μš΄μ˜ν•  μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλŠ” λ‹¨μˆœ 볡사 λΆ™μ—¬λ„£κΈ°λ‘œ λžŒλ‹€μ— 배포할 수 μ—†μ—ˆλ‹€. 파일 μˆ˜λ„ λ§Žμ„ λΏλ”λŸ¬ 맀번 배포할 λ•Œ λ§ˆλ‹€ 그런 번거둜운 일을 ν• μˆ˜λ„ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. κ·Έλ¦¬ν•˜μ—¬ λžŒλ‹€μ˜ 배포 μžλ™ν™”λŠ” μ–΄λ–»κ²Œ ν•  수 μžˆμ„μ§€λ₯Ό κ³ λ―Όν•˜λ‹€ AWS CLI, AWS SAM, Serverless Framework λ“± λ‹€μ–‘ν•œ νˆ΄μ„ μ•Œκ²Œ 됐닀. 결둠적으둜 ν•„μžλŠ” Serverless Framework (μ΄ν•˜ μ„œλ²„λ¦¬μŠ€ ν”„λ ˆμž„μ›Œν¬) λ₯Ό μ„ νƒν–ˆκ³  κ°„λ‹¨ν•œ μ»€λ§¨λ“œ μž…λ ₯만으둜 μ—…λ°μ΄νŠΈκ°€ μžˆμ„ λ•Œλ§ˆλ‹€ κ°„λ‹¨νžˆ 배포λ₯Ό 진행할 수 있게 됐닀.
이 글에선 μ„œλ²„λ¦¬μŠ€ ν”„λ ˆμž„μ›Œν¬λž€ 무엇인지, Go/Gin μ›Ή ν”„λ ˆμž„μ›Œν¬λ‘œ 개발된 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ°°ν¬ν•˜λŠ” 개랡적인 방법을 μ•Œμ•„λ³΄κ² λ‹€.

 

 

Go 와 AWS Lambda 의 μ‘°ν•©

go μ–Έμ–΄ νŠΉμ„± 상 λžŒλ‹€λ‘œ λ°°ν¬ν•˜λ©΄ 제격이라고 λŠλ‚€ ν¬μΈνŠΈκ°€ λͺ‡κ°€μ§€ μžˆλ‹€.

 

μš°μ„  λΉ λ₯Έ 초기 μ‹€ν–‰ μ‹œκ°„ (Cold start time)

Go λŠ” 컴파일 μ–Έμ–΄λ‘œ λ°”μ΄λ„ˆλ¦¬ 파일둜 λ³€ν™˜λ˜μ–΄ λžŒλ‹€μ— μ œκ³΅λœλ‹€. μ΄λŠ” λŸ°νƒ€μž„ μ‹œ λ³„λ„μ˜ 인터프리터가 ν•„μš” μ—†μ–΄ Python μ΄λ‚˜ Node.js 같은 인터프리터 언어보닀 λžŒλ‹€μ—μ„œ λΉ λ₯΄κ²Œ 싀행될 수 μžˆλ‹€. μ‰½κ²Œ 말해 μ‹€ν–‰ν•  μ€€λΉ„κ°€ μ™„λ£Œλœ μƒνƒœλ‘œ 제곡되기 λ•Œλ¬Έμ— μ„±λŠ₯λ©΄μ—μ„œ 효율적이라 λ³Ό 수 μžˆλ‹€.

λžŒλ‹€λŠ”ν•¨μˆ˜κ°€ 호좜될 λ•Œ μ„œλ²„ μΈμŠ€ν„΄μŠ€λ₯Ό μ¦‰μ‹œ μ€€λΉ„ν•˜μ—¬ μ‹€ν–‰ν•˜λŠ”λ°, 이 κ³Όμ •μ—μ„œ λžŒλ‹€λŠ” μƒˆλ‘­κ²Œ μƒμ„±λœ μΈμŠ€ν„΄μŠ€μ—μ„œ μ½”λ“œμ˜ μ΄ˆκΈ°ν™”λ₯Ό μ§„ν–‰ν•œλ‹€. μ΄λ ‡κ²Œ μΈμŠ€ν„΄μŠ€κ°€ μƒˆλ‘œ μ‹œμž‘λ˜λŠ” 것을 μ½œλ“œ μŠ€νƒ€νŠΈ(Cold start) 라고 ν•œλ‹€. μ΄λŸ¬ν•œ μ½œλ“œ μŠ€νƒ€νŠΈλŠ” ν•¨μˆ˜κ°€ 였랜 μ‹œκ°„ λ™μ•ˆ ν˜ΈμΆœλ˜μ§€ μ•Šμ•˜κ±°λ‚˜ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜λŠ” κ²½μš°μ— λ°œμƒν•˜λ©°, 이 μ΄ˆκΈ°ν™” κ³Όμ •μ—μ„œ 응닡 지연이 λ°œμƒν•  수 μžˆλ‹€. μ—¬κΈ°μ„œ Go의 컴파일 μ–Έμ–΄λΌλŠ” νŠΉμ§•μ€ λ³„λ„μ˜ λŸ°νƒ€μž„μ„ μš”κ΅¬ν•˜μ§€μ•Šκ³  κ³§λ°”λ‘œ μ‹€ν–‰ν•  수 있기 λ•Œλ¬Έμ— μ½œλ“œ μŠ€νƒ€νŠΈ μ‹œκ°„μ„ 쀄일 수 μžˆλ‹€. λ˜ν•œ Go λ°”μ΄λ„ˆλ¦¬λŠ” 일반적으둜 κ²½λŸ‰μ΄κ³  λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ— μ΅œμ ν™” λ˜μ–΄ μžˆμ–΄, μ΄ˆκΈ°ν™” μ‹œ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 적어 μ½œλ“œ μŠ€νƒ€νŠΈμ˜ 영ν–₯을 μ€„μ΄λŠ”λ° 도움이 λœλ‹€.

 

μž‘μ€ λ°”μ΄λ„ˆλ¦¬ 파일 크기

λ‹€λ₯Έ 컴파일 언어인 Java λ₯Ό μƒκ°ν•΄λ³΄μž. Java λŠ” 컴파일 된 ν›„ λ°”μ΄νŠΈ μ½”λ“œλ‘œ λ³€ν™˜λœλ‹€. Java 개발자라면 잘 μ•Œλ‹€μ‹œν”Ό 이 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ JVM μ΄λΌλŠ” 가상 머신을 ν•„μš”λ‘œ ν•œλ‹€.

반면 Go  λŠ” λΉŒλ“œ μ‹œ λ„€μ΄ν‹°λΈŒ λ°”μ΄λ„ˆλ¦¬ νŒŒμΌμ„ μƒμ„±ν•œλ‹€. λ„€μ΄ν‹°λΈŒ λ°”μ΄λ„ˆλ¦¬ νŒŒμΌμ΄λž€ νŠΉμ • μš΄μ˜μ²΄μ œμ™€ CPU 에 맞게 컴파일된 μ‹€ν–‰ νŒŒμΌμ„ μ˜λ―Έν•œλ‹€. 

μ„œλ²„λ¦¬μŠ€ ν”„λ ˆμž„μ›Œν¬μ—μ„œ Goλ₯Ό λΉŒλ“œν•˜λŠ” μ»€λ§¨λ“œ. λΉŒλ“œ μ‹œ 생성될 λ°”μ΄λ„ˆλ¦¬ νŒŒμΌμ€ Linux μš΄μ˜μ²΄μ œμ—μ„œ μ‹€ν–‰ν•˜κ² λ‹€λŠ” μ˜λ―Έλ‹€.

 

이 λ°”μ΄λ„ˆλ¦¬ νŒŒμΌμ€ μ‹œμŠ€ν…œμ—μ„œ λ°”λ‘œ 싀행될 수 μžˆμ–΄ λ³„λ„μ˜ μΆ”κ°€ μ†Œν”„νŠΈμ›¨μ–΄λ‚˜ λŸ°νƒ€μž„ ν™˜κ²½μ„ ν•„μš”λ‘œ ν•˜μ§€ μ•ŠλŠ”λ‹€. 즉 Go μ½”λ“œλŠ” 컴파일 되면 자체적으둜 μ‹€ν–‰ κ°€λŠ₯ν•œ λ…λ¦½ν˜• λ°”μ΄λ„ˆλ¦¬λ₯Ό μƒμ„±ν•˜κ³ , 이λ₯Ό 톡해 AWS Lambda μ—μ„œ λ³„λ„μ˜ μ˜μ‘΄μ„± μ„€μΉ˜ 없이 κ°„λ‹¨νžˆ 배포할 수 있게 λœλ‹€. λ˜ν•œ λ°”μ΄λ„ˆλ¦¬ 파일의 크기가 μž‘κΈ° λ•Œλ¬Έμ— Lambda 의 배포 νŒ¨ν‚€μ§€ 크기가 μž‘μ•„μ Έ μ—…λ‘œλ“œ 및 배포 속도에도 효율적인 영ν–₯을 쀄 수 μžˆλ‹€.

 

Go 와 Lambda

Go μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μœ„ν•œ μ›Ή ν”„λ ˆμž„μ›Œν¬μ—λŠ” μ—¬λŸ¬ μ’…λ₯˜(Gin, Fiber, Echo etc)κ°€ 있고 ν•„μžλŠ” Gin 을 μ„ νƒν–ˆλ‹€. Gin 은 κ²½λŸ‰ μ›Ή ν”„λ ˆμž„μ›Œν¬λ‘œ λžŒλ‹€μ—μ„œ μ‹€ν–‰ μ‹œ Cold start κ°€ λ°œμƒν•  λ•Œλ„ 비ꡐ적 λΉ λ₯΄κ²Œ μ‹€ν–‰ν•  수 μžˆλ‹¨ μž₯점이 μžˆμ–΄ μ„ νƒν–ˆλ‹€. 무엇보닀 μ°Έκ³ ν•  μžλ£Œκ°€ κ°€μž₯ ν’λΆ€ν•œ 점도 선택에 ν•œ λͺ«ν–ˆλ‹€.

 

import (
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/awslabs/aws-lambda-go-api-proxy/gin"
    "log"
)

var ginLambda *ginadapter.GinLambda

func main() {
    log.Println("πŸ“Œ Start Lambda")
    lambda.Start(Handler)
}

func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    return ginLambda.ProxyWithContext(ctx, request)
}

 

main ν•¨μˆ˜

lambda.Start ν•¨μˆ˜λŠ” λžŒλ‹€κ°€ μ‹œμž‘λ˜λ©΄ Handler ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λ„λ‘ μ„€μ •ν•œλ‹€. Handler λŠ” λžŒλ‹€μ— μ˜ν•΄ νŠΈλ¦¬κ±°λ˜λŠ” 이벀트λ₯Ό 핸듀링할 ν•¨μˆ˜λ‘œ, μ‰½κ²Œ 말해 λžŒλ‹€κ°€ 싀행될 λ•Œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λΌκ³  보면 λœλ‹€.

 

Handler ν•¨μˆ˜

ctx : λžŒλ‹€κ°€ μ œκ³΅ν•˜λŠ” context.Context 객체둜, λžŒλ‹€ 싀행에 κ΄€λ ¨λœ νƒ€μž„μ•„μ›ƒμ΄λ‚˜ μ’…λ£Œ μ‹ ν˜Έ λ“± μ—¬λŸ¬ 메타데이터λ₯Ό λ‹΄κ³  μžˆλ‹€.

request : events.APIGatewayProxyRequest νƒ€μž…μœΌλ‘œ API Gateway λ₯Ό 톡해 λ“€μ–΄μ˜¨ HTTP μš”μ²­μ„ λ‚˜νƒ€λ‚Έλ‹€.

ginLambda.ProxyWithContext(ctx, request) : ginLambda λŠ” λžŒλ‹€μ™€ 연동을 λ•λŠ” 헬퍼 객체둜, ProxyWithContext λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄ request 객체λ₯Ό gin ν”„λ ˆμž„μ›Œν¬μ—μ„œ μ²˜λ¦¬ν•  수 μžˆλŠ” ν˜•μ‹μœΌλ‘œ request λ₯Ό λ³€ν™˜ν•˜κ³ , response 결과도 λ°˜ν™˜ν•΄μ€€λ‹€.

 

 

Gin μ›Ήν”„λ ˆμž„μ›Œν¬λ₯Ό λžŒλ‹€μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ 기본적인 μ„ΈνŒ…μ„ μ™„λ£Œν–ˆμœΌλ‹ˆ, ping 을 λ‚ λ € 톡신할 수 μžˆλ„λ‘ λΌμš°ν„°λ₯Ό μ„€μ •ν•΄λ³΄μž.

func init() {
    log.Println("βœ… Starting initialization...")
    gin.SetMode(gin.ReleaseMode)

    config := cors.DefaultConfig()
    config.AllowOrigins = []string{"*"} // Allow all origins
    config.AllowMethods = []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"}
    config.AllowHeaders = []string{"Origin", "Content-Length", "Content-Type", "Authorization"}
    config.ExposeHeaders = []string{"Content-Length"}
    config.AllowCredentials = true
    config.MaxAge = 12 * time.Hour
    r.Use(cors.New(config))


    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })

    ginLambda = ginadapter.New(r)
    log.Println("βœ… Initialization complete")
}

 

init ν•¨μˆ˜

Go μ—μ„œ init ν•¨μˆ˜λŠ” νŒ¨ν‚€μ§€κ°€ λ‘œλ“œλ  λ•Œ μžλ™μœΌλ‘œ ν˜ΈμΆœλ˜λŠ” νŠΉλ³„ν•œ ν•¨μˆ˜λ‘œ, λͺ…μ‹œμ μœΌλ‘œ ν˜ΈμΆœν•˜μ§€ μ•Šμ•„λ„ νŒ¨ν‚€μ§€κ°€ 처음으둜 λ‘œλ“œλ˜λŠ” μ‹œμ μ— μžλ™μœΌλ‘œ ν˜ΈμΆœλœλ‹€. 즉 main ν•¨μˆ˜λ³΄λ‹€ λ¨Όμ € ν˜ΈμΆœλœλ‹€κ³  λ³Ό 수 μžˆλ‹€. init 이 ν˜ΈμΆœλ˜λ©΄μ„œ Gin μ„œλ²„ μ„€μ •κ³Ό λΌμš°ν„° 등둝, μ˜μ‘΄μ„± μ΄ˆκΈ°ν™” λ“±μ˜ μž‘μ—…μ„ μ„€μ •ν•œ ν›„ main ν•¨μˆ˜λ‘œ λ„˜μ–΄κ°€κ²Œ λœλ‹€.

 

gin.SetMode(gin.ReleaseMode) : Gin을 Release λͺ¨λ“œλ‘œ μ„€μ •ν•œλ‹€. μ΄λŠ” 둜그λ₯Ό μ΅œμ†Œν™”ν•˜κ³  μ„±λŠ₯을 λ†’μ΄λŠ” μ„€μ •μœΌλ‘œ, AWS λžŒλ‹€μ²˜λŸΌ λ¦¬μ†ŒμŠ€ μ œμ•½μ΄ μžˆλŠ” ν™˜κ²½μ—μ„œ νš¨κ³Όμ μ΄λ‹€.

gin.Default() : Gin λΌμš°ν„° 객체λ₯Ό κΈ°λ³Έ μ„€μ •μœΌλ‘œ μƒμ„±ν•œλ‹€.  Default ν•¨μˆ˜λŠ” λ‘œκΉ…κ³Ό 리컀버리 미듀웨어λ₯Ό 기본적으둜 ν¬ν•¨ν•œλ‹€.

ginadapter.New(r) : Gin λΌμš°ν„°λ₯Ό λžŒλ‹€μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” ν•Έλ“€λŸ¬λ‘œ λ³€ν™˜ν•˜λŠ” ν•¨μˆ˜λ‘œ, gin.Default() κ°€ ν• λ‹Ήλœ r λ³€μˆ˜λ₯Ό 인자둜 λ„˜κ²¨ GinLambda 객체λ₯Ό μƒμ„±ν•œλ‹€. Gin 으둜 λ“±λ‘ν•œ μ—¬λŸ¬ λΌμš°ν„°λ₯Ό AWS λžŒλ‹€μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ³€ν™˜ν•˜λŠ” ν•¨μˆ˜λΌ 생각할 수 μžˆλ‹€.

aws-lambda-go-api-proxy 라이브러리의 gin/adapter.go 의 New()

 

 

Serverless Framework 둜 배포

 

λžŒλ‹€λ‘œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ°°ν¬ν•œ κ²½ν—˜μ€ λ§Žμ§€ μ•Šμ§€λ§Œ, πŸ”— Serverless Frameworkλ₯Ό μ‚¬μš©ν•˜λ©΄ κ°„λ‹¨νžˆ 배포할 수 μžˆλ‹€λŠ” 것을 읡히 λ“€μ–΄μ˜¨ν„°λΌ 이번 κΈ°νšŒμ— μ‚¬μš©ν•΄λ³΄κΈ°λ‘œ ν–ˆλ‹€.

μ„œλ²„λ¦¬μŠ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 배포 μžλ™ν™” μ„ νƒμ§€λ‘œλŠ” AWS CLI λ‚˜ AWS SAM(Serverless Application Model) 을 ν™œμš©ν•˜λŠ” 방법도 μžˆμ§€λ§Œ, μ΅œμ’…μ μœΌλ‘œ μ„œλ²„λ¦¬μŠ€ ν”„λ ˆμž„μ›Œν¬λ₯Ό μ„ νƒν–ˆλ‹€. AWS SAM 도 λΉ„μŠ·ν•œ μžλ™ν™” κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€λ§Œ μ„œλ²„λ¦¬μŠ€ ν”„λ ˆμž„μ›Œν¬μ™€ λΉ„κ΅ν•˜λ©΄ 초기 λ°°ν¬κ³Όμ •μ˜ μ„€μ •κ³Ό 더 λ§Žμ€ 선언적 방식이 ν•„μš”ν•΄μ„œ λ°°μ œν–ˆλ‹€. AWS CLI 도 ν›Œλ₯­ν•œ μ„ νƒμ΄μ§€λ§Œ λ³„λ„μ˜ μ„€μ • 파일 없이 λͺ…λ Ήμ–΄ 기반으둜 λ™μž‘ν•˜κΈ°μ— 반볡적인 μž‘μ—…μ— λΉ„νš¨μœ¨μ μΌ 것이라 νŒλ‹¨ν–ˆλ‹€.(사싀 λͺ…λ Ήμ–΄ λ°˜λ³΅μ΄μ•Ό shell script 둜 λšλ”±λšλ”± ν•˜λ©΄ 될것 같기도..?)

κ²°μ •μ μœΌλ‘œ Serverless Framework λŠ” 각 언어에 λ§žλŠ” ν”„λ‘œμ νŠΈ ν…œν”Œλ¦Ώμ΄ 잘 μ œκ³΅λ˜μ–΄ μžˆμ–΄ AWS CLI 보닀 λ‚˜μ€ 선택이라 νŒλ‹¨ν–ˆλ‹€. μœ„μ—μ„œ μ–ΈκΈ‰ν•œ μ΄λ―Έμ§€λŠ” serverless.yml 의 일뢀인데 Go μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λΉŒλ“œν•˜κΈ° μœ„ν•œ Go λΉŒλ“œ λͺ…령어도 κΈ°λ³Έ ν…œν”Œλ¦Ώμ— 포함할 수 μžˆλ‹€.

 

μ„œλ²„λ¦¬μŠ€ ν”„λ ˆμž„μ›Œν¬λŠ” μ–΄λ–€ μ‹μœΌλ‘œ μž‘λ™ν•˜κΈΈλž˜ λžŒλ‹€μ˜ 배포λ₯Ό νŽΈλ¦¬ν•˜κ²Œ λ„μ™€μ£ΌλŠ”κ±ΈκΉŒ?
κ²°λ‘ λΆ€ν„° λ§ν•˜λ©΄ μ„œλ²„λ¦¬μŠ€ ν”„λ ˆμž„μ›Œν¬λŠ” AWS 의 Cloudformation μ΄λΌλŠ” μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•œλ‹€. AWS λ‚΄μ—μ„œ ν•„μš”ν•œ μ„œλΉ„μŠ€λ₯Ό JSON/YAML 파일둜 ν˜•μ‹μ— 맞좰 μ „λ‹¬ν•˜λ©΄ ν•„μš”ν•œ μ„œλΉ„μŠ€λ₯Ό μžλ™μœΌλ‘œ 생성/μ‚­μ œ ν•΄μ£ΌλŠ” μ„œλΉ„μŠ€μΈ μ…ˆμ΄λ‹€.

 

μ•„λž˜λŠ” ν•„μžκ°€ μ„œλ²„λ¦¬μŠ€ ν”„λ ˆμž„μ›Œν¬λ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ λ°°ν¬ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ yml 파일의 전문이닀.

serverless.yml

service: serverless-go

provider:
  name: aws
  runtime: provided.al2
  region: ap-northeast-2
  stage: ${opt:stage, 'dev'}

functions:
  api:
    handler: bootstrap
    timeout: 30 # Increase overall function timeout
    events:
      - http:
          path: /{proxy+}
          method: ANY
    environment:
      GO_LOG: info


package:
  patterns:
    - '!./**'
    - './bootstrap'

custom:
  golang:
    cmd: GOOS=linux GOARCH=amd64 go build -o bootstrap main.go

 

 

serverless.yml 파일과 λ”λΆˆμ–΄ ν•΄λ‹Ή νŒŒμΌμ„ μ‹€ν–‰ν•˜λŠ” 슀크립트λ₯Ό μžλ™ν™”ν•œ Makefile 도 μž‘μ„±ν•΄μ£Όμž. 이λ₯Ό ν™œμš©ν•˜λ©΄ 맀번 λΉŒλ“œ 및 배포 λͺ…λ Ήμ–΄λ₯Ό 일일이 μž…λ ₯ν•  ν•„μš”μ—†μ΄ λ‹¨μˆœνžˆ make deploy λͺ…λ Ήλ§ŒμœΌλ‘œ Go μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λΉŒλ“œλΆ€ν„° Serverless Framework 둜 Lambda 에 λ°°ν¬κΉŒμ§€ ν•œνμ— 진행할 수 μžˆλ‹€.

 

Makefile

build:
	GOOS=linux GOARCH=amd64 go build -o bootstrap main.go
	chmod +x bootstrap

deploy: build
	serverless deploy --stage prod

clean:
	rm -f bootstrap

 

 

μ΄λ ‡κ²Œ λ°°ν¬κΉŒμ§€ μ§„ν–‰ν•˜λ©΄ AWS Console μ—μ„œ μ„œλΉ„μŠ€κ°€ 배포된 것을 확인할 수 μžˆλ‹€.

λ‹€λ§Œ μ£Όμ˜ν•  점은 ν•΄λ‹Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ™ΈλΆ€ connection 을 λ§ΊλŠ” 과정이 μ œλŒ€λ‘œ 이루어지지 μ•ŠμœΌλ©΄ 배포에 μ‹€νŒ¨ν•œλ‹€(λ‹Ήμ—°ν•œ μ†Œλ¦¬κΈ΄ 함). κ·Έλž˜μ„œ 배포된 λžŒλ‹€ ν•¨μˆ˜κ°€ μ™ΈλΆ€ connection κ³Ό 잘 μ—°κ²°λ˜λŠ”μ§€, 포트 κ°œλ°©μ€ λ˜μ–΄ μžˆλŠ”μ§€ 잘 확인해봐야 ν•œλ‹€.

 

 

 

κ²°λ‘ 

μ„œλ²„λ¦¬μŠ€ ν”„λ ˆμž„μ›Œν¬λ₯Ό ν™œμš©ν•˜μ—¬ Go μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λžŒλ‹€μ— λ°°ν¬ν•˜λŠ” 과정을 μ •λ¦¬ν–ˆλ‹€. 생각보닀 글이 짧게 λλ‚¬λŠ”λ° 그만큼 μ„œλ²„λ¦¬μŠ€ ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•˜λ©΄ κ°„λ‹¨ν•˜κ²Œ Go μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 배포할 수 μžˆλ‹€. 배포 이외에도 μ„œλ²„λ¦¬μŠ€ ν”„λ ˆμž„μ›Œν¬λ₯Ό 효율적으둜 μ‚¬μš©ν•  수 μžˆλŠ” 방법은 무엇이 μžˆμ„μ§€ μ’€ 더 고민이 ν•„μš”ν•œ 것 κ°™λ‹€. ν˜„μž¬λŠ” λ‹¨μˆœ 배포 μš©λ„λ‘œ μ‚¬μš©μ€‘μΈλ° 이 과정을 μžλ™ν™”ν•˜λŠ”, 예λ₯Ό λ“€μ–΄ Github ACtions 와 μ—°λ™ν•˜μ—¬ 원격 λ ˆν¬μ§€ν† λ¦¬μ— ν‘Έμ‹œν•˜κ±°λ‚˜ main λΈŒλžœμΉ˜μ— 머지할 λ•Œλ§ˆλ‹€ 배포가 λ˜λ„λ‘ κ°œμ„ ν•΄ λ³Ό 수 μžˆκ² λ‹€.