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

DevFest Tokyo 2023: Google Cloudでチームで安全にデプロイをする

DevFest Tokyo 2023: Google Cloudでチームで安全にデプロイをする

DevFest Tokyo 2023: Google Cloudでチームで安全にデプロイをする

https://gdg-tokyo.connpass.com/event/301690/

サンプル
https://github.com/sakajunquality/devfest-2023

sakajunquality

December 09, 2023
Tweet

More Decks by sakajunquality

Other Decks in Technology

Transcript

  1. Google Cloudでチームで
    安全にデプロイをする
    Jun Sakata
    Google Developers Expert, Cloud
    @sakajunquality
    Introduction to Cloud Deploy

    View full-size slide

  2. “安全に” デプロイ

    View full-size slide

  3. “安全に” デプロイ
    セキュリティ?
    信頼性?
    DevOps?
    リグレッション?
    スケーラビリティ?

    View full-size slide

  4. Today’s theme:
    新しいAPI を Cloud Run にデ
    プロイする

    View full-size slide

  5. 新しいAPIのデプロイ
    The story
    長い設計やコーディング、レビューを経てようやく新しいAPIの開発が終わりました。
    開発が終わったら次はいざデプロイ。
    Cloud Deploy の機能を紹介しつつ、デプロイの仕組みを改善していきます。

    View full-size slide

  6. Cloud Run について
    - 今回は Cloud Run にデプロイします。
    - 本題と逸れるためCloud Runの詳細は割愛します。
    - 基本的には任意のコンテナイメージをHTTP/gRPCサーバーとして公開で
    きます。
    - Cloud Deploy は GKE にも対応しているため GKE でも流れは同じにな
    ります。

    View full-size slide

  7. まずは Cloud Deploy は使わずに
    サクサクとデプロイしてみます。
    Let’s Deploy

    View full-size slide

  8. まずはビルド
    $ gcloud builds submit \
    --tag asia-northeast1-docker.pkg.dev/[project]/app/test-app:v1 \
    --project [project]
    .
    Cloud Build を使っていますが
    docker build & push していると
    思ってください

    View full-size slide

  9. そしてデプロイ
    $ gcloud run deploy test-app-prd \
    --image=asia-northeast1-docker.pkg.dev/[project]/app/test-app:v1 \
    --project [project]

    View full-size slide

  10. デプロイ成功

    View full-size slide

  11. It works
    $ curl -i https://test-app-prd-umssgbe34q-an.a.run.app/
    HTTP/2 200
    {"message":"Hello, World!"}

    View full-size slide

  12. 何が問題?

    View full-size slide

  13. e.g. いろんな人がデプロイしたら
    gcloud run deloy…
    gcloud run deloy…
    gcloud run deloy…
    gcloud run deloy… gcloud run deloy…

    View full-size slide

  14. e.g. オプションがどんどん複雑になったら...?
    $ gcloud run deploy test-app-prd \
    --image=asia-northeast1-docker.pkg.dev/[project]/app/test-app:v1 \
    --cpu=1 \
    --memory=4G \
    --concurrency=500 \
    --port=8080 \
    --set-secrets… \
    --set-env=vars… \
    --project [project]
    ...

    View full-size slide

  15. e.g. あるいは特定の人しかできない
    見守るだけ
    見守るだけ

    View full-size slide

  16. e.g. いきなり本番を破壊

    View full-size slide

  17. ローカルから手続き的にデプロイし
    ていたものを、CI/CDで自動化し
    チームでデプロイできるようにしま
    す。
    CI/CDが必要

    View full-size slide

  18. 今回のデモの設定ファイル
    https://github.com/sakajunquality/devfest-2023
    にて公開(予定)
    スライド抜粋した設定のみ記載します
    ぜひいろいろ試してみてください

    View full-size slide

  19. Cloud Deploy の実行について
    Cloud Deploy 自体の機能にフォーカスするため、Cloud Deploy へのリリース作成
    などの自動化については割愛します。
    GitHub の場合はこちらのactionを組み合わせると簡単にできます。
    - https://github.com/google-github-actions/auth
    - https://github.com/google-github-actions/create-cloud-deploy-release
    https://cloud.google.com/blog/ja/products/devops-sre/using-github-actions-
    with-google-cloud-deploy?hl=ja なども参考に

    View full-size slide

  20. apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
    name: test-app-prd
    spec:
    template:
    spec:
    serviceAccountName: run-sa
    containers:
    - image: app
    ports:
    - name: http1
    containerPort: 8080
    resources:
    limits:
    cpu: 1000m
    memory: 256Mi
    Cloud Run サービスの定義
    後ほど解説するのでここは雰囲気
    だけで
    (Kubernetes に慣れてる方は
    Deployment と思ってください)

    View full-size slide

  21. 後ほど解説するのでここは雰囲気
    だけで
    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
    name: test-app
    description: test-app application pipeline
    serialPipeline:
    stages:
    - targetId: prd-test-app
    profiles: [prd]
    ---
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
    name: prd-test-app
    description: Cloud Run production
    run:
    location: projects/[project]/locations/asia-northeast1
    Cloud Deployの設定

    View full-size slide

  22. どの設定ファイルをデプロイするか
    などを定義します
    apiVersion: skaffold/v3alpha1
    kind: Config
    metadata:
    name: test-app
    profiles:
    - name: prd
    manifests:
    rawYaml:
    - service-prd.yaml
    deploy:
    cloudrun: {}
    Skaffold の設定

    View full-size slide

  23. Pipeline作成

    View full-size slide

  24. デプロイ開始!

    View full-size slide

  25. デプロイ開始!

    View full-size slide

  26. デプロイ完了

    View full-size slide

  27. It works
    $ curl -i https://test-app-prd-umssgbe34q-an.a.run.app/
    HTTP/2 200
    {"message":"Hello, World!"}

    View full-size slide

  28. Deliver continuously to Google Kubernetes Engine,
    Cloud Run, and Anthos.
    Cloud Deploy について

    View full-size slide

  29. Google Cloud Deploy provides an
    opinionated on-ramp to GKE, Cloud Run, and
    Anthos via Skaffold. Leverage built-in best
    practices which keep pipelines durable by
    insulating them against changes.
    Google Cloud Deploy
    https://cloud.google.com/deploy?hl=en

    View full-size slide

  30. Google Cloud Deploy provides an
    opinionated on-ramp to GKE, Cloud Run, and
    Anthos via Skaffold. Leverage built-in best
    practices which keep pipelines durable by
    insulating them against changes.
    Google Cloud Deploy
    https://cloud.google.com/deploy?hl=en

    View full-size slide

  31. - Google Cloud のフルマネージドのCD
    - GKE や Cloud Run にデプロイが可能
    - Skaffold を利用
    - 宣言的にデプロイやパイプライン定義
    Cloud Deploy

    View full-size slide

  32. デプロイのためにUIが特化

    View full-size slide

  33. Declarative v.s. Imperative
    宣言的/命令的なデプロイ

    View full-size slide

  34. 命令的なデプロイ: Imperative Deploy
    - 手続き的に手順を羅列
    - e.g. Cloud Build や GitHub Actions など
    - 単純にデプロイするだけなら1-2コマンドで解決
    - e.g. gcloud run deploy --source …
    - 直感的でわかりやすく自由度が高い
    - 自由度が高い反面、カオスになる場合も

    View full-size slide

  35. - 手順ではなく理想の状態 (Desired state) を定義
    - Cloud Deployはこちら
    - yamlなどの設定が難しい(ように思える)反面、フレームワークに乗ってデプロイを
    することが可能
    宣言的なデプロイ: Declarative Deploy

    View full-size slide

  36. Cloud Deployの設定

    View full-size slide

  37. 概念や仕組みについて解説(使う前に一読しておくとよき)
    - https://cloud.google.com/deploy/docs/terminology
    - https://cloud.google.com/deploy/docs/architecture
    Cloud Deploy の概念やアーキテクチャ

    View full-size slide

  38. - デプロイ対象の設定
    - Cloud RunやKubernetesの定義
    - e.g. https://cloud.google.com/run/docs/reference/yaml/v1
    - skaffoldの設定
    - 何をデプロイするか
    - Cloud Deployの設定 (DeliveryPipeline や Target)
    - どこにどうやってデプロイするか
    Cloud Deploy の設定

    View full-size slide

  39. 本番にいきなりリリースせず、社内
    向けの環境としてstagingを用意しま

    Serial Pipeline

    View full-size slide

  40. apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
    name: test-app
    description: test-app application pipeline
    serialPipeline:
    stages:
    - targetId: stg-test-app
    profiles: [stg]
    - targetId: prd-test-app
    profiles: [prd]
    ここが差分
    prdの前にstgを追加
    Cloud Deployの設定

    View full-size slide

  41. Pipelineの更新
    prd の前に stg ができてる

    View full-size slide

  42. stgにデプロイ中

    View full-size slide

  43. stgにデプロイ成功

    View full-size slide

  44. prdにデプロイを進める
    Promoteでprdに進める

    View full-size slide

  45. prdにデプロイを進める

    View full-size slide

  46. prdにデプロイ中

    View full-size slide

  47. prdにデプロイ完了

    View full-size slide

  48. stg/prdのサービスができてる
    簡易的に同じプロジェクトにデプロイしていますが、環境ごとにプロ
    ジェクトを分けることをおすすめします。

    View full-size slide

  49. - prd(production) の前に stg (staging) 環境にデプロイするようなシリアルなパイプ
    ラインを構成することが可能
    - パラレルに複数のターゲットにデプロイすることも可能(後述)
    - prdの前にstgに成功するといったことを強制力をもたせられる
    Serial Pipeline

    View full-size slide

  50. 人間はクリックすら忘れる!ので自
    動化をしたい。
    Automation

    View full-size slide

  51. apiVersion: deploy.cloud.google.com/v1
    kind: Automation
    metadata:
    name: test-app/promote
    description: Promotes a release to the next target
    suspended: false
    serviceAccount: sa
    selector:
    - target:
    id: "*"
    rules:
    - promoteRelease:
    name: "promote-release"
    toTargetId: "@next"
    自動化も宣言的に設定
    Cloud Deployの設定
    次のステージに
    promoteする

    View full-size slide

  52. 先程のPipelineに新しくリリース

    View full-size slide

  53. stgにデプロイ

    View full-size slide

  54. stgが終わると自動でprdへ

    View full-size slide

  55. 自動化の履歴
    設定した自動化が実際
    に動いた

    View full-size slide

  56. Automationの詳細

    View full-size slide

  57. - リリースを自動化
    - 現在対応しているのは、promoteとadvance
    - それぞれステージを次に進めるのと、canaryを次に進めます(後述)
    - https://cloud.google.com/deploy/docs/automation?hl=en
    - ブログでも紹介しています
    https://medium.com/sakajunlabs/automation-is-here-for-cloud-deploy-408b
    33456fce
    Automation

    View full-size slide

  58. とはいえ重要なサービスは人間がレ
    ビューしてからリリースさせたいケー
    スも
    Approve

    View full-size slide

  59. Cloud Deployの設定
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
    name: prd-test-app
    description: Cloud Run production
    requireApproval: true
    run:
    location: projects/[project]/locations/asia-northeast1
    ここだけ

    View full-size slide

  60. Pipeline に approval のステップが挟まる

    View full-size slide

  61. 同様にリリースし、stgにデプロイ

    View full-size slide

  62. prdに進むもapproval待ちで止まる

    View full-size slide

  63. 内容を確認して承認
    DeployとApprovalでIAM Roleが別れており権
    限の分離が可能

    View full-size slide

  64. Approve前に差分も確認できる

    View full-size slide

  65. Approveでprdへデプロイ開始

    View full-size slide

  66. テストもないのに自動化...?しないよ
    ね?リリース後の確認も自動化した
    いな?
    Verification

    View full-size slide

  67. Cloud Deployの設定
    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
    name: test-app
    description: test-app application pipeline
    serialPipeline:
    stages:
    - targetId: stg-test-app
    profiles: [stg]
    strategy:
    standard:
    verify: true
    verifyを有効化

    View full-size slide

  68. Cloud Deployの設定
    apiVersion: skaffold/v3alpha1
    kind: Config
    metadata:
    name: test-app
    // 省略
    deploy:
    cloudrun: {}
    verify:
    - name: verify
    container:
    name: verify
    image: ubuntu
    command:
    - echo
    - ok
    Verifyで何をするか
    今回は ok と出力するのみ
    もし手元で試される場合は、
    exit 1に変えてみてください

    View full-size slide

  69. おなじみのPipeline

    View full-size slide

  70. stgにデプロイしてから

    View full-size slide

  71. prdにデプロイ

    View full-size slide

  72. どちらも成功

    View full-size slide

  73. Deploy後にVerifyのjobが動いている
    Verify の実行ログ
    (ここでは簡易的に echo okしいてるのみ)
    Verifyの実行

    View full-size slide

  74. - デプロイが意図した挙動になっているか検証
    - コンテナでスクリプトやコマンドを実行可能
    - e.g. エンドポイントが正しいレスポンスを返しているか
    - https://cloud.google.com/deploy/docs/verify-deployment?hl=en
    Verification

    View full-size slide

  75. 新しい機能や大きな変更を全ユー
    ザーに提供すると問題があった場合
    に影響が大きくなる可能性も。
    Canary Deploy を利用して少しの割
    合から徐々にリリースをしていきま
    す。
    Canary Deploy

    View full-size slide

  76. Cloud Deployの設定
    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
    // 省略
    - targetId: prd-test-app
    profiles: [prd]
    strategy:
    canary:
    runtimeConfig:
    cloudRun:
    automaticTrafficControl: true
    canaryDeployment:
    percentages: [25, 50, 75]
    verify: true
    カナリアの割合を指定

    View full-size slide

  77. おなじみのpipeline

    View full-size slide

  78. まずはstgにデプロイ

    View full-size slide

  79. そしてprdへ (ただし25%)

    View full-size slide

  80. prdで25%のトラフィックのみ新しいバージョンに

    View full-size slide

  81. Cloud Deployの設定
    apiVersion: deploy.cloud.google.com/v1
    kind: Automation
    metadata:
    name: test-app/advance
    // 省略
    rules:
    - advanceRollout:
    name: "advance-rollout-to-50"
    sourcePhases: ["canary-25"]
    wait: 1m
    - advanceRollout:
    name: "advance-rollout-to-75"
    sourcePhases: ["canary-50"]
    wait: 10m
    カナリアも自動化!
    1分後に25%->50%へ
    (verifyが通れば)
    10分後に75%へ

    View full-size slide

  82. Automationで75%まで

    View full-size slide

  83. 最後は手動で(自動化もできます)

    View full-size slide

  84. 確認が出ます

    View full-size slide

  85. prd 100% デプロイ中

    View full-size slide

  86. prdで100%トラフィックを切り替え完了

    View full-size slide

  87. - 一般的なCanary Deploy(カナリアデプロイ)を提供
    - Cloud Runは組み込みのTraffic Split機能ベースで
    - GKEの場合コンテナの数またはGateway APIを利用したトラフィックベース
    - https://cloud.google.com/deploy/docs/deployment-strategies/canary?hl=en
    Canary Deployについて

    View full-size slide

  88. サービスがスケールして海外リー
    ジョンにもサービスを展開
    Parallel Deploy

    View full-size slide

  89. Cloud Deployの設定
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
    name: prd-all-test-app
    description: deploy to the prod all regions
    multiTarget:
    targetIds: [prd-test-app, prd-us-test-app]
    複数のターゲットにデプロイ

    View full-size slide

  90. Pipeline の見た目が少し変わって

    View full-size slide

  91. 複数リージョンにデプロイされている
    内部ではそれぞれのTargetに向けたデプロイ

    View full-size slide

  92. - 複数のターゲットにデプロイ
    - e.g. 別リージョンのCloud Runや複数の GKE クラスター
    - Deploy parameterを利用することで環境差を吸収することも
    - https://cloud.google.com/deploy/docs/parallel?hl=en
    Parallel Deploy

    View full-size slide

  93. まとめ
    安全なデプロイ
    各プラットフォームは開発者体験を重視しており、デプロイするだけなら簡単にデプロ
    イが可能になっている。
    一方でチームで安全に継続的に行えるようにするようにするにはしっかりと仕組みを
    作っていく必要がある。

    View full-size slide

  94. まとめ
    Cloud Deploy
    Cloud Deploy は Cloud Run や GKE へのフルマネージドのデプロイ パイプラインを
    構築することが可能。
    専用のUIやデプロイの仕組みが統一されるだけではなく、canaryやverificationと
    いったデプロイ戦略を高めたり automation のように自動化をする機能が充実してい
    る。

    View full-size slide

  95. Thank You!
    Jun Sakata
    Google Developers Expert, Cloud
    @sakajunquality

    View full-size slide