このガイドでは、現在 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 は外部依存関係を必要としないため、scratch のような最小限のベース イメージを使用できます。
ビルド イメージを軽量バージョンと交換し、他の段階で参照できるように名前を付けます。
FROM golang:1.23.1-alpine3.20 AS build
go mod download コマンドを追加して依存関係をキャッシュし、go mod verify が 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"] ```
バイナリの準備ができたので、バイナリをクリーンなイメージにコピーする第 2 段階を実行しましょう。
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 には 5 GB の永続ボリュームがあります。ハードウェアは、1vCPU と 1.7GB RAM を備えた e2-small VM です。
Cloud Build で構成をクリックします。
認証 をクリックして、GitHub と Google の統合を有効にします。
すべてのリポジトリへのアクセスを許可するか、特定のリポジトリのみへのアクセスを許可するかを選択して、アクセスを承認します。
ログインが完了したら、次へをクリックします。
ビルド タイプの選択
ビルドステップで、Dockerfile を使用するか、サポートされているアプリケーションと GCP の Buildpacks を使用するかを選択します。
Dockerfile を選択し、必要に応じてパス/ファイル名を調整します
サービス設定
次のパラメータを設定します:
アプリケーションの必要に応じてコンテナのポートを調整します。
セキュリティ タブのサービス アカウントで、[作成] をクリックします新しいサービス アカウント
役割を追加
アプリケーション コードを分析するには、環境変数をデータベースに渡す必要があります。
git clone git@github.com:cslemes/points-to-go.git
アプリケーション コードを Unix ソケットを使用する Cloud SQL 標準に変更する必要があります。Cloud Run は DB に直接アクセスせず、Cloud SQL Auth Proxy を使用します。
``` FROM golang:latest WORKDIR /app/ COPY . . RUN go build main.go CMD ["./main"] ```
コンテナで、[変数とシークレット] タブに移動し、[変数の追加] をクリックします。
必要な変数を追加します。
銀行アドレスは、PROJECT_ID:REGION:INSTANCE_NAME のパターンに従います。項目 16 で以下の名前を取得することもできます。
REFERENCE A SECRET に入力する銀行パスワード
新しいシークレットの作成オプションが無効になっている場合は、API を有効にする必要があるためです。
「新しいシークレットを作成」をクリックします
シークレット名を定義し、「シークレットの作成」をクリックします
Cloud SQL Connections で、作成した銀行の URL を追加します
アプリケーション スキーマを作成するには、コードで引数 migrations=true を渡す必要があります。
関数の引数に migrations=true を追加し、次のコンテナ リビジョンで削除します。
他のフィールドはデフォルトのままにして、「作成」をクリックします
Thunder クライアントを使用してアプリケーションをテストしています。
クライアントの作成
登録済み顧客の閲覧
チャットボットは 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
main.go を変更して Twitch 認証情報を取得します
``` 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
証明書の問題の解決
証明書関連のエラーが発生した場合 (スクラッチ ベース イメージが原因)、ディストロレス イメージに置き換えます。 Dockerfile で、ベースイメージを定義する行を
から変更します。
git clone git@github.com:cslemes/points-to-go.git
宛先:
``` FROM golang:latest WORKDIR /app/ COPY . . RUN go build main.go CMD ["./main"] ```
Dockerfile が更新されました:
FROM golang:1.23.1-alpine3.20 AS build
Secret Manager の権限の調整
または、コマンドライン経由で、インスタンスを停止し、コマンドを実行して、その後起動します。
RUN go mod download && go mod verify
他のサービスも同じ point-to-go プロセスに従い、相互に通信するサービスの場合、環境変数を作成してエンドポイント アドレスを構成します。エンドポイント アドレスは常に 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 中国語 Web サイトの他の関連記事を参照してください。