> 백엔드 개발 > Golang > Google Cloud Run에 서버리스 애플리케이션 배포

Google Cloud Run에 서버리스 애플리케이션 배포

Susan Sarandon
풀어 주다: 2024-11-19 18:23:02
원래의
517명이 탐색했습니다.

소개

이 가이드에서는 현재 AWS에 있는 Twitch의 TeoMeWhy 시스템에서 컨테이너를 배포하고 GCP에 배치하겠습니다.

AWS의 현재 구조
Implantando Aplicações Serverless no Google Cloud Run

GCP의 아키텍처

Implantando Aplicações Serverless no Google Cloud Run

복잡한 자동화 도구는 사용되지 않으며 Github과 통합하고 메인에 커밋할 때마다 이미지를 배포하는 등 모든 작업이 콘솔을 통해 수행됩니다.
우리는 다음을 사용할 것입니다:

  • Cloud Run - 웹 애플리케이션용
  • Cloud SQL - MySQL 데이터베이스용
  • GCE - 테오메봇을 실행하려면
  • 클라우드 스토리지 - 개체 스토리지(S3)
  • Cloud Build - 애플리케이션 배포 생성
  • Secret Manager - 애플리케이션 자격 증명을 안전하게 저장하세요.

신청서 받기

  1. TeoMeWhy의 GitHub와 프로젝트 관련 애플리케이션 포크를 방문해 보세요.
  2. 저장소 페이지에서 별표를 클릭한 다음 포크를 클릭하세요. Implantando Aplicações Serverless no Google Cloud Run
  3. 포크 페이지에서 포크에 이름을 지정하고 포크 만들기를 클릭하세요. Implantando Aplicações Serverless no Google Cloud Run
  4. 전체 환경을 복제하려면 프로젝트의 다른 저장소에 대해 프로세스를 반복하세요.
  5. GCP로 보내기 전에 포크클론을 만들어 필요에 따라 애플리케이션을 조정하세요.
git clone git@github.com:cslemes/points-to-go.git
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

컨테이너 이미지를 생성하기 위한 Dockerfile 생성

복제된 저장소 폴더로 이동합니다. 저장소에는 이미 Docker용으로 설계된 Dockerfile이 포함되어 있습니다. 분석해 보겠습니다.

```
FROM golang:latest
WORKDIR /app/
COPY . .
RUN go build main.go
CMD ["./main"]
```
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

이 Dockerfile은 작동하지만 다단계 빌드를 사용하여 최적화하여 최종 이미지의 크기를 줄입니다. Go에는 외부 종속성이 필요하지 않으므로 스크래치와 같은 최소한의 기본 이미지를 사용할 수 있습니다.

  1. 빌드 이미지를 더 가벼운 버전으로 바꾸고 다른 단계에서 참조할 수 있도록 이름을 지정하세요.

    FROM golang:1.23.1-alpine3.20 AS build
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
  2. go mod 다운로드 명령을 추가하여 종속성을 캐시하고 go mod 확인을 통해 go.sum. 파일의 체크섬
    과 일치하는지 확인하세요.

    RUN go mod download && go mod verify
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
  3. 프로덕션을 위해 바이너리를 최적화하려면 아래 매개변수를 추가하세요.

    • CGO_ENABLED=0: CGO 지원을 비활성화합니다. CGO는 C 코드를 호출할 수 있게 해주는 Go의 기능이지만 이를 비활성화하면 외부 라이브러리에 대한 종속성이 없는 완전히 정적 바이너리를 얻게 됩니다.
    • GOARCH=amd64: 컴파일할 대상 아키텍처를 설정합니다. amd64는 대부분의 최신 서버 및 데스크탑과 같은 64비트 프로세서가 장착된 시스템에 사용되는 아키텍처입니다.
    • GOOS=linux: 컴파일할 대상 운영 체제를 정의합니다. 여기서는 Linux용으로 구성되었습니다. 즉, 생성된 바이너리가 Linux 시스템에서 실행 가능하다는 의미입니다.
    • go build -o /app/points: 코드를 컴파일하고 바이너리를 지정된 경로(/app/points)에 저장합니다.
    • -a: 변경되지 않은 경우에도 종속성을 포함하여 모든 패키지를 강제로 다시 컴파일합니다. 모든 것이 새로운 플래그와 설정으로 다시 컴파일되는지 확인하는 것이 유용할 수 있습니다.
    • -ldflags="-s -w": 크기 최적화 플래그입니다.
    • -s는 바이너리에서 디버그 기호 테이블을 제거합니다.
    • -w는 스택 추적 정보를 제거합니다. 이러한 옵션은 최종 바이너리의 크기를 줄입니다.
    • -installsuffix cgo: CGO가 비활성화된 바이너리를 구별하기 위해 설치 디렉터리에 접미사를 추가합니다. 이렇게 하면 CGO를 사용하는 바이너리와의 충돌을 피할 수 있습니다.
    git clone git@github.com:cslemes/points-to-go.git
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
  4. (선택 사항) 이미지를 더 작게 만들기 위해 upx를 사용하여 바이너리를 압축할 수 있습니다. upx(Ultimate Packer for eXecutables)는 실행 가능한 바이너리를 압축하여 Go 바이너리와 같은 파일 크기를 줄이는 도구입니다. 빌드 시간이 길어지고 컨테이너 시작 지연도 길어지므로 구현에 가장 유리한 것이 무엇인지 평가해야 합니다. 이미 Cold Start가 있는 Cloud Run에서 사용하는 것이 목적이므로, 사용하지 않을 때는 컨테이너를 일시정지하고, 컨테이너 초기화 시간이 늘어나므로 사용하지 않겠습니다.

    ```
    FROM golang:latest
    WORKDIR /app/
    COPY . .
    RUN go build main.go
    CMD ["./main"]
    ```
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
  • upx --ultra-brute -qq points: 가능한 모든 압축 옵션을 사용하고 출력 메시지를 표시하지 않고 포인트 바이너리를 적극적으로 압축합니다.
  • upx -t 포인트: 압축된 바이너리가 여전히 올바르게 작동하는지 테스트합니다.
  • 이제 바이너리가 준비되었으므로 바이너리를 깨끗한 이미지로 복사하는 두 번째 단계를 수행해 보겠습니다.

    FROM golang:1.23.1-alpine3.20 AS build
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    • 스크래치는 운영 체제나 종속성이 전혀 없는 완전히 비어 있는 이미지를 나타내는 Docker의 특수 기본 이미지입니다. FROM 스크래치를 사용하는 것은 정적 바이너리로 충분한 Go 애플리케이션의 미니멀리스트 이미지에서 일반적입니다.
  • 전체 파일

    git clone git@github.com:cslemes/points-to-go.git
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
  1. 빌드 비교
  2. Dockerfile 최적화 및 upx 사용으로 인해 이미지가 최대 3배 작아집니다.
  3. Trivy를 사용한 원본 이미지 분석에서는 904개의 CVE가 표시되는 반면, 스크래치 이미지에는 CVE가 없습니다.
Imagem Tipo Tamanho
points-to-go Otimizado 14MB
points-to-go Com upx 5.77MB
points-to-go original 1.76GB

Implantando Aplicações Serverless no Google Cloud Run

  1. 다른 저장소에 대해 이 설정을 반복합니다.

데이터베이스 배포

  1. 콘솔 사이드 메뉴에서 SQL에 접속하세요. Implantando Aplicações Serverless no Google Cloud Run
  2. 또는 검색창에서 "SQL"을 검색하고 목록에서 SQL을 선택하세요. Implantando Aplicações Serverless no Google Cloud Run
  3. Cloud SQL 페이지에서 인스턴스 생성을 클릭하고 MySQL을 선택합니다. Implantando Aplicações Serverless no Google Cloud Run
  4. 수정 중인 Enterprise를 선택하세요.
  5. '사전 설정 편집'에서 샌드박스를 선택하세요.
  6. 데이터베이스 버전은 MySQL 8.0에 그대로 두세요. Implantando Aplicações Serverless no Google Cloud Run
  7. 인스턴스 ID에서 인스턴스 이름을 지정하고 비밀번호를 설정하세요.
  8. 비밀번호 정책을 확장하여 비밀번호 정책을 지정할 수 있습니다. Implantando Aplicações Serverless no Google Cloud Run
  9. 존과 지역을 정의하면 단일 존에 남겨두겠습니다. Implantando Aplicações Serverless no Google Cloud Run
  10. 맞춤형 인스턴스에서는 필요에 따라 하드웨어를 조정할 수 있으며 옵션은 선택한 버전에 따라 달라집니다.
  11. 필요에 따라 CPU를 1로, 디스크를 10GB로 조정합니다. Implantando Aplicações Serverless no Google Cloud Run
  12. 연결에서 Public IP를 체크 해제하고 Private IP를 체크하세요.
  13. 비공개 액세스 연결에서 연결 구성을 클릭하세요.
  14. 자동 할당 범위 사용을 선택하세요.
  15. 계속을 클릭하세요.
  16. 연결 만들기를 클릭하세요. Implantando Aplicações Serverless no Google Cloud Run
  17. 인스턴스 생성을 클릭하고 생성될 때까지 기다립니다. Implantando Aplicações Serverless no Google Cloud Run
  18. 인스턴스에 연결하려면 Cloud Shell을 활성화하고 다음을 실행하세요.

    git clone git@github.com:cslemes/points-to-go.git
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사

Implantando Aplicações Serverless no Google Cloud Run

  1. 이전 단계에서 설정한 비밀번호를 입력하세요.
  2. Cloud Shell이 ​​프라이빗 VPC에 액세스할 수 없기 때문에 연결 오류가 발생합니다. Implantando Aplicações Serverless no Google Cloud Run
  3. Cloud Shell을 통한 연결을 단순화하기 위해 인스턴스를 편집하고 퍼블릭 IP를 표시해 보겠습니다. 부록에서는 VPC 피어링을 생성하여 을 통해 DB에 액세스하는 방법을 보여드리겠습니다. >클라우드 셸 Implantando Aplicações Serverless no Google Cloud Run
  4. 다시 연결해 보세요. Implantando Aplicações Serverless no Google Cloud Run
  5. 애플리케이션 데이터베이스 생성:

    ```
    FROM golang:latest
    WORKDIR /app/
    COPY . .
    RUN go build main.go
    CMD ["./main"]
    ```
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
  6. Cloud Shell에는 여전히 VSCode 기반의 텍스트 편집기가 있으며 이를 통해 직접 일부 작업을 수행할 수 있으며 /home에 5GB의 영구 볼륨이 있습니다. 하드웨어는 1vCPU 및 1.7GB RAM을 갖춘 e2-소형 VM입니다.
    Implantando Aplicações Serverless no Google Cloud Run

Cloud Run에서 컨테이너 만들기

  1. Google Cloud 콘솔의 사이드 메뉴나 검색창을 통해 Cloud Run에 액세스하세요. Implantando Aplicações Serverless no Google Cloud Run
  2. Cloud Run 페이지에서 컨테이너 배포를 클릭하고 서비스 옵션을 선택합니다. Implantando Aplicações Serverless no Google Cloud Run
  3. 배포 방법 선택
  4. 서비스 배포에는 세 가지 옵션이 있습니다.
    • 레지스트리의 컨테이너 이미지를 사용하세요.
    • 저장소에 직접 연결하세요.
    • 함수를 생성합니다(Run과 통합된 Cloud Functions 사용).
  5. 이 가이드에서는 GitHub을 통한 지속적 배포를 선택하여 Google이 CI/CD 파이프라인을 자동으로 구성할 수 있도록 합니다.
  6. Cloud Build로 구성을 클릭하세요.
    Implantando Aplicações Serverless no Google Cloud Run

  7. GitHub 연결 구성

  8. Google과 GitHub의 통합을 활성화하려면 인증을 클릭하세요.

  9. 모든 저장소에 대한 액세스 허용 또는 특정 저장소에 대한 액세스 허용 중에서 선택하여 액세스를 승인합니다.

  10. 로그인 완료 후 다음을 클릭하세요.
    Implantando Aplicações Serverless no Google Cloud Run

  11. 빌드 유형 선택

  12. 빌드 단계에서 Dockerfile 또는 지원 애플리케이션과 GCP의 빌드팩 사용 중에서 선택하세요.

  13. Dockerfile을 선택하고 필요한 경우 경로/파일 이름을 조정하세요
    Implantando Aplicações Serverless no Google Cloud Run

  14. 서비스 설정

  15. 다음 매개변수를 구성합니다.

    • 인증: 인증되지 않은 통화 허용을 선택하세요.
    • CPU 할당: 요청 처리 중에만 CPU가 할당됩니다를 선택합니다.
    • 입력 제어: 내부를 선택합니다. Implantando Aplicações Serverless no Google Cloud Run
  16. 용도에 맞게 컨테이너 포트를 조정하세요.
    Implantando Aplicações Serverless no Google Cloud Run

  17. 보안 탭의 서비스 계정에서 새 서비스 계정
    만들기를 클릭하세요. Implantando Aplicações Serverless no Google Cloud Run

  18. 역할 추가

    • 스토리지 개체 ​​관리자
    • Cloud Run 관리자
    • 비밀관리자 비밀고문
    • 클라우드 SQL 클라이언트
    • 클라우드 빌드 서비스 계정
    • 아티팩트 등록 기록기
    • 서비스 계정 사용자 Implantando Aplicações Serverless no Google Cloud Run
  19. 애플리케이션 코드를 분석하려면 환경 변수를 데이터베이스에 전달해야 합니다.

    git clone git@github.com:cslemes/points-to-go.git
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
  20. 애플리케이션 코드를 Unix 소켓을 사용하는 Cloud Sql 표준으로 변경해야 하며, Cloud Run은 DB에 직접 접근하지 않고 Cloud SQL 인증 프록시를 사용합니다.

    ```
    FROM golang:latest
    WORKDIR /app/
    COPY . .
    RUN go build main.go
    CMD ["./main"]
    ```
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
  21. 컨테이너에서 변수 및 비밀 탭으로 이동하여 변수 추가를 클릭하세요.

  22. 필요한 변수를 추가하세요.

  23. 은행 주소는 PROJECT_ID:REGION:INSTANCE_NAME 패턴을 따르며 아래 항목 16에서 이름을 확인할 수도 있습니다.
    Implantando Aplicações Serverless no Google Cloud Run

  24. 비밀 참조에 입력할 은행 비밀번호

  25. 새 비밀 생성 옵션이 비활성화된 경우 API를 활성화해야 하기 때문입니다.

  26. 새 비밀 만들기를 클릭하세요
    Implantando Aplicações Serverless no Google Cloud Run

  27. 비밀 이름을 정의하고 비밀 생성을 클릭하세요
    Implantando Aplicações Serverless no Google Cloud Run

  28. Cloud SQL Connections에 우리가 만든 은행의 URL을 추가합니다
    Implantando Aplicações Serverless no Google Cloud Run

  29. 애플리케이션 스키마를 생성하려면 코드에서 migrations=true 인수를 전달해야 합니다.

  30. 함수 인수에 migrations=true를 추가한 후 다음 컨테이너 개정에서는 이를 제거할 예정입니다.
    Implantando Aplicações Serverless no Google Cloud Run

  31. 다른 필드는 기본값으로 두고 만들기를 클릭하세요
    Implantando Aplicações Serverless no Google Cloud Run

  32. Thunder Client를 사용하여 애플리케이션을 테스트합니다.

  33. 클라이언트 생성
    Implantando Aplicações Serverless no Google Cloud Run

  34. 등록고객 읽기
    Implantando Aplicações Serverless no Google Cloud Run

테오메봇 서비스 생성

챗봇은 Cloud Run에 배포되지 않으며 Google Compute Engine(GCE)에 설치됩니다. Cloud Run과 달리 Compute Engine은 채팅과 상호작용하려면 챗봇이 지속적으로 활성화되어야 하기 때문에 이상적입니다.

또한 배포 자동화를 위한 컨테이너 사용, 비밀 관리, Cloud Build 구성도 다룹니다.

Google Compute Engine(GCE)에서 VM 만들기

  1. GCP 콘솔 사이드 메뉴에서 Compute Engine에 액세스하세요.
  2. 인스턴스 생성을 클릭하세요. Implantando Aplicações Serverless no Google Cloud Run
  3. 인스턴스 이름을 입력하세요(예: teomebot-instance).
  4. 필요에 따라 지역구역을 구성하고 나중에 사용할 수 있도록 이 정보를 기록해 두세요. Implantando Aplicações Serverless no Google Cloud Run
  5. Machine Setup에서 E2 유형을 선택하고 Preset에서 e2-micro를 선택합니다. Implantando Aplicações Serverless no Google Cloud Run
  6. 컨테이너 탭을 클릭하고 컨테이너 배포를 클릭하세요.
  7. 일시적으로 nginx:latest 이미지를 사용하여 초기 구성을 완료하세요.
  8. 환경 변수를 추가합니다.
    • TWITCH_BOT: 봇 이름.
    • TWITCH_CHANNEL: 트위치 채널 이름.
    • HOST_DB: Cloud SQL 데이터베이스의 비공개 IP입니다.
    • USER_DB: 은행 사용자입니다.
    • PORT_DB: 은행 포트입니다.
    • URL_POINTS: 서비스 엔드포인트 Points-to-Go.
  9. 선택을 클릭하세요 Implantando Aplicações Serverless no Google Cloud Run
  10. ID 및 API 액세스에서 이 프로젝트에 대해 구성된 서비스 계정을 선택합니다. Implantando Aplicações Serverless no Google Cloud Run
  11. 나머지 설정은 기본값으로 두고 만들기를 클릭하세요.

Secret Manager를 사용하여 보안 비밀 추가

  1. 우리가 비밀을 전달하지 않았다는 것을 눈치채셨을 것입니다. 컴퓨팅 엔진에는 Cloud Run처럼 비밀을 전달하는 간단한 방법이 없습니다. 제가 해결한 방법은 비밀 관리자로부터 직접 정보를 읽을 수 있는 기능을 애플리케이션 코드에 추가하는 것이었습니다.
  2. GCP 콘솔에서 Secret Manager에 액세스하세요.
  3. 비밀번호 만들기를 클릭하세요.
  4. 설명이 포함된 이름(예: twitch-token)을 입력하고 해당 값을 추가하세요.
  5. 생성된 비밀번호의 경로를 복사하세요(예: projects/123456/secrets/twitch-token/versions/latest). Implantando Aplicações Serverless no Google Cloud Run
    1. 새 utils/gcp.go 파일 만들기
  6. utils/db.go를 변경하여 비밀 관리자 경로를 매개변수로 전달하여 함수를 호출하세요.

    git clone git@github.com:cslemes/points-to-go.git
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
  7. Twitch 자격 증명을 얻으려면 main.go를 변경하세요

    ```
    FROM golang:latest
    WORKDIR /app/
    COPY . .
    RUN go build main.go
    CMD ["./main"]
    ```
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사

    migration := flag.Bool("migrations", false, "데이터베이스 마이그레이션 수행")

    flag.Parse()

    godotenv.Load()
    사용자 := os.Getenv("TWITCH_BOT")
    //변경
    oauth := utils.AccessSecretVersion("projects/551619572964/secrets/twitch-token/versions/latest")

    채널 := os.Getenv("TWITCH_CHANNEL")
``

클라우드 빌드

클라우드 빌드 구성

Cloud Build는 컨테이너 이미지 생성 및 Compute Engine 배포를 자동화하는 데 사용됩니다.

  1. 아래 내용으로 저장소 루트에 cloudbuild.yaml 파일을 생성합니다.
  2. 대체

    FROM golang:1.23.1-alpine3.20 AS build
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사

_VERSION 변수는 v1.0과 일치하는 값으로 설정됩니다. 현재 커밋(${COMMIT_SHA})의 해시로 바꿉니다. 이렇게 하면 각 빌드에 대해 고유한 버전이 생성되어 버전 및 커밋별로 각 이미지를 식별할 수 있습니다.

  • 단계
    단계 섹션에서는 Cloud Build가 수행해야 하는 단계를 정의합니다. 여기에는 빌드, 푸시(2회), 업데이트의 4단계가 있습니다.

  • 1단계: Docker 이미지 구축

    RUN go mod download && go mod verify
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사

이 단계에서는 Docker 이미지 빌드를 실행합니다.

  • "--no-cache": 캐시를 사용하지 않고 강제로 빌드합니다.
  • "-t": 생성된 이미지에 대한 태그를 정의합니다.
    • gcr.io/$PROJECT_ID/teomebot:$_VERSION: 커밋 해시를 사용하는 태그가 있는 이미지.
    • gcr.io/$PROJECT_ID/teomebot:latest: 최신 태그가 있는 이미지.
  • ".": 현재 디렉터리를 빌드 컨텍스트로 정의합니다.

id: Build 태그는 참조 및 디버깅에 유용한 단계의 선택적 식별자입니다.

  • 2단계: 버전 태그를 사용한 이미지 푸시
RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -o /app/points -a -ldflags="-s -w" -installsuffix cgo
로그인 후 복사
로그인 후 복사

이 단계에서는 특정 태그($_VERSION)가 있는 이미지를 Google Container Registry에 푸시하여 빌드에서 생성된 버전을 저장소에 저장할 수 있습니다.

  • 3단계: 최신 태그를 사용한 이미지 푸시

    RUN apk add --no-cache curl upx
    RUN upx --ultra-brute -qq points && upx -t points
    
    로그인 후 복사

이 단계에서는 최신 태그가 있는 이미지를 Google Container Registry로 푸시하여 최신 이미지를 최신 버전으로 업데이트합니다.

  • 4단계: GCE 인스턴스의 컨테이너 업데이트

     FROM scratch AS prod
     WORKDIR /app
     COPY --from=build /app/points /
     CMD ["./points"]
    
    로그인 후 복사

이 단계에서는 gcloud 명령어를 사용하여 Google Compute Engine 인스턴스의 컨테이너를 업데이트합니다.

  • "teomebot-instance": 컨테이너를 실행하는 인스턴스의 이름을 지정합니다.
  • --container-image: 인스턴스가 사용해야 하는 컨테이너 이미지를 정의합니다. 여기서는 최신 버전의 이미지를 사용하세요.
  • --zone=$_DEPLOY_ZONE: 변수를 사용하여 배포 영역을 지정합니다.
  • --container-restart-policy=always: 실패 시 항상 다시 시작하도록 컨테이너 다시 시작 정책을 설정합니다.
  • 옵션

    git clone git@github.com:cslemes/points-to-go.git
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사

logging: CLOUD_LOGGING_ONLY 옵션은 Cloud Build가 Cloud Logging에만 로깅하여 데이터를 저장하고 GCP 로그에 집중하도록 지정합니다.

  • 최종 파일

    ```
    FROM golang:latest
    WORKDIR /app/
    COPY . .
    RUN go build main.go
    CMD ["./main"]
    ```
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사

컨테이너 이미지 생성을 위한 트리거 생성

서비스 계정 설정

  1. Google Cloud 콘솔에서 Cloud Build로 이동하세요.
  2. 설정으로 이동하세요.
  3. 서비스 계정 권한을 클릭하세요.
  4. Cloud Run용으로 생성된 서비스 계정을 찾습니다.
  5. 옵션 활성화 기본 서비스 계정으로 설정
  6. 서비스 계정에 대해 컴퓨팅 인스턴스 관리자 역할을 활성화합니다. Implantando Aplicações Serverless no Google Cloud Run 트리거 생성
  7. 사이드 메뉴에서 트리거를 클릭한 다음 트리거 만들기를 클릭하세요. Implantando Aplicações Serverless no Google Cloud Run
  8. 트리거를 설명하는 이름을 입력하세요.
  9. 저장소에서 저장소 연결을 클릭하고 테오메봇 저장소를 선택하세요. Implantando Aplicações Serverless no Google Cloud Run
  10. 구성에서 Cloud Build 구성 파일 옵션을 선택합니다.
  11. 인스턴스가 생성된 영역에 해당하는 값으로 _DEPLOY_ZONE 대체 변수를 추가합니다.
  12. 서비스 계정에서 선택한 계정이 6단계에서 구성한 대로 되어 있는지 확인하세요. Implantando Aplicações Serverless no Google Cloud Run
  13. 저장을 클릭하세요. 트리거 실행
  14. 개요 화면의 새로 생성된 트리거 라인에서 실행을 클릭하여 프로세스를 수동으로 실행합니다. Implantando Aplicações Serverless no Google Cloud Run
  15. 프로세스 세부정보에서 이미지 빌드 단계에 따라 가능한 오류가 있는지 확인하세요. Implantando Aplicações Serverless no Google Cloud Run

애플리케이션 테스트

  1. Compute Engine 패널에서 ssh 명령을 복사하여 인스턴스에 액세스하거나 SSH 웹 클라이언트를 사용하여 인스턴스를 연결합니다.
  2. 인스턴스에 연결하고 아래 명령을 실행하여 컨테이너 상태를 확인하세요.

    git clone git@github.com:cslemes/points-to-go.git
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사

Implantando Aplicações Serverless no Google Cloud Run

인증서 문제 해결

  1. 인증서 관련 오류가 발생하는 경우(스크래치 베이스 이미지로 인해 발생) distroless 이미지로 교체하세요. Dockerfile에서 기본 이미지를 정의하는 줄을 다음에서 변경합니다.

    git clone git@github.com:cslemes/points-to-go.git
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사

받는 사람:

```
FROM golang:latest
WORKDIR /app/
COPY . .
RUN go build main.go
CMD ["./main"]
```
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

Docker 파일 업데이트됨:

FROM golang:1.23.1-alpine3.20 AS build
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

Secret Manager 권한 조정

  1. Secret Manager에 액세스하려면 서비스 계정 범위를 변경하세요.
  2. Google Cloud Console로 이동하세요.
  3. 사이드 메뉴에서 Compute Engine > VM 인스턴스.
  4. VM 인스턴스 이름을 찾아 클릭하세요.
  5. VM 세부정보 페이지에서 중지를 클릭하여 인스턴스를 종료합니다(서비스 계정 범위는 인스턴스가 중지된 경우에만 수정할 수 있으므로 이 단계가 필요합니다).
  6. 인스턴스를 중지한 후 페이지 상단의 수정을 클릭하세요.
  7. ID 및 액세스 API 섹션까지 아래로 스크롤합니다.
  8. 서비스 계정에서 애플리케이션에서 사용하는 서비스 계정을 선택하세요.
  9. API 액세스 범위에서 모든 클라우드 API에 대한 전체 액세스 허용을 선택하거나 특정 API 액세스 범위 설정을 클릭하고 https://www 범위를 추가합니다. .googleapis.com/auth/cloud-platform.
  10. 범위를 조정한 후 저장을 클릭하여 변경 사항을 적용하세요.
  11. 시작을 클릭하여 인스턴스를 다시 시작하세요.
  12. 또는 명령줄을 통해 인스턴스를 중지하고 명령을 실행한 후 시작합니다.

    RUN go mod download && go mod verify
    
    로그인 후 복사
    로그인 후 복사
    로그인 후 복사

더 많은 컨테이너 추가

다른 서비스는 동일한 이동 지점 프로세스를 따르며, 서로 통신하는 서비스의 경우 환경 변수를 생성하여 항상 https 포트 443이 되는 엔드포인트 주소를 구성합니다.

다른 서비스와의 통신을 위해 서비스 URL로 다른 환경 변수를 수신하도록 코드를 조정했습니다. 예를 들어 다음과 같습니다.

RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -o /app/points -a -ldflags="-s -w" -installsuffix cgo
로그인 후 복사
로그인 후 복사

봇 테스트

봇과 Twitch의 통신을 테스트하는 중입니다.

Implantando Aplicações Serverless no Google Cloud Run

네트워크 보안 조정
테스트를 완료한 후 내부에서만 접근할 수 있는 컨테이너를 VPC에 배치하세요.

Implantando Aplicações Serverless no Google Cloud Run

결론

이로써 TeoMeWhy 시스템 마이그레이션이 완료되었으며, 이 가이드는 다른 TeoMeWhy 서비스 마이그레이션을 위한 기초 역할을 합니다.

달성된 주요 목표는 다음과 같습니다.

기술적 성과

  • 컨테이너화된 애플리케이션을 Cloud Run으로 마이그레이션하여 자동 확장성 및 비용 절감 가능
  • 다단계 빌드를 통한 Docker 이미지 최적화로 이미지 크기와 취약점 대폭 감소
  • Cloud SQL로 관리형 데이터베이스를 구현하여 고가용성 및 보안 보장
  • Cloud Build를 사용한 자동화된 CI/CD 구성으로 GitHub에서 자동 배포 가능
  • Secret Manager를 이용한 안전한 자격증명 관리

아키텍처 개선

  • 명확한 서비스 간 책임 분리
  • 보안 강화를 위해 비공개 연결 사용
  • 비용 최적화를 위한 서버리스 표준 구현
  • 빌드 및 배포 프로세스 자동화
  • GitHub 저장소와의 원활한 통합

얻은 이익

  1. 비용: 서버리스 모델과 리소스 최적화를 통한 비용 절감
  2. 유지관리성: 자동화된 배포를 통한 유지관리 용이성
  3. 보안: 비밀 및 비공개 연결의 적절한 관리
  4. 확장성: 수요에 따라 자동으로 확장하는 기능
  5. 모니터링: 기본 GCP 도구를 통해 인프라 가시성 향상

충수

Secret Manager API 활성화

  1. Google Cloud 콘솔에서 Secret Manager API를 검색하세요.
  2. 검색결과에서 API를 클릭하세요. Implantando Aplicações Serverless no Google Cloud Run
  3. 세부정보 화면에서 활성화를 클릭하세요. Implantando Aplicações Serverless no Google Cloud Run

참고자료

  • Github TeoMeWhy
  • 트위치 테오 미 와이
  • Cloud Run 문서
  • Compute Engine 문서
  • 클라우드 빌드 문서
  • 비밀 관리자 문서

위 내용은 Google Cloud Run에 서버리스 애플리케이션 배포의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿