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

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

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を使った話