Oredemo understand series -Build and deploy Serverless Framework Golang with Docker container

나입니다.

PC에 시코시코 도구를 정돈하는 인생이 힘들어졌습니다.
PC에 부딪히는 것은 Docker와 에디터만으로 좋지 않을까.
빌드와 배포라는 역할은 Docker 컨테이너에 맡겨 버리면 좋지 않을까 하는 것으로,
이번에 처음으로 Serverless Framework를 이용한 Slack app를 Deploy한 경험을,
1억년과 2천년 전부터 몇번 눈에 띄는 재료입니다만 메모를 남겨 두려고 생각합니다.

계기



@T_스미사키에 slack에서 EC2를 멈추거나 긁는다 슬랙 앱 만들고,
막상 자신의 AWS 계정에 빌드 + 배포할까 생각했는데 오라의 macOS에 Golang과 Serverless가 들어 있지 않았다.
앞으로 설정이라든지 흥분됩니다!

오 멘도쿠사.

빌드 및 배포를 컨테이너에 맡기는 구성



PC에 Docker가 들어 있었기 때문에 이렇게 했습니다.
  • 로컬 PC의 디렉토리에 소스 코드를 github에서 clone
  • 소스 코드는 자신이 좋아하는 편집기로 Fuck
  • Golang 코드 빌드는 Golang1.X Docker 컨테이너에 맡긴다
  • Serverles 애플리케이션의 Deploy는 serverless Docker 컨테이너에 맡긴다



  • 로컬 PC와 컨테이너 데이터 공유



    로컬 PC에 git clone 한 repository 디렉토리는 Docker Volume에서 공유합니다.
    Docker 컨테이너에서 빌드 실행/Serverless 애플리케이션을 배포할 수 있습니다.

    Docker 컨테이너를 사용한 Golang 빌드


  • -v에서 로컬 PC의 소스 코드 디렉토리를 Docker 컨테이너의 /go/src/app와 공유
  • --rm에서 Docker 컨테이너를 실행 한 후 이미지 삭제
  • cd <repository>
    docker run --rm -v "$PWD":/go/src/app -w /go/src/app awscli-command:latest make dep-ensure
    

    Docker 컨테이너를 사용하여 Serverless 애플리케이션 배포



  • Dockerhub에 게시된 serverless 컨테이너 사용
  • serverless 컨테이너 시작시 로컬 PC ~/.aws/credentials-v에서 공유
  • serverless 컨테이너 시작시 로컬 PC의 소스 코드 디렉토리를 -v에서 공유
  • ~/.aws/credentials 항목에 배포 대상 AWS 계정을 지정하도록 AWS_PROFILEAWS_DEFAULT_REGION-e 옵션으로 지정
  • -rm에서 Docker 컨테이너를 실행 한 후 이미지 삭제

  • ※로컬 PC 또한 docker save 로 컨테이너를 export 하는 것은 아니지만 ~/.aws/credentials 를 공유하는 것이 이 방법은 saml2aws 를 serverless 컨테이너에 넣어 임시적인 토큰을 건네버리면 좋다고 생각합니다.
    cd <repository>
    docker run --rm -v ${HOME}/.aws/credentials:/root/.aws/credentials -v ${PWD}:/go/src/app \
    -e AWS_PROFILE=${aws_profile} -e AWS_DEFAULT_REGION=${region} \
    -w /go/src/app \
    softinstigate/serverless sls deploy
    

    Docker로 wrapping 한 인수 긴 문제를 어떻게 할까



    Docker 컨테이너에서 Golang 빌드와 Serverless Framework 배포를 구현할 수 있습니다.
    인수가 길고 건초염이 되는 문제가 남아 있습니다.
    이 여러 번 반복되는 내용은 Makefile에서 해결됩니다.

    인수 길고 매운 문제는 예를 들어
    Golang 용 컨테이너 빌드 또는 ...
    docker build -f Dockerfile . -t awscli-command:latest
    

    dep의 종속성 해결이거나 ..
    docker run --rm -v "$PWD":/go/src/app -w /go/src/app awscli-command:latest make dep-ensure
    

    Golang의 빌드이거나 ...
    docker run --rm -v "$PWD":/go/src/app -w /go/src/app awscli-command:latest make build-golang
    

    Serverless deploy이거나 ...
    docker run --rm -v ${HOME}/.aws/credentials:/root/.aws/credentials -v ${PWD}:/go/src/app \
    -e AWS_PROFILE=${aws_profile} -e AWS_DEFAULT_REGION=${region} \
    -w /go/src/app \
    softinstigate/serverless sls deploy
    

    자주 사용하는 명령은 shell history가 아닌 Makefile에 보관합니다.
  • Makefile
  • aws_profile = default
    region = us-east-1
    
    build-docker-golang:
        docker build -f Dockerfile . -t awscli-command:latest
    dep-ensure:
        dep ensure
    build-golang:
        go get github.com/aws/aws-lambda-go/lambda
        env GOOS=linux go build -ldflags="-s -w" -o bin/igniter handler/igniter/main.go
        env GOOS=linux go build -ldflags="-s -w" -o bin/interaction handler/interaction/main.go
    
    run-dep-ensure:
        docker run --rm -v "$PWD":/go/src/app -w /go/src/app awscli-command:latest make dep-ensure
    
    run-build:
    ifeq ($(OS),Windows_NT)
    # for Windows(ToDo: get folder path)
        docker run --rm -v "$PWD":/go/src/app -w /go/src/app awscli-command:latest make build-golang
    else
        docker run --rm -v "$PWD":/go/src/app -w /go/src/app awscli-command:latest make build-golang
    endif
    
    sls-deploy: 
        docker run --rm -v ${HOME}/.aws:/root/.aws -v ${PWD}:/go/src/app \
        -e AWS_PROFILE=${aws_profile} -e AWS_DEFAULT_REGION=${region} \
        -w /go/src/app \
        softinstigate/serverless sls deploy
    
  • Golang 빌드
  • $ make build-docker-golang
    $ make run-dep-ensure
    $ make run-build
    
  • Serverless 응용 프로그램 배포
  • $ make sls-deploy aws_profile=MYAWSPROFILE region=ap-northeast-1
    

    이제 Docker와 에디터가 들어 있는 PC라면 Serverless Lambda Golang인 환경의 빌드와 배포를 실현할 수 있게 되었습니다.

    지금 더 편리하지만 네 컨테이너.

    라는 것으로 awscli slack app의 UI 괴롭힌다.
    finish

    좋은 웹페이지 즐겨찾기