GCP 클라우드 런의 개요

26780 단어 GCPCloudRuntech

개요

  • 완벽하게 관리되는 서버 플랫폼 없음비즈니스에 따라 자동으로 배율이 조정됩니다.
  • 용기를 포장하기 때문에 언어는 자유롭다.
  • Cloud Build 및 Cloud Logging과 결합하여 디버깅과 로그 수집이 용이합니다.
  • 요금을 계량하다.요청이 처리되는 동안 요청 대상입니다.
  • 간단한 마이크로 서비스를 구성하기에 매우 적합하다.복잡한 구성 관리가 필요하다면, GKE.

    공연에 관하여


    주의 및 tips

  • 응답을 되돌릴 때 실례적인 CPU 접근이 잘못되거나 제한되어 백엔드에서 처리되지 않습니다.
  • 스토리지를 사용하기 때문에 임시 파일을 삭제합니다.
  • 동적 유형 언어의 경우 라이브러리의 수량을 최소화한다.그리고 라이브러리는 읽기가 지연됩니다.냉각 가동 시간을 단축하기 위해
  • 실례가 재사용되기 때문에 전역 변수를 사용하여 한 번에 초기화합니다.GSC에서 파일을 읽고 DB에 연결합니다.요청의 지연을 줄이기 위해
  • 사용 빈도가 낮은 전역 변수의 초기화를 지연시킨다.골랑이라면sync.Once.냉각 가동 시간을 단축하기 위해
  • gcloudignore를 통해 구축에 필요하지 않은 파일을 제거하고 업로드 시간을 최적화합니다.
  • 이미지 축소


    alpine,distroless,scratch를 이용합니다.
    구축이 도구에 의존하면 다단계 구축을 사용합니다.
    Dockerfile
    FROM golang:1.15-alpine as builder
    
    WORKDIR /app
    
    COPY go.mod ./
    COPY go.sum ./
    RUN go mod download
    
    COPY . ./
    
    RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags "-s -w" -mod=readonly -v -o server
    
    FROM alpine:3.12.2
    
    COPY --from=builder /app/server /app/server
    
    CMD ["/app/server"]
    

    캐시 사용


    -- 캐치-from 캐시를 활용한다.
    처음 구축할 때pull가 되지 않아서 오류를 처리합니다.
    cloudbuild.yaml
    steps:
    - name: 'gcr.io/cloud-builders/docker'
      entrypoint: 'bash'
      args: ['-c', 'docker pull $_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:latest || exit 0']
    - name: 'gcr.io/cloud-builders/docker'
      args: [
                'build',
                '-t', '$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:latest',
                '--cache-from', '$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:latest',
                '.'
            ]
    ...
    images:
      - '$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:latest'
    ...
    
    아니면 카니코 캐시로.
    Kaniko로 구축하면 등록표에 바로 업로드되기 때문에 push를 사용하지 않습니다.필요 없어.
    매개 변수는 바로 여기에 있다
    https://github.com/GoogleContainerTools/kaniko#additional-flags
    cloudbuild.yaml
    steps:
      - name: 'gcr.io/kaniko-project/executor:latest'
        args:
        - --dockerfile=Dockerfile
        - --destination=$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:latest
        - --cache=true
        - --cache-ttl=24h
    

    보안 정보

  • 정기적으로 재건하고 최신을 유지한다.
  • 루트 이외의 사용자를 사용합니다.
  • Dockerfile
    ...
    ARG USER=docker
    # alpineなのでadduser。debianやcentosならuseradd
    RUN adduser --uid 60001 --no-create-home --disabled-password ${USER} \
          && echo ${USER}:${USER} | chpasswd
    USER ${USER}
    ...
    

    Secret Manager 활용


    https://cloud.google.com/secret-manager
    Cloud Build에서 Secret Manager에서 기밀 데이터를 제거하여 Cloud Run의 Docker 이미지로 전송합니다.
    단계가 실행될 때 작업 디렉터리를 계속 사용할 수 있기 때문에 임시 파일을 저장하고 다음 단계에서 사용할 수 있습니다.기본 디렉토리/workspace
    텍스트 파일에 비밀을 저장하고 Docker를 구성할 때 매개변수로 전송합니다.
    entrypoint를 조개껍질로 만들지 않으면 사용할 수 없습니다. ($)
    cloudbuild.yaml
    steps:
      - name: gcr.io/cloud-builders/gcloud
        entrypoint: 'bash'
        args: [ '-c', "echo a_api_key=$(gcloud secrets versions access latest --secret=a_api_key) > secrets.txt" ]
      - name: gcr.io/cloud-builders/gcloud
        entrypoint: 'bash'
        args: [ '-c', "echo b_api_key=$(gcloud secrets versions access latest --secret=b_api_key) >> secrets.txt" ]
      - name: gcr.io/cloud-builders/docker
        args: [ '-c', "docker build --no-cache -t $_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:latest .
                        -f Dockerfile $(cat secrets.txt | sed 's/^/--build-arg /')" ]
        id: Build
        entrypoint: bash
    ...
    
    Dockerfile
    ...
    ARG a_api_key
    ARG b_api_key
    ...
    
    실행할 때 사용할 때.환경 변수에 넣으면 안 된다.
    Cloud Run의 서비스 계정 역할을 사용하여 기밀 관리자에 액세스해야 합니다.
    package main
    
    import (
    	"context"
    	"fmt"
    	"os"
    
    	secretmanager "cloud.google.com/go/secretmanager/apiv1"
    	secretmanagerpb "google.golang.org/genproto/googleapis/cloud/secretmanager/v1"
    )
    
    func fetchSecret(ctx context.Context, name string) (string, error) {
    	path := fmt.Sprintf(
    		"projects/%s/secrets/%s/versions/latest",
    		os.Getenv("PROJECT_ID"), name)
    
    	client, err := secretmanager.NewClient(ctx)
    	if err != nil {
    		return "", fmt.Errorf("failed to create secretmanager client: %v", err)
    	}
    
    	req := &secretmanagerpb.AccessSecretVersionRequest{
    		Name: path,
    	}
    
    	res, err := client.AccessSecretVersion(ctx, req)
    	if err != nil {
    		return "", fmt.Errorf("failed to access secret version: %v", err)
    	}
    
    	return string(res.GetPayload().GetData()), nil
    }
    

    개발 및 활용 정보


    되돌아오다


    gcloud run services update-traffic サービス名 --to-revisions リビジョン名=100
    

    테스트 환경


    gcloud beta run deploy myservice --image イメージURL --no-traffic --tag stg
    
    라벨이 없는 상황에서 업무를 해제 처리할 때 https://stg---hoge.run.app와 같은 URL으로 테스트할 수 있다.
    https://cloud.google.com/run/docs/rollouts-rollbacks-traffic-migration?hl=ja#deploy-with-tags

    서비스 비활성화


    그냥 멈출 수 없으니까 롤스/run.잘못된 invoker(Cloud Run 부트 소스)를 제거합니다.인증되지 않은 경우 allUsers를 취소합니다.

    누적된 개정판


    사용하지 않은 개정판은 자원을 소모하지 않기 때문에 비용이 발생하지 않는다.
    최대 1000개가 상한선을 초과하면 자동으로 낡은 것에서 삭제됩니다.

    인증 정보


    개발자


    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}
    

    서비스 룸


    Cloud Pub/Sub와 Cloud Scheduller의 접근을 직접 검증하면 idc 영패를 구글 서버에 던져서 검증할 수 있습니다.
    func verifyGoogleIdToken(idToken string) (bool, error) {
    	const endpoint = "https://www.googleapis.com/oauth2/v1/tokeninfo"
    	u, err := url.Parse(endpoint)
    	if err != nil {
    		return false, err
    	}
    
    	q := u.Query()
    	q.Set("id_token", idToken)
    	u.RawQuery = q.Encode()
    
    	res, err := http.Get(u.String())
    	if err != nil {
    		return false, err
    	}
    	defer res.Body.Close()
    
    	if res.StatusCode == 200 {
    		return true, nil
    	}
    	return false, nil
    }
    
    func main(w http.ResponseWriter, r *http.Request) {
    	...
    	idToken := strings.Split(r.Header.Get("Authorization"), " ")[1]
    	if bool, err := verifyGoogleIdToken(idToken); err != nil {
    		log.Fatal(err)
    	} else if !bool {
    		w.WriteHeader(http.StatusForbidden)
    		log.Println("The verification is not correct.")
    		return
    	}
    	...
    }
    

    저널

  • 요청 로그
    서비스에서 보낸 로그입니다.
  • 용기 로그
    용기 실례에서 보낸 로그입니다.
  • 수집할 출력 대상

  • 표준 출력, 표준 오류 출력
  • /var/log
  • syslog(/dev/log)
  • https://godoc.org/cloud.google.com/go/logging
  • 구조화 로그


    https://cloud.google.com/run/docs/logging?hl=ja#writing_structured_logs
    정해진 형태로 로그를 출력하면 행복해진다.
    type LogEntry struct {
    	Message  string `json:"message"`
    	// 重要度
    	Severity string `json:"severity,omitempty"`
    	// ログをまとめるために
    	// r.Header.Get("X-Cloud-Trace-Context")とProject IDから作成する
    	Trace    string `json:"logging.googleapis.com/trace,omitempty"`
    }
    
    // Stringerインターフェイスを実装
    func (l LogEntry) String() string {
    	if e.Severity == "" {
    		e.Severity = "INFO"
    	}
    	out, err := json.Marshal(e)
    	if err != nil {
    		log.Printf("json.Marshal: %v", err)
    	}
    	return string(out)
    }
    
    중요도를 지정할 수 있습니다.
  • DEFAULT
  • DEBUG
  • INFO
  • NOTICE
  • WARNING
  • ERROR
  • CRITICAL
  • ALERT
  • EMERGENCY
  • 트레이스로 일지를 정리하면 간단하고 알기 쉽다.요청과 관련된 용기 로그와 요청 로그를 붙여서 표시합니다.

    잘못


    Cloud Run에서는 Cloud Error Reporting이 자동으로 적용됩니다.
    Error Reporting에 stdout, stderr 등의 로그를 쓴 예외를 표시합니다.
    다음 라이브러리는 Cloud Error Reporting 에 직접 전송할 때 사용됩니다.
    https://godoc.org/cloud.google.com/go/errorreporting
    Cloud Run의 서비스 계정에 보고서를 쓸 수 있는 권한을 부여하고 몇 분 후에 시도해 보십시오.

    최후


    너무 복잡한 생각 없이 서비스를 제공할 수 있어서 정말 편리해요.컨테이너 디자인을 해야 하기 때문에 응용 프로그램은 어느 정도 자유롭게 발휘할 수 있다.다른 GCP와의 서비스와의 연합도 사용하기 쉽고 편리하다.

    좋은 웹페이지 즐겨찾기