반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

DevOps Tasks

AWS Lambda 와 Golang base64 Encoding 적용하기 본문

GO

AWS Lambda 와 Golang base64 Encoding 적용하기

데밥스 2024. 1. 11. 23:32
728x90
반응형

 


AWS Lambda와 Go 언어를 사용해서 간단한 index.html 파일을 띄울 때. png 파일이 띄워지지 않는다.

개발자 도구로 확인했을 때 .png 파일의 Status Code는 200 OK 로 떨어지지만 제대로 불러오지 못하고 있다.

해당 문제를 해결해보자 !


 

AWS Lambda와 Go 언어를 사용했을 때 텍스트 파일 (. css,. html 등) 은 사용이 가능하지만 바이너리 파일base64로 인코딩하여 문자열로 처리를 해야 한다.

따라서,. css 파일에서. png 파일을 호출할 때 base64 기반으로 인코딩하는 방법을 알아본다.

Go 언어 대한 부분에 들어가기에 앞서 base64 인코딩, 바이너리 파일에 대해서 알아본다.

 


 

Go 에 대해서 궁금하다면 간단히 알아보고 오는 것도 좋다 !

 

 

Go 란?

“At the time, no single team member knew Go, but within a month, everyone was writing in Go and we were building out the endpoints. It was the flexibility, how easy it was to use, and the really cool concept behind Go (how Go handles native concurrency, 

rldnjsdlsi.tistory.com


 

Base 64 

 

Base64는 이진 데이터를 텍스트 형식으로 인코딩하는 방법 중 하나로

이는 이진 데이터를 64개의 ASCII 코드로 구성된 문자열로 변환하는 방식이다.

 

이진 데이터는 0과 1로 이루어진 바이너리 데이터로, 파일, 이미지, 동영상 등이 이진 데이터로 저장된다.

Base64 는 6 bit 씩 끊어서 64가지의 문자로 나타내는 인코딩 방식이다.

여기서 64개의 문자는 대소문자, 알파벳, 숫자, 그리고 ' + ' 와 ' / ' 기호로 구성된다.

이렇게 변환된 문자열은 텍스트 형식으로 저장하거나 전송할 때 사용된다.

 

Base64 Encoding

 

예시로, 이진 데이터의 일부분이 '01101001 01101110 01100110 01101111' 일 때, Base64로 인코딩하면 'aW5 mbw=='와 같이 표현할 수 있다.

Go 언어에서는 'encoding/base64' 패키지를 통해 base64 인코딩 및 디코딩이 가능하다.

해당 패키지를 활용하여 이진 데이터를 텍스트를 변환하거나, 그 반대로 진행할 수 있다.

 

AWS Lambda를 사용해서. png 이미지 같은 특정 파일을 다룰 때, 일반적으로는 그 파일을 base64로 인코딩하여 문자열 형태로 Lambda 함수에 포함시키는 것이 흔한 방식입니다.

AWS Lambda의 실행 환경에서 외부 파일을 효과적으로 다룰 수 있는 방법 중 하나라고 볼 수 있다.

go build 시 Windows에서는. exe 파일, Linux에서는 바이너리 파일이 생성된다.

하지만 AWS Lambda의 경우, 특정 실행 환경을 위해 바이너리를 빌드하면 해당 환경의 실행 파일이 생성된다.

Lambda 함수를 위한 바이너리 파일은 실행 파일 형식을 따른다.

728x90

이런 식으로 base64로 인코딩 된 데이터는 브라우저에서 JavaScript의 atob() 함수를 사용하여 Base64로 인코딩 된 데이터를 디코딩할 수 있다. 

atob() 함수는 ASCII로 인코딩된 문자열을 이진 데이터로 디코딩할 때 사용됩니다.

예를 들어, JavaScript에서

 

var base64Data = "aW5mbw==";
var decodedData = atob(base64Data);
console.log(decodedData);

 

이렇게 하면 decodedData에는 Base64로 인코딩된 데이터가 디코딩된 이진 데이터가 들어가게 된다.

이를 통해 브라우저에서 이미지를 표시하거나 다양한 다른 용도로 사용할 수 있다.

 


 

Go 적용!

func shouldEncodeBase64(contentType string) bool {
    return strings.HasPrefix(contentType, "image/")
}

func HandleRequest(ctx context.Context, request events.ALBTargetGroupRequest) (events.ALBTargetGroupResponse, error) {
    // ...
    
    //
    isBase64Encoded := shouldEncodeBase64(contentType)

    var encodedContent string
    if isBase64Encoded {
        encodedContent = base64.StdEncoding.EncodeToString(content)
    } else {
        encodedContent = string(content)
    }

    return events.ALBTargetGroupResponse{
        StatusCode:        200,
        Body:              encodedContent,
        Headers:           map[string]string{"Content-Type": contentType, "Access-Control-Allow-Origin": "*"},
        IsBase64Encoded:   isBase64Encoded,
        StatusDescription: "OK",
    }, nil
}

Base64 인코딩 조건

shouldEncodeBase64 content-type 이 이미지(예: "image/"로 시작)를 나타내는지 확인하는 함수 생성

 

필요한 경우 Base64 인코딩

함수에서는 조건이 충족되는 경우에만 HandleRequestbase64.StdEncoding.EncodeToStringshouldEncodeBase64

해당 content를 base64로 인코딩

IsBase64 Encoded 콘텐츠가 base64로 인코딩 되었는지 여부를 플래그에 정확하게 반영하여 502 오류를 해결!!

 

728x90
반응형

'GO' 카테고리의 다른 글

AWS Lambda 에 go routine, channel 적용으로 실행 속도 대폭 개선  (0) 2024.01.06
Go 란?  (0) 2023.12.26