이 가이드에서는 현재 AWS에 있는 Twitch의 TeoMeWhy 시스템에서 컨테이너를 배포하고 GCP에 배치하겠습니다.
AWS의 현재 구조
GCP의 아키텍처
복잡한 자동화 도구는 사용되지 않으며 Github과 통합하고 메인에 커밋할 때마다 이미지를 배포하는 등 모든 작업이 콘솔을 통해 수행됩니다.
우리는 다음을 사용할 것입니다:
git clone git@github.com:cslemes/points-to-go.git
복제된 저장소 폴더로 이동합니다. 저장소에는 이미 Docker용으로 설계된 Dockerfile이 포함되어 있습니다. 분석해 보겠습니다.
``` FROM golang:latest WORKDIR /app/ COPY . . RUN go build main.go CMD ["./main"] ```
이 Dockerfile은 작동하지만 다단계 빌드를 사용하여 최적화하여 최종 이미지의 크기를 줄입니다. Go에는 외부 종속성이 필요하지 않으므로 스크래치와 같은 최소한의 기본 이미지를 사용할 수 있습니다.
빌드 이미지를 더 가벼운 버전으로 바꾸고 다른 단계에서 참조할 수 있도록 이름을 지정하세요.
FROM golang:1.23.1-alpine3.20 AS build
go mod 다운로드 명령을 추가하여 종속성을 캐시하고 go mod 확인을 통해 go.sum. 파일의 체크섬
과 일치하는지 확인하세요.
RUN go mod download && go mod verify
프로덕션을 위해 바이너리를 최적화하려면 아래 매개변수를 추가하세요.
git clone git@github.com:cslemes/points-to-go.git
(선택 사항) 이미지를 더 작게 만들기 위해 upx를 사용하여 바이너리를 압축할 수 있습니다. upx(Ultimate Packer for eXecutables)는 실행 가능한 바이너리를 압축하여 Go 바이너리와 같은 파일 크기를 줄이는 도구입니다. 빌드 시간이 길어지고 컨테이너 시작 지연도 길어지므로 구현에 가장 유리한 것이 무엇인지 평가해야 합니다. 이미 Cold Start가 있는 Cloud Run에서 사용하는 것이 목적이므로, 사용하지 않을 때는 컨테이너를 일시정지하고, 컨테이너 초기화 시간이 늘어나므로 사용하지 않겠습니다.
``` FROM golang:latest WORKDIR /app/ COPY . . RUN go build main.go CMD ["./main"] ```
이제 바이너리가 준비되었으므로 바이너리를 깨끗한 이미지로 복사하는 두 번째 단계를 수행해 보겠습니다.
FROM golang:1.23.1-alpine3.20 AS build
전체 파일
git clone git@github.com:cslemes/points-to-go.git
Imagem | Tipo | Tamanho |
---|---|---|
points-to-go | Otimizado | 14MB |
points-to-go | Com upx | 5.77MB |
points-to-go | original | 1.76GB |
데이터베이스 배포
인스턴스에 연결하려면 Cloud Shell을 활성화하고 다음을 실행하세요.
git clone git@github.com:cslemes/points-to-go.git
애플리케이션 데이터베이스 생성:
``` FROM golang:latest WORKDIR /app/ COPY . . RUN go build main.go CMD ["./main"] ```
Cloud Shell에는 여전히 VSCode 기반의 텍스트 편집기가 있으며 이를 통해 직접 일부 작업을 수행할 수 있으며 /home에 5GB의 영구 볼륨이 있습니다. 하드웨어는 1vCPU 및 1.7GB RAM을 갖춘 e2-소형 VM입니다.
Cloud Build로 구성을 클릭하세요.
GitHub 연결 구성
Google과 GitHub의 통합을 활성화하려면 인증을 클릭하세요.
모든 저장소에 대한 액세스 허용 또는 특정 저장소에 대한 액세스 허용 중에서 선택하여 액세스를 승인합니다.
로그인 완료 후 다음을 클릭하세요.
빌드 유형 선택
빌드 단계에서 Dockerfile 또는 지원 애플리케이션과 GCP의 빌드팩 사용 중에서 선택하세요.
Dockerfile을 선택하고 필요한 경우 경로/파일 이름을 조정하세요
서비스 설정
다음 매개변수를 구성합니다.
용도에 맞게 컨테이너 포트를 조정하세요.
보안 탭의 서비스 계정에서 새 서비스 계정
만들기를 클릭하세요.
역할 추가
애플리케이션 코드를 분석하려면 환경 변수를 데이터베이스에 전달해야 합니다.
git clone git@github.com:cslemes/points-to-go.git
애플리케이션 코드를 Unix 소켓을 사용하는 Cloud Sql 표준으로 변경해야 하며, Cloud Run은 DB에 직접 접근하지 않고 Cloud SQL 인증 프록시를 사용합니다.
``` FROM golang:latest WORKDIR /app/ COPY . . RUN go build main.go CMD ["./main"] ```
컨테이너에서 변수 및 비밀 탭으로 이동하여 변수 추가를 클릭하세요.
필요한 변수를 추가하세요.
은행 주소는 PROJECT_ID:REGION:INSTANCE_NAME 패턴을 따르며 아래 항목 16에서 이름을 확인할 수도 있습니다.
비밀 참조에 입력할 은행 비밀번호
새 비밀 생성 옵션이 비활성화된 경우 API를 활성화해야 하기 때문입니다.
새 비밀 만들기를 클릭하세요
비밀 이름을 정의하고 비밀 생성을 클릭하세요
Cloud SQL Connections에 우리가 만든 은행의 URL을 추가합니다
애플리케이션 스키마를 생성하려면 코드에서 migrations=true 인수를 전달해야 합니다.
함수 인수에 migrations=true를 추가한 후 다음 컨테이너 개정에서는 이를 제거할 예정입니다.
다른 필드는 기본값으로 두고 만들기를 클릭하세요
Thunder Client를 사용하여 애플리케이션을 테스트합니다.
클라이언트 생성
등록고객 읽기
챗봇은 Cloud Run에 배포되지 않으며 Google Compute Engine(GCE)에 설치됩니다. Cloud Run과 달리 Compute Engine은 채팅과 상호작용하려면 챗봇이 지속적으로 활성화되어야 하기 때문에 이상적입니다.
또한 배포 자동화를 위한 컨테이너 사용, 비밀 관리, Cloud Build 구성도 다룹니다.
utils/db.go를 변경하여 비밀 관리자 경로를 매개변수로 전달하여 함수를 호출하세요.
git clone git@github.com:cslemes/points-to-go.git
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 배포를 자동화하는 데 사용됩니다.
대체
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 이미지 빌드를 실행합니다.
id: Build 태그는 참조 및 디버깅에 유용한 단계의 선택적 식별자입니다.
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 인스턴스의 컨테이너를 업데이트합니다.
옵션
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"] ```
서비스 계정 설정
애플리케이션 테스트
인스턴스에 연결하고 아래 명령을 실행하여 컨테이너 상태를 확인하세요.
git clone git@github.com:cslemes/points-to-go.git
인증서 문제 해결
인증서 관련 오류가 발생하는 경우(스크래치 베이스 이미지로 인해 발생) 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 권한 조정
또는 명령줄을 통해 인스턴스를 중지하고 명령을 실행한 후 시작합니다.
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의 통신을 테스트하는 중입니다.
네트워크 보안 조정
테스트를 완료한 후 내부에서만 접근할 수 있는 컨테이너를 VPC에 배치하세요.
이로써 TeoMeWhy 시스템 마이그레이션이 완료되었으며, 이 가이드는 다른 TeoMeWhy 서비스 마이그레이션을 위한 기초 역할을 합니다.
달성된 주요 목표는 다음과 같습니다.
위 내용은 Google Cloud Run에 서버리스 애플리케이션 배포의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!