$30 off During Our Annual Pro Sale. View details »

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

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. 2022/10/08 株式会社トラストバンク CTO室 SRE 香西俊幸 さいつよのEC2オートスケーリング環境 CI/CDパイプライン2022オータム

  2. 自己紹介 名前:Tocyuki(としゆき) 所属:株式会社トラストバンク    CTO室 SRE 経歴:Network→Infra→SRE 趣味:ギター、柔術(紫帯) SNS:@Tocyuki 2

  3. 会社紹介

  4. 会社概要 4 資本金 122,243,816円 親会社 株式会社チェンジ(東京証券取引所第一部) 100%連結子会社 子会社 株式会社Orb 決算期 3月 主な事業・サービス  ふるさと納税ポータルサイト「ふるさとチョイス」  パブリテック事業 「LoGoシリーズ」  エネルギー事業  ふるさとエネルギーチョイス「えねちょ」

     地域通貨事業   「chiica(チーカ)」
  5. Vision 5 目指すは「自立した持続可能な地域をつくる」こと。 トラストバンクが目指す地域共創で実現する経済循環図

  6. 6 ふるさと納税事業 パブリテック事業 エネルギー事業 地域通貨事業 主な事業・サービス

  7. SECTION 7 00 さいつよのEC2オートスケーリング環境 CI/CDパイプライン2022オータム

  8. 8 さて、みなさん

  9. 9 令和も4年に凸入していますが

  10. 10 いまどきEC2なんて使ってねーよwww

  11. 11 なんて言ってるやつ・・・

  12. 12 いねえよなぁ!!?

  13. 13 というわけで

  14. 今回お話しすること • AWS移行に伴い改善した開発環境について • EC2オートスケーリング環境下でのAMI更新方法について • これらを実現するIaCとCI/CDの実装について 14

  15. もろもろの経緯 • 2020年トラストバンクにCTOが爆誕し、AWSへのサービスイ ンフラ移行を重要施策の一つとして掲げた • 運用監視の大部分をMSPへ委託しており、運用の内製化、 AWS移行を実現すべくSREの採用活動が始まった • トラストバンク一人目のSREとして俺氏が採用されAWS移行 および運用内製化を進める

    15
  16. SECTION 16 01 AWS移行に伴い改善した開発環境について

  17. 17 開発環境

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

    PR作成 git pull Jenkins unit test DBサーバー
  19. AWS移行前の開発環境 19 踏み台サーバー 開発者 APサーバー ssh ssh GitHub Enterprise Server

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

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

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

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

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

    of Toilという感じでツライ • デプロイ方式がツライ • サーバーにSSHしてgit pull実行ツライ • サーバー、ミドルウェアの設定が変更管理されてなくてツライ • 正しい設定が何かわからず、勝手に変更されてもわからなくてツライ • ビルド処理がなくてツライ • サーバー上でcomposer installを実施したり、フロントエンドビルド成果物をGit管理ツライ
  25. 25 改善すっぞ 一人目入社SRE奴こと俺氏

  26. 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
  27. 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でビルド&デプロイができるように
  28. 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でのみ接続可能な状態
  29. 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で
  30. 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で コード化を実施
  31. 開発環境改善ポイント 31 • SSHを廃止し、SSM接続オンリーにしてよりセキュアに • 鍵の管理を不要にし、22ポートを開けないように • IAM Identity Centerによりユーザー運用管理工数を削減

    • 必要な権限はすべてIAM Identity Centerで一元管理 • 関連リソースはすべてコード化し変更管理を実施 • Ansible+PackerでAMIを、Terraformでその他のAWSリソースをすべてコード化 • JenkinsとCodeDeployによるビルド&デプロイを導入 • ビルド処理もJenkinsで行い、フロントエンドビルド成果物のGit管理から脱出 • デプロイ処理もJenkinsからCodeDeployを実行するよう
  32. 32 開発環境の利用待ち問 題と、開発環境構築の Toilも改善しなきゃ 一人目入社SRE奴こと俺氏 PR作成で専用環境立 ち上げるようにしよう 終わりなき改善活動

  33. その他の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
  34. その他の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環境
  35. その他の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
  36. その他の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
  37. その他の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ができるように
  38. その他の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
  39. その他の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
  40. Preview環境による改善ポイント 40 • PR作成すると専用環境が自動構築されるように • 開発環境構築破棄のToilから開放 • 開発環境の利用待ちから開放

  41. 41 ローカル開発環境

  42. ローカル開発環境 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
  43. AWS移行前のローカル開発環境のツラミ 43 • メインメンテナが退職済みでブラックボックス化 • 構成が複雑でわかりづらく、変更しづらい状況だった • メンテナンスもあまりされず環境差分が広がってきていた • CI/CDがない

    • DockerのBaseImage更新もローカルでの手作業となっていた • 複数システム共通のローカル開発環境として運用 • 変更が他システムの開発へ影響を及ぼしてしまっていた • init.shで複数のアプリリポジトリを同時にgit cloneするという荒業 • 事業部によっては魔改造されたzipがGoogleDriveに置かれ利用されていた
  44. 44 改善すっぞ 一人目入社SRE奴こと俺氏

  45. ローカル開発環境 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
  46. ローカル開発環境改善ポイント 46 • Ansible + Packerの資産を活用し環境差分を最小限に • PackerでDocker ImageをビルドしECRをコンテナレジストリとして利用 •

    各サービス専用のローカル開発環境として利用可能に • サービスのリポジトリにDockerfile, docker-compose.ymlを配置 • ECRにあるDocker ImageをBase Imageとして利用 • AWS IAM Identity Centerの認証情報を利用 • ECR、SSM等のAWSリソースへの接続に利用 • よりセキュアにユーザー管理運用工数も削減
  47. Section 1. まとめ 47 • PRを作成すると専用環境がCIで構築されるようにした • Ansible, Packer, Terraformなどですべてコード化した

    • ローカル開発環境もIaCコード資産を活用して整備した
  48. SECTION 48 02 EC2オートスケーリング環境下での  AMI更新方法について

  49. EC2オートスケーリング環境のツラミ 49 AMIの作成と更新 どうしよう 更新したAMIの デプロイどうしよう オートスケーリング環境 下でどのようなAMIを作る のがよいだろうか これらのツラミはToilになりがち

  50. AMI作成の基本方針 50 • Ansibleでミドルウェア、サーバー設定を実施 • PackerでAMIの作成を実施 • 起動時に必要となる処理はUserDataで対応 • アプリケーションはAutoScalingのLifecycleHookによる

    CodeDeployで配置するためAMIに含めない
  51. ハマりポイント 51 • AutoScaling LifecycleHookによるCodeDeployを発動さ せるためには最低1回はCodeDeployによるデプロイを成功さ せて、成功したデプロイメントが記録されている状態にする必 要があるので注意

  52. AMIの作成方法 52 • Packer+Ansible ProvisionerでAMIを作成 • Git管理し、CI/CDでテスト、AMIの作成と更新を実施

  53. AWS Cloud オートスケーリングスケールアウトの挙動 53 CodeDeploy Auto Scaling group Instance Instance

    Amazon EC2 Auto Scaling ③Lifecycle Hook Instance (new) ④Deploy ②インスタンスを増やす Launch Template ①トリガー発動
  54. 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)
  55. 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で実現
  56. • AMIはPackerとAnsibleで作成する • アプリケーションはAutoScaling LifecycleHookによる CodeDeployで配置する • 更新したAMIのデプロイはTerraformによる起動テンプレート &AutoScalingGroup更新をトリガーとしたInstance Refreshによるローリングアップデートで行う

    Section 2. まとめ 56
  57. SECTION 57 03 これらを実現するIaCとCI/CDについて

  58. 利用しているリポジトリと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コードを配置している リポジトリ
  59. 59 アプリケーションのCI/CD

  60. アプリケーションのCI/CD 60 PR作成 UnitTest Preview 環境構築 ビルド Code Deploy PRマージ

    Preview 環境破棄 コミット追 加 開発者
  61. アプリケーションのCI/CD 61 PR作成 UnitTest Preview 環境構築 ビルド Code Deploy PRマージ

    Preview 環境破棄 コミット追 加 開発者
  62. アプリケーションのCI/CD 62 Jenkins GitHub Enterprise Server 開発者 Terraform (Preview環境) Preview環境リソース

    CodeDeploy EC2 S3 ELB Preview環境構築(PR作成時) PR作成 terraform applyを実 行し、Preview環境リ ソースを構築 UnitTest UnitTest実行 ビルド後、CodeDeployを キックし、アプリケーション のデプロイを実施
  63. アプリケーションのCI/CD 63 PR作成 UnitTest Preview 環境構築 ビルド Code Deploy PRマージ

    Preview 環境破棄 コミット追 加 開発者
  64. アプリケーションのCI/CD 64 Jenkins GitHub Enterprise Server 開発者 Terraform (Preview環境) Preview環境リソース

    CodeDeploy EC2 S3 ELB Preview環境構築(コミット追加時) コミット 追加 terraform applyを実 行するが、差分なしで 進む UnitTest UnitTest実行 ビルド後、CodeDeployを キックし、アプリケーション のデプロイを実施
  65. アプリケーションのCI/CD 65 PR作成 UnitTest Preview 環境構築 ビルド Code Deploy PRマージ

    Preview 環境破棄 コミット追 加 開発者
  66. アプリケーションのCI/CD 66 Jenkins GitHub Enterprise Server 開発者 Preview環境リソース CodeDeploy EC2

    S3 ELB Preview環境破棄(PRマージ時) PRマージ terraform destroyを 実行し、Preview環境 リソースを破棄 Terraform (Preview環境)
  67. アプリケーションのCI/CD 67 開発環境 GitHub Enterprise Server 開発者 PRマージ 開発者 ジョブ実行

    Jenkins CodeDeploy EC2 CodeDeploy をキック デプロイ実行
  68. 68 Ansible+PackerのCI/CD

  69. Ansible+PackerのCI/CD 69 PR作成 各種チェッ ク PRマージ リリース PR作成 Instance Refresh

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

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

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

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

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

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

    Code Deploy リリース PRマージ Packer ビルド (Docker) Packer ビルド (AMI) 起動テン プレート更 新 Auto Scaling Group 更新 ECR プッシュ SRE&開発者
  76. 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の起動テン プレートバージョン を更新
  77. Ansible+PackerのCI/CD 77 PR作成 各種チェッ ク PRマージ リリース PR作成 Instance Refresh

    Code Deploy リリース PRマージ Packer ビルド (Docker) Packer ビルド (AMI) 起動テン プレート更 新 Auto Scaling Group 更新 ECR プッシュ SRE&開発者
  78. ②更新した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マージ
  79. • Preview環境はTerraformを活用して実装 • Ansible変更のCI/CDは以下の流れで実施 • git-pr-releaseで作成したデプロイ用PRのマージ • Packer+AnsibleによるAMIの更新 • Terraformによる起動テンプレートの更新

    • TerraformによるAuto Scaling Groupの更新 • Instance Refreshによるインスタンスの入れ替え • CodeDeployによるアプリケーションのデプロイ Section 3. まとめ 79
  80. SECTION 80 04 まとめ

  81. • AWS移行に伴い開発環境を改善した • OSS, IaC, CI/CD等の様々な技術を組み合わせることで 「さいつよ(?)」なEC2オートスケーリング環境が作れた • Infrastructure as

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