Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Google CloudとGitHub Actionsでセキュアで 信頼性の高いインフラのデプ...

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

Google CloudとGitHub Actionsでセキュアで 信頼性の高いインフラのデプロイパイプラインの構築方法

Avatar for Cloud Ace

Cloud Ace

May 13, 2025
Tweet

More Decks by Cloud Ace

Other Decks in Technology

Transcript

  1. | © 2025 Cloud Ace, Inc 自己紹介 北野 敦資 @Aquamarine_1010 クラウドエース株式会社

     DevSecOps 事業部 Expert • 2019年6月よりGoogle Cloudへのシステムの提案・設計から運用までの実施 • 前職ではシステムの運用管理の自動・自律化の研究、プライベートクラウドの運用・ 開発
  2. | © 2025 Cloud Ace, Inc • サービスの機能 ◦ 認証基盤: Keycloak

    ◦ ダッシュボード: Grafana ◦ ナレッジ管理: Backstage ◦ チケット管理: Redmine ◦ サービスデスク: 独自アプリ ◦ インシデント管理: Pagerduty • アプリ基盤 ◦ GKE・Cloud Run サービスのシステム構成概要 GKEとCloud Runでアプリケーションを構成
  3. | © 2025 Cloud Ace, Inc 実現したいデプロイパイプライン • 運用ミスをなくすパイプライン ◦ 統一的なデプロイフロー

    ◦ 構成情報のコード化 ◦ 専用の基盤からのみの変更 ◦ 本番環境への変更を明示的に行う • 変更に気づける ◦ 変更作業の失敗への通知 信頼性の高いCI/CDパイプライン
  4. | © 2025 Cloud Ace, Inc デプロイパイプラインの設計 信頼性の高いデプロイの実現 • CIとCDのパイプラインの分離 •

    IaCを採用しデプロイ作業のコード化 • 運用管理専用の環境の準備 • GitOpsの採用 • リポジトリ戦略の設計 ◦ タグ作成により本番環境のリリース • Slackで変更作業者への通知
  5. | © 2025 Cloud Ace, Inc CI/CDのパイプラインの設計 • 目的 ◦ テストされたイメージのデプロイ

    ◦ 迅速なロールバック • 実現方法 ◦ アプリケーション、インフラの構成ファイルを 別々のリポジトリで管理 ◦ アプリケーションリポジトリ : GitHub Actionに よるDockerイメージのプッシュ ◦ インフラ構成ファイルリポジトリ : Argo CDによ るDockerイメージのデプロイ Dockerイメージのプッシュとデプロイの分離
  6. | © 2025 Cloud Ace, Inc 運用管理専用のプロジェクトの構築 • デプロイパイプライン ◦ 開発環境と本番環境の

    2面での運用 ▪ 開発環境: 機能開発およびテスト ▪ 本番環境: 顧客提供 • Google Cloud プロジェクトの設計 ◦ アプリケーションと運用管理のリソースを別々の プロジェクトで管理 ▪ アプリケーションプロジェクト : GKE, Cloud Run,Cloud SQL ▪ 運用管理プロジェクト : Artifact Registry, Cloud Build, Workload Identity 運用管理のリソースだけを管理するプロジェクトの作成
  7. | © 2025 Cloud Ace, Inc デプロイ方法の設計 • アプリケーションのデプロイ ◦ Argo

    CD + Kustomizeによるデプロイ • Google Cloud上のアプリの設定 ◦ Cloud Build + Terraformによるデプロイ ▪ 特定のIPから変更できるようにする • Google CloudとSaaSの設定 ◦ GitHub Actions + Terraformによるデプロイ 種類ごとにデプロイエージェントとコードの使い分け
  8. | © 2025 Cloud Ace, Inc Terraformでの構成変更の流れ • 構成変更フロー 1. PRで変更内容の確認

    2. mainブランチへのプッシュで開発・運用環境への変更 3. tagの作成で本番環境への変更 • リポジトリ戦略: GitHub Flow 本番環境への変更を明示的におこなう
  9. | © 2025 Cloud Ace, Inc GitHub ActionsでのTerraform実行 • 実行するTerraformコード ◦

    Google CloudとPagerDutyのTerraformコード • 認証 ◦ Google Cloud: Workload Identityによる認証 ◦ PagerDuty: tokenによる認証 ▪ tokenの管理: Google Cloud のSecret Manager※ • ※Workload Identityで認証させデータ取得させる • Slackへの通知 ◦ slackapi/slack-github-actionによる通知 GitHub Actionsから安全に認証させSlack通知させる
  10. | © 2025 Cloud Ace, Inc Workload Identityによる認証 • Workload Identity

    Poolの設計 ◦ リポジトリごとにプールを作成し、 Workflowごとにプロバイダーを作成する ▪ リポジトリごとにVPC SCでのアクセス認証 ▪ プロバイダーごとにサービスアカウントを付与し認可 • GitHub Actionsからの活用 ◦ google-github-actions/authでの認証で指定 ◦ 指定を環境変数でおこなう ▪ 環境変数の設定をterraformを使いおこなう VPC SCで認証させサービスアカウントで認可させる
  11. | © 2025 Cloud Ace, Inc GitHub ActionsからのSlack通知 Slack appを使い失敗に気づけるよう通知させる •

    通知の実装 ◦ Slackアプリケーションによる通知 ◦ tokenをsecretで管理 ▪ secretをterraformで登録 ▪ データはGoogle Cloud のSecret Managerで管理 • メッセージ内容 ◦ PR,ビルド結果,実行対象環境 ▪ ビルド結果にslackから飛べるように する ◦ エラー時にメンション
  12. | © 2025 Cloud Ace, Inc GitHub ActionsからのSlack通知 Slack appを使い失敗に気づけるよう通知させる project

    ID project ID • 通知の実装 ◦ Slackアプリケーションによる通知 ◦ tokenをsecretで管理 ▪ secretをterraformで登録 ▪ データはGoogle Cloud のSecret Managerで管理 • メッセージ内容 ◦ PR,ビルド結果,実行対象環境 ▪ ビルド結果にslackから飛べるように する ◦ エラー時にメンション
  13. | © 2025 Cloud Ace, Inc Cloud BuildでTerraform実行 • 実行するTerraformコード ◦

    Grafana, KeycloakのTerraformコード ▪ Cloud Armor(WAF)により、IPアドレスでアクセスを絞っているため • 実行環境 ◦ 外部IPを有さない Private Pool • Slackへの通知 ◦ Cloud Build Notifierを使った通知 Google Cloud内からセキュアにGKE上のリソースを変更
  14. | © 2025 Cloud Ace, Inc Cloud Buildの実行環境 • 外部IPを保持しないPrivate Poolの作成

    • Private Poolからインターネットへの接続 ◦ Private Service ConnectによるVPCネットワークへの接続 ◦ VPCネットワーク内の通信をNATインスタンスのGCEにルーティング ◦ GCEからCloud NATを使いインターネットへ通信 ◦ Cloud NATの外部IPからアクセスできるようCloud Armor (WAF) の設定 NATインスタンスを使った外部通信
  15. | © 2025 Cloud Ace, Inc Cloud BuildからSlackへの通知 • Slackへの通知アプリ ◦

    Google Cloudが開発しているCloud Build Notifierを使う ◦ アプリをCould Runで実行 • アプリの設計 ◦ 通知先、デプロイの成功・失敗ごとに通知アプリの作成 ◦ 失敗のメッセージにメンションを付けて気づけるようにする ▪ mention: <!channel> とし、@channelでチャンネル内に通知させる Cloud Build NotifierによるSlack通知
  16. | © 2025 Cloud Ace, Inc Terraformコードの管理 • ディレクトリ構造 ◦ env

    (dev,prd,ops,org): 各環境 ▪ configs: 設定ファイル ( yaml ) • Service Account など ▪ terraform: terraform コード ◦ templates ▪ templatefile関数で使うテンプレートファイル ◦ terrafrom_modules: terraformモジュール ▪ VPCネットワークなど • コードの書き方 ◦ for_each文で呼び出し ◦ リソースの設定項目をlocalsブロックに定義 環境ごとにディレクトリを作成したコード管理 ディレクトリ構造
  17. | © 2025 Cloud Ace, Inc yamlファイルで設定管理の外出し • Terraformの課題 ◦ コードの見通しが悪い

    ◦ ループを使うと1つのファイルが大きくなる • 解決手段 ◦ yamlファイルで外部参照 ◦ fileset関数でディレクトリ内のファイルの参照 設定数が多いオブジェクトをyamlで管理 Terraform コード 参照先ディレクトリ
  18. | © 2025 Cloud Ace, Inc まとめ • dockerイメージのプッシュとデプロイを分離し、CIとCDを別々のパイプラインを構築す る。 •

    運用に使うリソースのみを管理する環境をアプリケーションをデプロイする環境と別のプ ロジェクトを作成する。 • 安全な認証のためにWorkload Identityを使う。 • デプロイの成功・失敗をSlackで通知し、デプロイの結果に気づけるようにする。 ◦ 失敗時はすぐに気づけるようにメンションをつける • Terraformは管理しやすいように環境ごとにディレクトリで管理する。 • Terraformコードが肥大化しないように大量に作るオブジェクトはyamlファイルで管理す る。
  19. | © 2025 Cloud Ace, Inc 参考URL • Workload Identity 連携を利用して

    GitHub Actions を動かす • 外部 IP を持たない Cloud Build のプライベートプールをインター ネットに通信させる方法 • Cloud Build の結果を Slack に通知する方法 • 新しいプロダクトのデプロイパイプラインにArgo CDを使った話