Go 및 Cloud Functions로 이미지 크기 조정

이동 + 서버리스 = ❤️



현재 Google Cloud Platformsupports Go 1.11 for Cloud functions . Go와 Serverless는 제가 요즘 매우 좋아하는 두 가지이므로 이 새로운 GCP 기능을 사용해보고 disintegration/imaging 패키지를 사용하여 순수 Go에서 기본 이미지 크기 조정기를 빌드하기로 결정했습니다.

고퍼 크기 조정



때로는 너무 커서 웹사이트에 표시할 수 없는 고퍼 이미지가 있을 수 있습니다. 그들은 사용자의 소중한 대역폭을 먹어치울 것입니다! 이 거대한 것과 같이:

gopherize.me를 사용하여 생성된 빅 고퍼

그래서 우리는 이것을 더 작고 더 합리적인 고퍼로 변환할 것입니다.

스몰 고퍼

이를 달성하기 위해 구축할 것은 다음과 같은 방식으로 호출할 수 있는 엔드포인트가 있는 클라우드 기능입니다.

https://{region}-{프로젝트 이름}._cloudfunctions.net/ResizeImage?_url={url}&height={높이}&width={폭}

이미지 URL, 원하는 너비 및 높이와 함께 HTTP GET 요청을 보내고 HTTP 응답 본문에서 JPEG 형식의 이미지를 받습니다.

설정



따라 하려면 개발자 상자에 Go 1.11이 설치되어 있어야 하고 Google Cloud Platform 계정과 gcloud 명령줄 도구setup가 있어야 합니다.

로컬에서 탐색/복제하고 읽으면서 테스트하려는 경우 github repo을 설정했습니다.

ResizeImage 클라우드 기능



우리가 사용할 클라우드 함수는 HTTP 함수입니다. 이 클라우드 기능 유형은 추가 API 게이트웨이 없이 코드에 대한 HTTPS 끝점을 제공하므로 사용 사례에 매우 편리합니다. 다른 클라우드 함수 유형: 백그라운드 함수는 Pub/Sub 또는 Cloud Storage 이벤트와 같은 이벤트에 의해 트리거될 수 있습니다. 오늘은 이것을 사용하지 않겠지만 이미지 캐싱, 주기적으로 캐시 정리 등과 같은 다른 작업에 유용할 수 있습니다. 향후 기사에서 배경 기능에 대해 쓸 수도 있습니다.

ResizeImage 함수는 다음 작업을 수행해야 합니다.
  • 쿼리 문자열을 url, 높이 및 너비로 구문 분석합니다
  • .
  • 원본 이미지 가져오기
  • 이미지 크기 조정
  • 출력 이미지를 Jpg로 인코딩합니다
  • .
  • HTTP 응답 스트림에 인코딩된 출력 이미지 쓰기

  • 간단하게 하기 위해 모든 코드를 단일 파일에 포함했습니다. 파일명은 중요하지 않습니다.




    지원되는 종속 항목과 함께 go.mod 파일도 포함했습니다.



    이 모든 것을 클라우드로 푸시하기 위해 gcloud 도구를 사용하고 배포하려는 기능의 이름을 지정합니다. 이 경우에는 go 함수입니다.



    ResizeImage(w http.ResponseWriter, r \*http.Request)
    


    위 코드의 ResizeImage 함수는 배포할 수 있도록 올바른 서명을 가지고 있습니다. Go 표준 라이브러리의 http.HandlerFunc이라는 것을 알 수 있습니다.



    _$ gcloud functions deploy ResizeImage --runtime go111 --trigger-http_
    
    Deploying function (may take a while - up to 2 minutes)...done.                                                                                                                                                                
    availableMemoryMb: 256
    entryPoint: ResizeImage
    httpsTrigger:
      url: [https://xxx.cloudfunctions.net/ResizeImage](https://us-central1-gcf-go-image-resizer.cloudfunctions.net/ResizeImage)
    


    함수가 배포되고 엔드포인트 URL이 반환됩니다. 빅 고퍼 이미지가 등장합니다!



    지역 개발



    이 코드를 작성하면서 테스트하기 위해 local development server을 사용하여 핸들러를 실행했습니다. 개발하는 동안 테스트에 약간의 변경을 할 때마다 재배포하는 것이 상당히 불편할 것이고 로컬 Golang 클라우드 기능 에뮬레이터도 찾을 수 없었습니다(node.js emulator가 있으므로 Go 버전이 계획되어 있기를 바랍니다.). 그러나 로컬 서버를 통한 설정은 이 간단한 기능에 매우 적합했습니다.



    다음 단계



    간단한 예시이지만 Cloud Functions에서 Golang을 시작하는 데 도움이 되기를 바랍니다. 이 프로젝트를 프로덕션 준비 상태로 만들고자 할 경우 취할 수 있는 다음 단계의 몇 가지 예는 다음과 같습니다.



    • 단위 테스트 추가
    • 입력 이미지를 캐시합니다
    • .
    • 출력 이미지를 캐시합니다
    • .
    • 인증 추가

    • Benchmark resizing libraries 가장 빠른 대안 찾기


    읽어주셔서 감사합니다. 크기를 조정해 주셔서 감사합니다!



    Github 저장소: https://github.com/didil/gcf-go-image-resizer

    좋은 웹페이지 즐겨찾기