「開発生産性を上げるためのデプロイ戦略」講演メモ (AWS Summit Tokyo 2015) #AWSSummit

メモった。間違い等あるかもしれませんが、その場合はごめんなさい。

デプロイとは

  • あらゆるコードやバイナリ、アセットなどの配布をデプロイと定義
  • インフラストラクチャーの構築はプロビジョニングとする

なぜデプロイに注目する必要があるのか

  • AWSのイノベーションのペース
    • 合計1000以上の新サービス、新機能をリリース
    • フィードバックループを回し続け、顧客の期待に応え続ける

Amazon.comのデプロイ

  • 平日のデプロイ間隔 11.6秒
  • 1時間あたりの最高デプロイ回数 1079回
  • 1回のデプロイで平均10000台のホストに変更を加える
  • 1回のデプロイで最大30000台のホストへの変更

Two pizzaルール

  • 1チームの大きさは、2枚のピザで全員お腹いっぱいになれる規模
  • それを保って頻繁にデプロイできるレベルに
  • 作った人が運用をやるポリシー

クロスファンクショナルチーム

各チームメンバーが何ができるかをマトリクスにして、チーム全体で必要な技術をカバーする

ポイント

  • 多くのチームが非同期にデプロイする必要
  • APIによるチーム間の疎結合化
  • デプロイの自動化と全チームでの利用

従来型のデプロイの問題点

  • 手順書がメンテナンスされない
  • 手作業で間違う
    • いままで何度もやっているはずなのに
  • 職人芸への依存
  • リリース失敗・戻しにも失敗
  • 長時間作業と失敗率の拡大
  • 結果としてコスト増大・流出
  • リリースにいつも自信を持てない
  • どんどんプロセスが重くなる
    • 失敗するとチェックを重ねる事になる、トラブルごとに増える


TPSの側面からみると、色々なムダがある。ムダを排除して本業にリソースを集中できるように。

デプロイの戦略検討のポイント

  • いつ?
  • 誰が?
  • 要件は?
    • ダウンタイムの許容度、グレースフルの必要性
  • プロセスは?
    • 承認の必要性


チームサイズ・プロダクト規模・アーキテクチャが関係

自動化の基本原則

  • 完全自動化の原則
  • 変更量最小化の原則
  • 高速完了の原則
  • 不可逆変更回避の原則
  • 成功・失敗自動判定の原則
  • 失敗時ロールバックの原則
  • デプロイパターン集約の原則

ベストプラクティス

  • バージョン管理
  • テスト自動化
  • 継続的インテグレーション


※ 安全な開発のためPJ初期からやるべし
※ 常にリリース可能な状態に保つようにする

費用対効果

  • ソフトウェアの複雑化が進行
    • 手作業で同時に複数箇所を間違えずに操作する事が困難
  • デプロイ回数はそもそもとても多い現実
    • 本番環境にだけデプロイするわけじゃない。様々な環境に何度もデプロイしているはずなので、プロセス全体をみて考える
    • 自動化しればすぐに損益分岐点を交差する
  • その他の潜在的コスト
    • 新人の教育コスト削減
    • 失敗した際に発生する損失の削減

デプロイのパターン

  • 単純デプロイ
  • サービス停止&デプロイ
  • 読み取り専用化&...
  • 機能縮退化&...
  • 半数切り離し&...
  • ブルーグリーンデプロイメント
  • カナリアリリース

AWSにおける開発系サービス

  • Code Commit
  • Code Pipeline
  • Elastic BeansTalk
  • OpsWorks
  • CodeDeploy
  • Cloud Formation
  • Cloud Watch

Sorryページへの切り替えパターン

  • ELBを手前に入れる
  • Route53によるDNSフェイルオーバー
    • TTLを考慮しないといけない

ELBのConnection Draining

  • ELBでは切り離した際、新規割り振りを中止して、処理中のリクエストが終わるまで待つ
  • タイムアウトは3600秒

その他注意ポイント

  • 処理フローの互換性の確保
    • 前バージョンから新バージョンがリクエストを受けても、処理を継続できるようにする
  • 開発環境と本番環境の相違点を確認
    • 接続先DBやパスワード、環境によって変化するもの
    • 環境変数か設定ファイルのどちらかで管理、おすすめは環境変数
    • ハードコードやAMI埋め込みは避ける

AutoScalingを使っているパターン

  • 最新のアプリケーションがデプロイされている必要がある
  • 稼働中インスタンスへのデプロイをどうするか
  • AMIをどこまで作り込むか
  • インスタンス起動時のcloud-initの活用

どんなAMIを使うか

  • 1. 全部いるAMI (デプロイすれば終わり)
    • 同一性が確保、ただしデプロイごとにAMI作り直し
  • 2. Golden Image (ライブラリやコードは起動時にとってくるとか)
    • アプリコードを取得するのみなので、扱いやすい
  • 3. 最小構成AMI (Chefとかだけ入れておいて、起動時にプロビジョニングからやる)
    • 中身は自由に変更できるが、起動処理に時間がかかる

AMI自動作成例

Jenkins + Packer + Serverspec とか

マイクロサービスでの注意点

  • サービスの後方互換性を確保する
    • 各サービスは同じタイミングでデプロイしない
    • インターフェースを変えるときは新旧両方用意しておく




まとめ


クラウドAMAZON EC2/S3のすべて (ITpro BOOKs)

クラウドAMAZON EC2/S3のすべて (ITpro BOOKs)