GCP 클라우드 런의 개요
개요
공연에 관하여
주의 및 tips
sync.Once
.냉각 가동 시간을 단축하기 위해이미지 축소
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 /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를 사용하지 않습니다.필요 없어.
매개 변수는 바로 여기에 있다
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
보안 정보
...
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 활용
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으로 테스트할 수 있다.서비스 비활성화
그냥 멈출 수 없으니까 롤스/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
}
...
}
저널
서비스에서 보낸 로그입니다.
용기 실례에서 보낸 로그입니다.
수집할 출력 대상
구조화 로그
정해진 형태로 로그를 출력하면 행복해진다.
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)
}
중요도를 지정할 수 있습니다.잘못
Cloud Run에서는 Cloud Error Reporting이 자동으로 적용됩니다.
Error Reporting에 stdout, stderr 등의 로그를 쓴 예외를 표시합니다.
다음 라이브러리는 Cloud Error Reporting 에 직접 전송할 때 사용됩니다.
Cloud Run의 서비스 계정에 보고서를 쓸 수 있는 권한을 부여하고 몇 분 후에 시도해 보십시오.
최후
너무 복잡한 생각 없이 서비스를 제공할 수 있어서 정말 편리해요.컨테이너 디자인을 해야 하기 때문에 응용 프로그램은 어느 정도 자유롭게 발휘할 수 있다.다른 GCP와의 서비스와의 연합도 사용하기 쉽고 편리하다.
Reference
이 문제에 관하여(GCP 클라우드 런의 개요), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/tayusa/articles/74a95f41f00792텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)