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

さいつよのEC2オートスケーリング環境CICDパイプライン2022オータム/Strongest...

Tocyuki
October 08, 2022

さいつよのEC2オートスケーリング環境CICDパイプライン2022オータム/Strongest EC2 Autoscaling Environment CI/CD Pipeline 2022 Autumn

Tocyuki

October 08, 2022
Tweet

More Decks by Tocyuki

Other Decks in Programming

Transcript

  1. AWS移行前の開発環境 19 踏み台サーバー 開発者 APサーバー ssh ssh GitHub Enterprise Server

    git pull Jenkins unit test DBサーバー 利用できる環境の数に限りがあり、利用 に待ちが発生することもあり、環境を増 やすにも手作業が発生 PR作成
  2. AWS移行前の開発環境 20 踏み台サーバー 開発者 APサーバー ssh ssh GitHub Enterprise Server

    git pull Jenkins unit test DBサーバー ミドルウェア、設定の管理がされておら ず、複数サービスが乗っかっている PR作成
  3. AWS移行前の開発環境 21 踏み台サーバー 開発者 APサーバー ssh ssh GitHub Enterprise Server

    git pull Jenkins unit test DBサーバー Linuxユーザー管理という Toil PR作成
  4. AWS移行前の開発環境 22 踏み台サーバー 開発者 APサーバー ssh ssh GitHub Enterprise Server

    git pull Jenkins unit test DBサーバー デプロイのためにわざわざサーバーに SSHしてgit pullするのツライ PR作成
  5. AWS移行前の開発環境 23 踏み台サーバー 開発者 APサーバー ssh ssh GitHub Enterprise Server

    git pull Jenkins unit test DBサーバー せっかくJenkinsがいるのにUnitTestの みでしか使われていない PR作成
  6. AWS移行前の開発環境のツラミ 24 • 開発環境の数に限りがあり予約制でツライ • 開発が活発になると待ちが発生し、開発環境の増減もすべて手作業となりツライ • 各サーバーのユーザー管理がツライ • Toil

    of Toilという感じでツライ • デプロイ方式がツライ • サーバーにSSHしてgit pull実行ツライ • サーバー、ミドルウェアの設定が変更管理されてなくてツライ • 正しい設定が何かわからず、勝手に変更されてもわからなくてツライ • ビルド処理がなくてツライ • サーバー上でcomposer installを実施したり、フロントエンドビルド成果物をGit管理ツライ
  7. Auto Scaling group 開発環境 AWS移行後の改善した開発環境 26 開発者 GitHub Enterprise Server

    PR作成 Jenkins CodeDeploy EC2 S3 ELB create deployment deploy create revision ssm DB IAM Identity Center 認証 build unittest
  8. Auto Scaling group 開発環境 AWS移行後の改善した開発環境 27 開発者 GitHub Enterprise Server

    PR作成 Jenkins CodeDeploy EC2 S3 ELB create deployment deploy create revision ssm DB IAM Identity Center 認証 build unittest Jenkinsでビルド&デプロイができるように
  9. Auto Scaling group 開発環境 AWS移行後の改善した開発環境 28 開発者 GitHub Enterprise Server

    PR作成 Jenkins CodeDeploy EC2 S3 ELB create deployment deploy create revision ssm DB IAM Identity Center 認証 build unittest EC2にはSSMでのみ接続可能な状態
  10. Auto Scaling group 開発環境 AWS移行後の改善した開発環境 29 開発者 GitHub Enterprise Server

    PR作成 Jenkins CodeDeploy EC2 S3 ELB create deployment deploy create revision ssm DB IAM Identity Center 認証 build unittest ユーザー管理はAWS IAM Identity Centerで
  11. Auto Scaling group 開発環境 AWS移行後の改善した開発環境 30 開発者 GitHub Enterprise Server

    PR作成 Jenkins CodeDeploy EC2 S3 ELB create deployment deploy create revision ssm DB IAM Identity Center 認証 build unittest AMIはAnsible+Packerでコード化し、 その他のAWSリソースはTerraformで コード化を実施
  12. 開発環境改善ポイント 31 • SSHを廃止し、SSM接続オンリーにしてよりセキュアに • 鍵の管理を不要にし、22ポートを開けないように • IAM Identity Centerによりユーザー運用管理工数を削減

    • 必要な権限はすべてIAM Identity Centerで一元管理 • 関連リソースはすべてコード化し変更管理を実施 • Ansible+PackerでAMIを、Terraformでその他のAWSリソースをすべてコード化 • JenkinsとCodeDeployによるビルド&デプロイを導入 • ビルド処理もJenkinsで行い、フロントエンドビルド成果物のGit管理から脱出 • デプロイ処理もJenkinsからCodeDeployを実行するよう
  13. その他のAWS リソース Preview環境 そして誕生したPreview環境 33 開発者 GitHub Enterprise Server PR作成

    Jenkins CodeDeploy EC2 S3 ELB terraform apply create deployment deploy create revision DB Launch Template IAM Identity Center 認証 build & unittest ssm
  14. その他のAWS リソース Preview環境 34 開発者 GitHub Enterprise Server PR作成 Jenkins

    CodeDeploy EC2 S3 ELB terraform apply create deployment deploy create revision PRを作成するとUnitTestと共にJenkinsで TerraformによるPreview環境構築、ビルド 処理、CodeDeployによるPRブランチのアプ リケーションがデプロイされる Launch Template DB IAM Identity Center 認証 build & unittest ssm そして誕生したPreview環境
  15. その他のAWS リソース Preview環境 35 開発者 GitHub Enterprise Server PR作成 Jenkins

    CodeDeploy EC2 S3 ELB terraform apply create deployment deploy create revision 構築したEC2にはSSMでのみ接続可能な状態 Launch Template DB 認証 IAM Identity Center 認証 build & unittest そして誕生したPreview環境 ssm
  16. その他のAWS リソース Preview環境 36 開発者 GitHub Enterprise Server PR作成 Jenkins

    CodeDeploy EC2 S3 ELB terraform apply create deployment deploy create revision ユーザー権限管理は AWS IAM Identity Centerにて実施 Launch Template DB 認証 IAM Identity Center 認証 build & unittest そして誕生したPreview環境 ssm
  17. その他のAWS リソース Preview環境 37 開発者 GitHub Enterprise Server PR作成 Jenkins

    CodeDeploy EC2 S3 ELB terraform apply create deployment deploy create revision Launch Template DB IAM Identity Center 認証 build & unittest そして誕生したPreview環境 ssm Preview環境用のAWSリソースは Terraformでコード化してJenkinsによる Apply&Destroyができるように
  18. その他のAWS リソース Preview環境 38 開発者 GitHub Enterprise Server PR Merge

    Jenkins CodeDeploy EC2 S3 ELB Launch Template PRマージ or 日次のバッチでTerraformによるリ ソース削除が行われる DB IAM Identity Center そして誕生したPreview環境 terraform destroy
  19. その他のAWS リソース Preview環境 39 開発者 GitHub Enterprise Server PR Merge

    Jenkins CodeDeploy EC2 S3 ELB Launch Template PRマージ or 日次のバッチでTerraformによるリ ソース削除が行われる DB IAM Identity Center そして誕生したPreview環境 terraform destroy
  20. ローカル開発環境 AWS移行前のローカル開発環境 42 Application 1 Application 2 ローカル開発環境 Application 3

    開発者 init.sh Docker Base Image git clone git clone git clone git clone docker pull 踏み台サーバー DBサーバー ssh port forwarding docker push docker compose up
  21. AWS移行前のローカル開発環境のツラミ 43 • メインメンテナが退職済みでブラックボックス化 • 構成が複雑でわかりづらく、変更しづらい状況だった • メンテナンスもあまりされず環境差分が広がってきていた • CI/CDがない

    • DockerのBaseImage更新もローカルでの手作業となっていた • 複数システム共通のローカル開発環境として運用 • 変更が他システムの開発へ影響を及ぼしてしまっていた • init.shで複数のアプリリポジトリを同時にgit cloneするという荒業 • 事業部によっては魔改造されたzipがGoogleDriveに置かれ利用されていた
  22. ローカル開発環境 AWS移行後のローカル開発環境 45 Application 2 開発者 Ansible Repository git clone

    docker pull DB EC2 ECR docker push Application 3 Application 1 git clone git clone IAM Identity Center 認証 ssm port forwarding docker compose up
  23. ローカル開発環境改善ポイント 46 • Ansible + Packerの資産を活用し環境差分を最小限に • PackerでDocker ImageをビルドしECRをコンテナレジストリとして利用 •

    各サービス専用のローカル開発環境として利用可能に • サービスのリポジトリにDockerfile, docker-compose.ymlを配置 • ECRにあるDocker ImageをBase Imageとして利用 • AWS IAM Identity Centerの認証情報を利用 • ECR、SSM等のAWSリソースへの接続に利用 • よりセキュアにユーザー管理運用工数も削減
  24. AWS Cloud オートスケーリングスケールアウトの挙動 53 CodeDeploy Auto Scaling group Instance Instance

    Amazon EC2 Auto Scaling ③Lifecycle Hook Instance (new) ④Deploy ②インスタンスを増やす Launch Template ①トリガー発動
  25. AWS Cloud 更新したAMIのデプロイ 54 CodeDeploy Auto Scaling group Instance Instance

    Amazon EC2 Auto Scaling Instance (new) ③Instance Refresh Launch Template ④Lifecycle Hook ⑤Deploy ①Update ②Update (terminated)
  26. AWS Cloud 更新したAMIのデプロイ 55 CodeDeploy Auto Scaling group Instance Instance

    Amazon EC2 Auto Scaling Instance (new) ③Instance Refresh Launch Template ④Lifecycle Hook ⑤Deploy ①Update ②Update (terminated) ①と②の更新はTerraformで実現
  27. 利用しているリポジトリとCIについて 58 リポジトリ ホスティング CI ブランチ戦略 用途 アプリケーション GitHub Enterprise

    Server Git Flow アプリケーションソースを配置している リポジトリ Ansible+Packer GitHub Enterprise Cloud GitHub Flow EC2サーバープロビジョニング用の Ansible Playbookのソースを配置し ているリポジトリ Terraform (Dev/Stg/Prd環境用) GitHub Enterprise Cloud GitHub Flow すべてのAWSリソースを管理している Terraformコードを配置しているリポジ トリ Terraform (Preview環境用) GitHub Enterprise Cloud GitHub Flow PR毎に立ち上がる環境(Preview環 境)のTerraformコードを配置している リポジトリ
  28. アプリケーションのCI/CD 62 Jenkins GitHub Enterprise Server 開発者 Terraform (Preview環境) Preview環境リソース

    CodeDeploy EC2 S3 ELB Preview環境構築(PR作成時) PR作成 terraform applyを実 行し、Preview環境リ ソースを構築 UnitTest UnitTest実行 ビルド後、CodeDeployを キックし、アプリケーション のデプロイを実施
  29. アプリケーションのCI/CD 64 Jenkins GitHub Enterprise Server 開発者 Terraform (Preview環境) Preview環境リソース

    CodeDeploy EC2 S3 ELB Preview環境構築(コミット追加時) コミット 追加 terraform applyを実 行するが、差分なしで 進む UnitTest UnitTest実行 ビルド後、CodeDeployを キックし、アプリケーション のデプロイを実施
  30. アプリケーションのCI/CD 66 Jenkins GitHub Enterprise Server 開発者 Preview環境リソース CodeDeploy EC2

    S3 ELB Preview環境破棄(PRマージ時) PRマージ terraform destroyを 実行し、Preview環境 リソースを破棄 Terraform (Preview環境)
  31. Ansible+PackerのCI/CD 69 PR作成 各種チェッ ク PRマージ リリース PR作成 Instance Refresh

    Code Deploy リリース PRマージ Packer ビルド (Docker) Packer ビルド (AMI) 起動テン プレート更 新 Auto Scaling Group 更新 ECR プッシュ SRE&開発者
  32. Ansible+PackerのCI/CD 70 PR作成 各種チェッ ク PRマージ リリース PR作成 Instance Refresh

    Code Deploy リリース PRマージ Packer ビルド (Docker) Packer ビルド (AMI) Auto Scaling Group 更新 ECR プッシュ SRE&開発者 起動テン プレート更 新
  33. Ansible+PackerのCI/CD 71 PR作成 各種チェッ ク PRマージ リリース PR作成 Instance Refresh

    Code Deploy リリース PRマージ Packer ビルド (Docker) Packer ビルド (AMI) Auto Scaling Group 更新 ECR プッシュ SRE&開発者 起動テン プレート更 新
  34. Ansible+PackerのCI/CD 72 デプロイ用PRの自動作成 GitHub Actions GitHub Enterprise Cloud SRE&開発者 git-pr-releaseでリリース用のPRを

    作成し、dev/stg/prd環境それぞれ へのリリースPRマージでデプロイが できるようにする mainブランチへ PRマージ
  35. Ansible+PackerのCI/CD 73 PR作成 各種チェッ ク PRマージ リリース PR作成 Instance Refresh

    Code Deploy リリース PRマージ Packer ビルド (Docker) Packer ビルド (AMI) Auto Scaling Group 更新 ECR プッシュ SRE&開発者 起動テン プレート更 新
  36. 74 AMIの更新 GitHub Actions GitHub Enterprise Cloud SRE&開発者 AMI PackerのAnsible

    Provisionerで Ansibleを実行させる ECR ローカル環境用のDockerイメージ ビルドとAMIの作成を実行 Ansible+PackerのCI/CD リリースPRマージ ECRへのプッシュを実行
  37. Ansible+PackerのCI/CD 75 PR作成 各種チェッ ク PRマージ リリース PR作成 Instance Refresh

    Code Deploy リリース PRマージ Packer ビルド (Docker) Packer ビルド (AMI) 起動テン プレート更 新 Auto Scaling Group 更新 ECR プッシュ SRE&開発者
  38. 76 更新したAMIのデプロイ Launch Template Terraform Auto Scaling Group EC2 GitHub

    Actions 起動テンプレートと Auto Scaling Groupを管理してい るTerraformをCheckoutし、対象リ ソースのみを更新 CodeDeploy instance refresh 起動テンプレートの更新をトリガーに Instance RefreshによるAuto Scaling Group内のインスタンスの入れ替えが行 われる GitHub Enterprise Cloud SRE&開発者 lifecycle hook 最新のAMIを取り込み 起動テンプレートを バージョンアップ Ansible+PackerのCI/CD リリースPRマージ Lifecycle Hookによる CodeDeploy実行によりア プリケーションデプロイが実 施される Auto Scaling Groupの起動テン プレートバージョン を更新
  39. Ansible+PackerのCI/CD 77 PR作成 各種チェッ ク PRマージ リリース PR作成 Instance Refresh

    Code Deploy リリース PRマージ Packer ビルド (Docker) Packer ビルド (AMI) 起動テン プレート更 新 Auto Scaling Group 更新 ECR プッシュ SRE&開発者
  40. ②更新したAMIの入れ替え ①AMI更新&Dockerイメージを作成 78 Launch Template Terraform Auto Scaling Group EC2

    GitHub Actions CodeDeploy instance refresh GitHub Enterprise Cloud SRE&開発者 lifecycle hook AMI ECR パイプライン化 Ansible+PackerのCI/CD リリースPRマージ
  41. • Preview環境はTerraformを活用して実装 • Ansible変更のCI/CDは以下の流れで実施 • git-pr-releaseで作成したデプロイ用PRのマージ • Packer+AnsibleによるAMIの更新 • Terraformによる起動テンプレートの更新

    • TerraformによるAuto Scaling Groupの更新 • Instance Refreshによるインスタンスの入れ替え • CodeDeployによるアプリケーションのデプロイ Section 3. まとめ 79
  42. • AWS移行に伴い開発環境を改善した • OSS, IaC, CI/CD等の様々な技術を組み合わせることで 「さいつよ(?)」なEC2オートスケーリング環境が作れた • Infrastructure as

    Codeを実践することにより様々な部分で アーキテクチャ選択の幅が広がり、様々な要件に対して柔軟 な改善活動を実現することができた • AWSとIaCは相性抜群なので是非実践してみよう まとめ 81