導入
このガイドでは、現在 AWS 上にある Twitch の TeoMeWhy システムからコンテナをデプロイし、GCP に配置します。
AWS の現在の構造
GCP のアーキテクチャ
複雑な自動化ツールは使用されず、すべてがコンソール経由で行われ、Github と統合され、メインへのコミットごとにイメージがデプロイされます。
以下を使用します:
- Cloud Run - ウェブ アプリケーション用
- Cloud SQL - MySQL データベース用
- GCE - Teomebot を実行するには
- クラウド ストレージ - オブジェクト ストレージ (S3)
- Cloud Build - アプリケーションのデプロイメントを作成するには
- Secret Manager - アプリケーションの資格情報を安全に保存します。
アプリケーションの入手
-
TeoMeWhy の GitHub と、プロジェクトに関連するアプリケーションの フォーク にアクセスしてください。
- リポジトリ ページで、スター付き をクリックし、フォーク をクリックします。
-
フォーク ページで、フォーク に名前を付け、フォークの作成 をクリックします。
- 環境全体を複製する場合は、プロジェクト内の他のリポジトリに対してこのプロセスを繰り返します。
- 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 は外部依存関係を必要としないため、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
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
-
実稼働用にバイナリを最適化するには、以下のパラメータを追加します:
-
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
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
-
(オプション) イメージをさらに小さくするには、upx を使用してバイナリを圧縮します。upx (Ultimate Packer for eXecutables) は、Go バイナリなどの実行可能バイナリを圧縮してファイルのサイズを削減するツールです。マイナス点は次のとおりです。ビルド時間が長くなり、コンテナーの起動に時間がかかるため、どちらが実装にとって最も有益かを評価する必要があります。既に Cold Start が備わっている Cloud Run で使用することが目的であるため、使用されていないときにコンテナを一時停止します。コンテナの初期化時間が増加するため、使用しません。
```
FROM golang:latest
WORKDIR /app/
COPY . .
RUN go build main.go
CMD ["./main"]
```
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
- ビルドの比較
- Dockerfile の最適化と upx の使用により、イメージが最大 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 |
- 他のリポジトリに対してこれらの設定を繰り返します。
データベースのデプロイ
- コンソールで、サイドメニューのSQLにアクセスします。
- または、検索バーで「SQL」を検索し、リストから SQL を選択します。
- Cloud SQL ページで、インスタンスの作成 をクリックし、MySQL を選択します。
- 編集中の Enterprise を選択します。
- [プリセットの編集] で、サンドボックス を選択します。
- データベースのバージョンは MySQL 8.0 のままにします。
-
インスタンス ID でインスタンスに名前を付け、パスワードを設定します。
- パスワード ポリシーを展開することで、パスワード ポリシーを指定できます
- ゾーンとリージョンを定義し、単一のゾーンのままにします。
- カスタマイズインスタンスでは、ニーズに応じてハードウェアを調整できます。オプションは選択したエディションによって異なります。
- 必要に応じて、CPU を 1 に、ディスクを 10GB に調整します。
- 接続で、パブリック IP のチェックを外し、プライベート IP にチェックを入れます。
- プライベート アクセス接続で、接続の構成 をクリックします
-
自動的に割り当てられた範囲を使用するを選択します
-
続行 をクリックします
-
接続の作成をクリックします
-
インスタンスの作成 をクリックし、作成されるまで待ちます。
-
インスタンスに接続するには、Cloud Shell をアクティブにして、次のコマンドを実行します。
git clone git@github.com:cslemes/points-to-go.git
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
- 前の手順で割り当てたパスワードを入力します。
- クラウド シェルはプライベート VPC にアクセスできないため、接続エラーが発生します。
-
Cloud Shell 経由の接続を簡素化するには、インスタンスを編集してパブリック IP をマークしましょう。付録では、VPC ピアリング を作成して クラウドシェル
もう一度接続してみてください。
-
- アプリケーションデータベースを作成します:
```
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 Run でのコンテナの作成
Google Cloud コンソールで、サイド メニューまたは検索バーから - Cloud Run にアクセスします。
Cloud Run ページで、- コンテナのデプロイ をクリックし、サービス オプションを選択します。
導入方法の選択-
サービスをデプロイするには 3 つのオプションがあります。
-
レジストリのコンテナ イメージを使用します。-
リポジトリに直接接続します。-
関数を作成します (Run と統合された - Cloud Functions を使用)。
このガイドでは、- GitHub を使用した継続的デプロイ を選択すると、Google が CI/CD パイプラインを自動的に構成できるようになります。
-
Cloud Build で構成をクリックします。
- GitHub への接続の構成
認証 をクリックして、GitHub と Google の統合を有効にします。
すべてのリポジトリへのアクセスを許可するか、特定のリポジトリのみへのアクセスを許可するかを選択して、アクセスを承認します。
ログインが完了したら、次へをクリックします。
ビルド タイプの選択
ビルドステップで、Dockerfile を使用するか、サポートされているアプリケーションと GCP の Buildpacks を使用するかを選択します。
Dockerfile を選択し、必要に応じてパス/ファイル名を調整します
サービス設定
-
次のパラメータを設定します:
-
認証: 未認証の通話を許可するを選択します。
-
CPU 割り当て: CPU はリクエスト処理中にのみ割り当てられます。
-
入力制御: 内部を選択します。
アプリケーションの必要に応じてコンテナのポートを調整します。
セキュリティ タブのサービス アカウントで、[作成] をクリックします新しいサービス アカウント
-
役割を追加
- ストレージ オブジェクト管理者
- Cloud Run 管理者
- シークレットマネージャー シークレットアドバイザー
- Cloud SQL クライアント
- Cloud Build サービス アカウント
- アーティファクト レジストリ レコーダー
- サービスアカウントユーザー
-
アプリケーション コードを分析するには、環境変数をデータベースに渡す必要があります。
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 クライアントを使用してアプリケーションをテストしています。
クライアントの作成
登録済み顧客の閲覧
Teomebot サービスの作成
チャットボットは Cloud Run にはデプロイされず、Google Compute Engine (GCE) にインストールされます。 Cloud Run とは異なり、チャットボットはチャットと対話するために継続的にアクティブである必要があるため、Compute Engine が理想的です。
さらに、コンテナの使用、シークレット管理、デプロイ自動化のための Cloud Build 構成についても説明します。
Google Compute Engine (GCE) での VM の作成
- GCP Console のサイド メニューで Compute Engine にアクセスします。
-
インスタンスの作成をクリックします。
- インスタンスの名前を入力します (例: teomebot-instance)。
- 必要に応じて リージョン と ゾーン を構成し、後で使用できるようにこの情報を書き留めます。
-
マシンセットアップで E2 タイプを選択し、プリセットで e2-micro を選択します。
-
コンテナ タブをクリックし、コンテナのデプロイ をクリックします。
- nginx:latest イメージを一時的に使用して、初期構成を完了します。
- 環境変数を追加します。
-
TWITCH_BOT: ボット名。
-
TWITCH_CHANNEL: Twitch チャンネル名。
-
HOST_DB: Cloud SQL データベースのプライベート IP。
-
USER_DB: 銀行ユーザー。
-
PORT_DB: 銀行ポート。
-
URL_POINTS: サービス エンドポイント Points-to-Go.
- 「選択」をクリックします
-
ID と API アクセス で、このプロジェクトに構成されたサービス アカウントを選択します。
- 残りの設定はデフォルトのままにし、作成 をクリックします。
Secret Manager を使用してシークレットを追加する
- シークレットを渡していないことに気づいたかもしれません。コンピューティング エンジンには、クラウド実行のようにシークレットを渡す簡単な方法はありません。私の解決策は、シークレット マネージャーから直接情報を読み取る関数をアプリケーション コードに追加することでした。
- GCP Console で Secret Manager にアクセスします。
-
シークレットの作成 をクリックします
- わかりやすい名前 (例: twitch-token) を入力し、対応する値を追加します。
- 生成されたシークレットのパスをコピーします (例:projects/123456/secrets/twitch-token/versions/latest)。
- 新しいutils/gcp.goファイルを作成する
-
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 へのデプロイを自動化するために使用されます。
- 以下の内容を含む Cloudbuild.yaml ファイルをリポジトリのルートに作成します。
-
代替品
FROM golang:1.23.1-alpine3.20 AS build
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
_VERSION 変数は、v1.0 と一致する値に設定されています。現在のコミットのハッシュ (${COMMIT_SHA}) を使用します。これにより、ビルドごとに一意のバージョンが作成され、各イメージがバージョンとコミットによって確実に識別可能になります。
このステップでは、Docker イメージのビルドを実行します。
-
"--no-cache": キャッシュを使用せずにビルドを強制します。
-
"-t": 作成されたイメージのタグを定義します。
-
gcr.io/$PROJECT_ID/teomebot:$_VERSION: コミット ハッシュを使用するタグを含むイメージ。
-
gcr.io/$PROJECT_ID/teomebot:latest: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 にプッシュし、ビルドで生成されたバージョンをリポジトリに保存できるようにします。
このステップでは、最新のタグを持つイメージを Google Container Registry にプッシュし、最新のイメージを最新バージョンで更新します。
このステップでは、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"]
```
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
コンテナイメージ作成トリガーの作成
サービスアカウントの設定
- Google Cloud コンソールで Cloud Build に移動します。
-
設定に移動します。
-
サービス アカウントのアクセス許可をクリックします。
-
Cloud Run 用に作成されたサービス アカウントを見つけます。
- オプション 優先サービス アカウントとして設定 を有効にします
- サービス アカウントの コンピューティング インスタンス管理者 ロールを有効にします。
トリガーの作成
- サイド メニューで、トリガー をクリックし、次に トリガーの作成 をクリックします。
- トリガーのわかりやすい名前を入力します。
-
リポジトリで、リポジトリの接続をクリックし、Teomebot リポジトリを選択します。
-
構成で、オプションCloud Build 構成ファイルを選択します。
- インスタンスが作成されたゾーンに対応する値を持つ _DEPLOY_ZONE 置換変数を追加します。
- サービス アカウントで、選択したアカウントが手順 6 で構成されているかどうかを確認します。
-
保存をクリックします。
トリガーの実行
- 概要画面の新しく作成したトリガー行で、「実行」をクリックしてプロセスを手動で実行します。
- プロセスの詳細で、イメージのビルド手順に従って、エラーの可能性がないか確認します。
アプリケーションのテスト
- Compute Engine パネルで、ssh コマンドをコピーしてインスタンスにアクセスするか、ssh ウェブ クライアントを使用してインスタンスに接続します。
-
インスタンスに接続し、以下のコマンドを実行してコンテナの状態を確認します。
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 の権限の調整
-
Secret Manager にアクセスするようにサービス アカウントのスコープを変更します。
- Google Cloud コンソールに移動します。
- サイド メニューで、Compute Engine > に移動します。 VM インスタンス.
- VM インスタンスの名前を見つけてクリックします。
- VM の詳細ページで、停止 をクリックしてインスタンスをシャットダウンします (サービス アカウントのスコープはインスタンスが停止している場合にのみ変更できるため、この手順は必要です)。
- インスタンスが停止したら、ページの上部にある 編集 をクリックします。
-
Identity and Access API セクションまで下にスクロールします。
-
サービス アカウント で、アプリケーションが使用するサービス アカウントを選択します。
-
API アクセス スコープ で、すべてのクラウド API へのフル アクセスを許可 を選択するか、特定の API アクセス スコープを設定 をクリックしてスコープ https://www を追加します.googleapis.com/auth/cloud-platform.
- スコープを調整した後、保存 をクリックして変更を適用します。
-
開始をクリックしてインスタンスを再起動します。
-
または、コマンドライン経由で、インスタンスを停止し、コマンドを実行して、その後起動します。
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 サービスを移行するための基礎として機能します。
達成された主な目標は次のとおりです:
技術的成果
- コンテナ化されたアプリケーションの Cloud Run への移行により、自動スケーラビリティとコスト削減が可能になります
- 多段階ビルドによる Docker イメージの最適化により、イメージ サイズと脆弱性を大幅に削減します
- Cloud SQL を使用したマネージド データベースの実装、高可用性とセキュリティの確保
- Cloud Build を使用した自動 CI/CD 構成により、GitHub からの自動デプロイが可能
- Secret Manager を使用した安全な資格情報管理
アーキテクチャの改善
- サービス間の責任の明確な分離
- セキュリティを強化するためのプライベート接続の使用
- コスト最適化のためのサーバーレス標準の実装
- ビルドおよびデプロイプロセスの自動化
- GitHub リポジトリとのシームレスな統合
得られるメリット
-
コスト: サーバーレス モデルとリソースの最適化によるコスト削減
-
保守性: 自動展開による保守の容易さ
-
セキュリティ: シークレットとプライベート接続の適切な管理
-
スケーラビリティ: 需要に応じて自動的にスケーリングする機能
-
モニタリング: ネイティブ GCP ツールによるインフラストラクチャの可視性の向上
付録
Secret Manager API を有効にする
- Google Cloud コンソールで、Secret Manager API を検索します。
- 検索結果で「API」をクリックします。
- 詳細画面で、アクティブ化 をクリックします。
参考文献
- Github TeoMeWhy
- Twitch Teo Me Why
- Cloud Run ドキュメント
- Compute Engine のドキュメント
- Cloud Build ドキュメント
- シークレットマネージャーのドキュメント
以上がGoogle Cloud Run へのサーバーレス アプリケーションのデプロイの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。