Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

会社紹介

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Vision 5 目指すは「自立した持続可能な地域をつくる」こと。 トラストバンクが目指す地域共創で実現する経済循環図

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

8 さて、みなさん

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

12 いねえよなぁ!!?

Slide 13

Slide 13 text

13 というわけで

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

17 開発環境

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

AWS移行前の開発環境 23 踏み台サーバー 開発者 APサーバー ssh ssh GitHub Enterprise Server git pull Jenkins unit test DBサーバー せっかくJenkinsがいるのにUnitTestの みでしか使われていない PR作成

Slide 24

Slide 24 text

AWS移行前の開発環境のツラミ 24 • 開発環境の数に限りがあり予約制でツライ • 開発が活発になると待ちが発生し、開発環境の増減もすべて手作業となりツライ • 各サーバーのユーザー管理がツライ • Toil of Toilという感じでツライ • デプロイ方式がツライ • サーバーにSSHしてgit pull実行ツライ • サーバー、ミドルウェアの設定が変更管理されてなくてツライ • 正しい設定が何かわからず、勝手に変更されてもわからなくてツライ • ビルド処理がなくてツライ • サーバー上でcomposer installを実施したり、フロントエンドビルド成果物をGit管理ツライ

Slide 25

Slide 25 text

25 改善すっぞ 一人目入社SRE奴こと俺氏

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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でビルド&デプロイができるように

Slide 28

Slide 28 text

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でのみ接続可能な状態

Slide 29

Slide 29 text

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で

Slide 30

Slide 30 text

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で コード化を実施

Slide 31

Slide 31 text

開発環境改善ポイント 31 • SSHを廃止し、SSM接続オンリーにしてよりセキュアに • 鍵の管理を不要にし、22ポートを開けないように • IAM Identity Centerによりユーザー運用管理工数を削減 • 必要な権限はすべてIAM Identity Centerで一元管理 • 関連リソースはすべてコード化し変更管理を実施 • Ansible+PackerでAMIを、Terraformでその他のAWSリソースをすべてコード化 • JenkinsとCodeDeployによるビルド&デプロイを導入 • ビルド処理もJenkinsで行い、フロントエンドビルド成果物のGit管理から脱出 • デプロイ処理もJenkinsからCodeDeployを実行するよう

Slide 32

Slide 32 text

32 開発環境の利用待ち問 題と、開発環境構築の Toilも改善しなきゃ 一人目入社SRE奴こと俺氏 PR作成で専用環境立 ち上げるようにしよう 終わりなき改善活動

Slide 33

Slide 33 text

その他の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

Slide 34

Slide 34 text

その他の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環境

Slide 35

Slide 35 text

その他の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

Slide 36

Slide 36 text

その他の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

Slide 37

Slide 37 text

その他の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ができるように

Slide 38

Slide 38 text

その他の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

Slide 39

Slide 39 text

その他の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

Slide 40

Slide 40 text

Preview環境による改善ポイント 40 • PR作成すると専用環境が自動構築されるように • 開発環境構築破棄のToilから開放 • 開発環境の利用待ちから開放

Slide 41

Slide 41 text

41 ローカル開発環境

Slide 42

Slide 42 text

ローカル開発環境 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

Slide 43

Slide 43 text

AWS移行前のローカル開発環境のツラミ 43 • メインメンテナが退職済みでブラックボックス化 • 構成が複雑でわかりづらく、変更しづらい状況だった • メンテナンスもあまりされず環境差分が広がってきていた • CI/CDがない • DockerのBaseImage更新もローカルでの手作業となっていた • 複数システム共通のローカル開発環境として運用 • 変更が他システムの開発へ影響を及ぼしてしまっていた • init.shで複数のアプリリポジトリを同時にgit cloneするという荒業 • 事業部によっては魔改造されたzipがGoogleDriveに置かれ利用されていた

Slide 44

Slide 44 text

44 改善すっぞ 一人目入社SRE奴こと俺氏

Slide 45

Slide 45 text

ローカル開発環境 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

Slide 46

Slide 46 text

ローカル開発環境改善ポイント 46 • Ansible + Packerの資産を活用し環境差分を最小限に • PackerでDocker ImageをビルドしECRをコンテナレジストリとして利用 • 各サービス専用のローカル開発環境として利用可能に • サービスのリポジトリにDockerfile, docker-compose.ymlを配置 • ECRにあるDocker ImageをBase Imageとして利用 • AWS IAM Identity Centerの認証情報を利用 • ECR、SSM等のAWSリソースへの接続に利用 • よりセキュアにユーザー管理運用工数も削減

Slide 47

Slide 47 text

Section 1. まとめ 47 • PRを作成すると専用環境がCIで構築されるようにした • Ansible, Packer, Terraformなどですべてコード化した • ローカル開発環境もIaCコード資産を活用して整備した

Slide 48

Slide 48 text

SECTION 48 02 EC2オートスケーリング環境下での  AMI更新方法について

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

AWS Cloud オートスケーリングスケールアウトの挙動 53 CodeDeploy Auto Scaling group Instance Instance Amazon EC2 Auto Scaling ③Lifecycle Hook Instance (new) ④Deploy ②インスタンスを増やす Launch Template ①トリガー発動

Slide 54

Slide 54 text

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)

Slide 55

Slide 55 text

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で実現

Slide 56

Slide 56 text

• AMIはPackerとAnsibleで作成する • アプリケーションはAutoScaling LifecycleHookによる CodeDeployで配置する • 更新したAMIのデプロイはTerraformによる起動テンプレート &AutoScalingGroup更新をトリガーとしたInstance Refreshによるローリングアップデートで行う Section 2. まとめ 56

Slide 57

Slide 57 text

SECTION 57 03 これらを実現するIaCとCI/CDについて

Slide 58

Slide 58 text

利用しているリポジトリと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コードを配置している リポジトリ

Slide 59

Slide 59 text

59 アプリケーションのCI/CD

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

アプリケーションのCI/CD 67 開発環境 GitHub Enterprise Server 開発者 PRマージ 開発者 ジョブ実行 Jenkins CodeDeploy EC2 CodeDeploy をキック デプロイ実行

Slide 68

Slide 68 text

68 Ansible+PackerのCI/CD

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

Ansible+PackerのCI/CD 72 デプロイ用PRの自動作成 GitHub Actions GitHub Enterprise Cloud SRE&開発者 git-pr-releaseでリリース用のPRを 作成し、dev/stg/prd環境それぞれ へのリリースPRマージでデプロイが できるようにする mainブランチへ PRマージ

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

74 AMIの更新 GitHub Actions GitHub Enterprise Cloud SRE&開発者 AMI PackerのAnsible Provisionerで Ansibleを実行させる ECR ローカル環境用のDockerイメージ ビルドとAMIの作成を実行 Ansible+PackerのCI/CD リリースPRマージ ECRへのプッシュを実行

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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の起動テン プレートバージョン を更新

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

②更新した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マージ

Slide 79

Slide 79 text

• Preview環境はTerraformを活用して実装 • Ansible変更のCI/CDは以下の流れで実施 • git-pr-releaseで作成したデプロイ用PRのマージ • Packer+AnsibleによるAMIの更新 • Terraformによる起動テンプレートの更新 • TerraformによるAuto Scaling Groupの更新 • Instance Refreshによるインスタンスの入れ替え • CodeDeployによるアプリケーションのデプロイ Section 3. まとめ 79

Slide 80

Slide 80 text

SECTION 80 04 まとめ

Slide 81

Slide 81 text

• AWS移行に伴い開発環境を改善した • OSS, IaC, CI/CD等の様々な技術を組み合わせることで 「さいつよ(?)」なEC2オートスケーリング環境が作れた • Infrastructure as Codeを実践することにより様々な部分で アーキテクチャ選択の幅が広がり、様々な要件に対して柔軟 な改善活動を実現することができた • AWSとIaCは相性抜群なので是非実践してみよう まとめ 81

Slide 82

Slide 82 text

No content