Cloud Run 및 GiitHub Action으로 컨테이너 어플리케이션 자동화 디버깅

이 투고는 CA21 Advent Calendar 2020 20일째 글입니다.
소스 코드에서 Cloud Run으로 직접 구축하는 방법
gcloud beta run deploy --source=[DIRECTORY]
이 글은 지원되지 않습니다.
자세한 내용은 Google Cloud의 공식 블로그에 설명되어 있습니다.
https://cloud.google.com/blog/products/serverless/build-and-deploy-an-app-to-cloud-run-with-a-single-command
안녕하세요.
여러분 컨테이너 쓰시나요?
자주 사용합니다.최근의 개발은 거의 모두 Docker 컨테이너를 채택하고 있다.
그러면 컨테이너와 Servales, CI/CD 등의 환경 호환성도 매우 좋습니다.
이 글은 내가 가장 좋아하는 클라우드 런과 GiitHub Actions를 이용해 컨테이너 프로그램을 쉽게 자동화하는 디자인 방법을 소개했다.

Cloud Run


Cloud Run is a managed compute platform that enables you to run stateless containers that are invocable via web requests or Pub/Sub events. Cloud Run is serverless: it abstracts away all infrastructure management, so you can focus on what matters most — building great applications. It is built from Knative. Learn more about the Cloud Run platforms
Cloud Run는 GCP가 관리하는 컨테이너 실행 환경이다.
다음과 같은 피쳐가 있습니다.
  • 웹 요청 또는 Pub/Sub 이벤트에 대한 호출
  • 컨테이너 무상태(무상태)
  • 내부 구조는 Kubbernetes에서 서버 발레를 실현하는 Knative에서
  • 기본적으로 HTTPS에 대응하고 https://xxxxxxxx.a.run.app/같은 URL에서 공개할 수 있음
  • 운행시간이 시작된 기간에만 요금이 발생하는 계량요금제
  • 최근gRPC를 지원하는 서버 스트리밍 등 구글도 상당한 힘을 쏟고 있다.

    GitHub Actions


    GitHub Actions는 GiitHub의 CI/CD 환경을 의미합니다.
    Giit 창고.github/workflows/*.yml에 전용 설정 파일을 설치하면 자동으로 생성, 테스트, 디버깅 등 작업 절차를 할 수 있다.
    GitHub Marketplace 위에서 자신의 액션스를 공개할 수 있는 구조도 있다.

    대상 용기 응용 규격

  • 포트 번호가 지정된 Docker 컨테이너를 엽니다
  • .
  • 상기 포트 번호에 대한 HTTP 요청에 응답하는 서버 측 응용 프로그램을 용기에서 시작합니다
  • 구상적 용례


    위와 같은 앱 개발에서는'main 분기에서push 후 GiitHub Actions를 통해 클라우드 런에 디자인하는 것'이 목표다.
    Cloud Run은 물론 콘솔에서 디자인할 수 있지만 이번에는 CI/CD 작업 흐름에서 디자인할 수 있도록 하겠습니다.

    사전 준비


    GCP 측


  • Cloud Run API 활성화
  • 프로젝트에서 Cloud Run을 사용하려면 API를 활성화해야 합니다.
  • GiitHub Action에 권한이 부여된 서비스 계정 설정
  • 서비스 계정 만들기
  • 발행 서비스 계정 키
  • Cloud Run에게 디버깅에 필요한 권한 부여
  • 디버그에 필요한 권한의 최소 설정


    Cloud Run 관리자
    run.services.create
    run.services.get
    run.services.getIamPolicy
    run.services.setIamPolicy
    run.services.update
    
    Cloud Run 서비스 에이전트
    iam.serviceAccounts.actAs
    storage.objects.get
    storage.objects.list
    
    스토리지 관리자(Container Registry의push에 필요)
    storage.buckets.get
    storage.objects.create
    storage.objects.delete
    storage.objects.get
    storage.objects.list
    

    GiitHub 측

  • GitHub의 Secrets에서 GCP 프로젝트에 대한 정보 설정
  • GiitHub의Encrypted secrets를 통해 창고에 환경 변수를 설정할 수 있습니다.
  • 여기에 설정된 변수는 GiitHub Actions에서 참조합니다.
  • Secrets 설정


    GCP_PROJECT_ID
    GCP_REGION
    GCP_SA_KEY
    PORT
    SERVICE_NAME
    

    설계 워크플로우 설정


    그리고 다음 작업 절차를 설정하면main 지점에서push를 하면 자동으로 클라우드 런으로 설계됩니다.
    deploy.yml
    name: Deploy
    
    on: 
      push:
        branches:
          - main
    
    env:
      SERVICE_NAME: ${{ secrets.SERVICE_NAME }}
      PORT: ${{ secrets.PORT }}
      GCP_PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
      GCP_REGION: ${{ secrets.GCP_REGION }}
      IMAGE: asia.gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.SERVICE_NAME }}:${{ github.sha }}
    
    jobs:
      deploy-to-cloud-run:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout the repository
            uses: actions/checkout@v2
    
          - name: Setup gcloud
            uses: GoogleCloudPlatform/github-actions/setup-gcloud@master
            with:
              version: 'latest'
              project_id: ${{ secrets.GCP_PROJECT_ID }}
              service_account_key: ${{ secrets.GCP_SA_KEY }}
              export_default_credentials: true
    
          - name: Configure docker to use the gcloud cli
            run: gcloud auth configure-docker --quiet
    
          - name: Build a docker image
            run: docker build -t $IMAGE .
    
          - name: Push the docker image to Container Registry
            run: docker push $IMAGE
    
          - name: Deploy to Cloud Run
            run: |
                gcloud run deploy $SERVICE_NAME \
                  --image $IMAGE \
                  --port $PORT \
                  --project $GCP_PROJECT_ID \
                  --region $GCP_REGION \
                  --platform=managed \
                  --allow-unauthenticated \
                  --quiet
    

    GitHub Secrets


    GiitHub의 Encerypted secrets에 설정된 환경 변수는 ${{ secrets.SERVICE_NAME }}처럼 GiitHub Actions에서 참조할 수 있으므로 프로젝트의 은밀한 정보를 쉽게 처리할 수 있습니다.

    setup-gcloud


    GCP 공식의 Actionssetup-gcloud를 사용하여 gcloud CLI 를 설정합니다.
    GCPproject_idservice_account_key만 설정하면 GiitHub Actions 환경에서 gcloud 명령을 실행할 수 있습니다.

    gcloud auth configure-docker


    Container Registry의 인증 정보는 Docker에서 사용하도록 설정되어 있습니다.
    이렇게 하면 docker push $IMAGE 이미지push가 Container Registry에 향할 수 있다.

    Cloud Run으로 설계

    gcloud run deploy 명령을 사용하여 Cloud Run을 디버깅할 수 있습니다.
    Cloud Run에 대한 요청은 대개 8080호 컨테이너로 전송하도록 설정됨--port $PORT처럼 임의의 포트 번호를 설정할 수 있습니다.
    또한 기본적으로 인증되지 않은 접근은 올바르지 않습니다. 모든 접근을 허용하려면 옵션을 사용해야 합니다.
    기타 옵션의 해설은 공식 참조에 양보된다.

    총결산


    Cloud Run과 GiitHub Actions를 사용하여 컨테이너 애플리케이션의 디버깅을 쉽게 자동화할 수 있습니다.
    앱 개발에 집중하고 싶은 사람에게는 꼭 추천하는 방법이다.
    여러분들의 개발 생활이 더욱 풍부해지면 저는 매우 기쁠 것입니다.

    PR


    내정된 Cyber Agent가 22 졸업 엔지니어를 모집하고 있습니다!
    https://www.cyberagent.co.jp/careers/news/detail/id=25511

    좋은 웹페이지 즐겨찾기