JAWS-UG Okayama 2023 IaC/のCI/CDを考えよう
© ChatworkIaCのCI/CDを考えよう2023年6月3日 SRE部 佐々木真也Chatwork株式会社JAWS-UG Okayama 2023
View Slide
自己紹介2● 名前○ 佐々木真也● 所属○ Chatwork株式会社■ 2020年6月〜■ SRE部 マネージャー● Twitter○ @taishin● 趣味○ サッカー観戦
会社概要3会社名Chatwork株式会社代表取締役CEO山本 正喜グループ従業員数379名(2023年3月末日時点)所在地東京、大阪設立2004年11月11日
Chatworkとは4効率的に情報共有できるグループチャット仕事の見える化ができるタスク管理見落としがなくなるファイル管理いつでも会議ができるビデオ/音声通話* BOXIL SaaS AWARD 2022「ランキング部門 コラボレーション部門賞」「ベスト評価賞(初期設定の容易さNo.1、価格の満足度No.1)」を受賞 BOXIL「Chatwork」口コミ評価* Nielsen NetView 及びNielsen Mobile NetView Customized Report 2022年5月度調べ月次利用者(MAU:Monthly Active User)調査。* 調査対象はChatwork、Microsoft Teams、Slack、LINE WORKS、Skypeを含む47サービスをChatwork株式会社にて選定。
Chatworkは利用者数No.1*のビジネスチャット53月リリース10万社突破!20万社突破!導入社数39万7000社以上!(2023年3月末日時点)30万社突破!* Nielsen NetView 及びNielsen Mobile NetView Customized Report 2022年5月度調べ月次利用者(MAU:Monthly Active User)調査。調査対象はChatwork、Microsoft Teams、Slack、LINE WORKS、Skypeを含む47サービスをChatwork株式会社にて選定
IaCにCI/CD環境は必要?ChatworkのIaC環境(2年前)IaCのCI/CD環境の検討と導入した環境サービスの進化と今ならどうするか?導入後のCI/CDフローの拡張まとめ2345AGENDAアジェンダ16
Infrastructure as Code(IaC)環境にCI/CDがあると・・・8● レビュー/承認● 作業履歴● 権限● 環境依存
CI/CDがないとき9Deployコード管理コード管理コード管理DeployDeploy
CI/CDがないとき10Deployコード管理コード管理コード管理DeployDeploy● レビュー/承認○ Githubでレビューはできるが、承認がなくてもデプロイ可能● 作業履歴○ 残らない● 権限○ Deployする人全員に強い権限が必要● 環境依存○ 作業者環境によるバージョン差異
CI/CDがあるとき11CI/CDDeployコード管理/コマンド実行コード管理/コマンドコード管理/コマンド
CI/CDがあるとき12CI/CDDeployコード管理/コマンド実行コード管理/コマンドコード管理/コマンド● レビュー/承認○ GithubのPRでレビュー、Deployは承認を必須にできる● 作業履歴○ GithubのPRを見れば、履歴が分かる● 権限○ CI/CD環境にのみ権限が必要で、作業者には権限が不要● 環境依存○ 誰が実行しても同じ結果
IaC環境にCI/CDは必要?13● 複数人で作業する○ 一人でやるだけならそれほど必要ないかも● 構成の管理、変更等の運用が必要○ 初期導入だけの目的ならいらないかも
以前のChatworkでは15● ツール○ Terraformを採用● 管理○ コード(tfファイル)はGithub○ tfstateもGithub● フロー○ 開発者 ( ≒ ReadOnly権限)■ 開発者がコードを作成し、Readonly権限でplan実施■ GithubでPRを作成し、plan実行結果をGithubのコメントに貼り付け■ SREチームにレビュー依頼○ SREチーム ( ≒ Administrator権限)■ PRレビュー■ ローカル環境でapply■ tfstateをPush■ PRをマージ
以前のChatworkでは16● 課題○ 手間■ 依頼する側も作業する側も○ バージョンの差異■ 作業時に異なるTerraform、AWS Providerのバージョンで実施してしまい、なんかおかしなことになる○ apply後のtfstateのPushし忘れ■ 次回作業時に?なdiffが出る■ 慌てて前回のtfstateをプッシュ
CI/CDツール選定18● 考慮点○ 料金○ モノレポでマルチアカウント対応○ IAMキー○ Github上で操作○ インフラ管理■ 外部公開(インターネットからのアクセス)○ tfstateの保存場所○ ロック機能
CI/CDツール候補19● Terraform Cloud● Github Actions● Atlantis実際はGithub Actions + SelfHosted Runner や PipeCDも検討
Terraform Cloud20● Terraformの開発元のHashiCorp社が提供しているマネージドサービス● tfstateの保存と管理● Gitサービスと連携し、自動化を提供● GUIで設定も簡単● tfstateの差分が見れたり、通知機能もあったり色々便利
Terraform Cloud21Deployコード管理/コマンド実行tfstate.tf確認
Github Actions22● Github Actionsを使ってTerraform Workflowを実行○ setup-terraform■ Hashicorp社が提供しているAction● https://github.com/hashicorp/setup-terraform● ユーザーが開発している便利なActionも多い○ tfaction■ https://github.com/suzuki-shunsuke/tfaction○ tfmigrate■ https://github.com/minamijoyo/tfmigrate
Github Actions23Deployコード管理/コマンド実行.tftfstate
Atlantis24● Terraform Workflowを実行するOSS○ https://www.runatlantis.io/■ インフラはユーザー側で用意
Atlantis25Deployコード管理/コマンド実行tfstate.tfWebhook
比較26Terraform Cloud Github Actions Atlantis料金 5ユーザーまで無料それ以降は一人$20/月 (※)Github Actions利用料 AWSインフラ利用料モノレポでマルチアカウント対応 ディレクトリごとにWorkspaceを作成するので、設定を変えれるディレクトリごとに設定変更を変えれる機能はないが、terraform内でアカウントごとにassume-roleすれば使えるIAMキー 必要 (※) 必要 (※) 不要Github上で操作 PR作成でplanPRマージでapplyPR作成でplanPRマージでapplyPR作成でplanコメントにコマンド入力でapplyインフラ管理 不要 不要 必要設定のGit管理 ✕ ◯ ◯外部公開(インターネットからのアクセス)考慮なし 考慮なし GithubからのWebhookを受け付ける必要があるため公開する必要ありtfstateの保存場所 Terraform Cloud S3(他も可) S3(他も可)ロック機能 あり DynamoDB等で作成が必要 あり(※) 導入検討時
CI/CDツール選定27● Atlantisを採用○ IAMキー運用を避けたい■ 強い権限を持つIAMキーを外部に置きたくない■ 今後、監査とかで問題になるかも○ コード以外は自AWS環境に閉じれる● その他落選理由○ Terraform Cloud■ 高い、5人以内とか無理○ Github Actions■ Githubが旧プランのままだったので、すぐにGithub Actionsが使えなかった
構築したAtlantis 構成28Deployassume roletfstateDeploytfstateDeploytfstateWebhook111111111111 app1app2app3app4app5app6222222222222333333333333main.tfprovider "aws" {assume_role {role_arn = "arn:aws:iam::〜"}}AccountID:111111111111AccountID:222222222222AccountID:333333333333● 各アカウントに必要なIAM RoleやS3バケットは、アカウント作成時にStackSetsで自動作成
Atlantisの実行結果29● PRを作成するとPlan結果が表示される
Atlantisの実行結果30● atlantis applyコメントでApply実施 → マージ → クローズ
導入後のフロー31● 管理○ コード(tfファイル)はGithub○ tfstateもGithub● フロー○ 開発者 ( ≒ ReadOnly権限)■ 開発者がコードを作成し、Readonly権限でplan実施■ GithubにPRを作成し、plan実行結果をコメントに貼り付け■ SREチームにレビュー依頼○ SREチーム ( ≒ Administrator権限)■ PRレビュー■ ローカル環境でapply■ tfstateをPush■ PRをマージ● 管理○ コード(tfファイル)はGithub○ tfstateは各アカウントのS3● フロー○ 開発者 ( ≒ ReadOnly権限)■ 開発者がコードを作成し、PRを作成すると、自動的にplanが実行され、Githubのコメントに結果を表示される■ 自チーム内でレビュー■ Githubのコメントでapplyを実施■ 自動でPRがマージ、クローズされる
導入後のフロー32● 管理○ コード(tfファイル)はGithub○ tfstateもGithub● フロー○ 開発者 ( ≒ ReadOnly権限)■ 開発者がコードを作成し、Readonly権限でplan実施■ GithubにPRを作成し、plan実行結果をコメントに貼り付け■ SREチームにレビュー依頼○ SREチーム ( ≒ Administrator権限)■ PRレビュー■ ローカル環境でapply■ tfstateをPush■ PRをマージ● 管理○ コード(tfファイル)はGithub○ tfstateは各アカウントのS3● フロー○ 開発者 ( ≒ ReadOnly権限)■ 開発者がコードを作成し、PRを作成すると、自動的にplanが実行され、Githubのコメントに結果を表示される■ 自チーム内でレビュー■ Githubのコメントでapplyを実施■ 自動でPRがマージ、クローズされる開発者のみで完結
IAM Keyの問題34● 2021/11 Github ActionsでOIDCがサポートされ、IAM Keyが不要にhttps://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-serviceshttps://aws.amazon.com/jp/blogs/security/use-iam-roles-to-connect-github-actions-to-actions-in-aws/
IAM Keyの問題35● 2023/3 Terraform CloudでもOIDCがサポートされ、IAM Keyが不要にhttps://www.hashicorp.com/blog/terraform-cloud-adds-dynamic-provider-credentials-vault-official-cloud-providers
Terraform Cloudの費用36● 2023/5 ユーザー数による料金体系→ リソース数による料金体系に変更https://www.hashicorp.com/blog/terraform-cloud-updates-plans-with-an-enhanced-free-tier-and-more-flexibility
今選定するなら・・・ (個人の意見)37● Github Actionsかな・・・○ IAM RoleでKeyの発行必要なし○ プランも変更されている○ 費用もそれほどかからない○ インフラ運用必要なし○ 新サービス(Terraform Cloud)の導入の検討も不要
ガードレール1 CODEOWNERSによるレビューの必須化39● GithubのCODEOWNERSの機能で、IAM Policyの変更等の重要な変更については、SREチームやセキュリティーチームのレビューを必須にするhttps://docs.github.com/ja/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
ガードレール2 Conftestによるポリシーの強制40● ポリシーをOpen Policy Agentで作成、Plan結果をConftestでチェックし、ポリシーに違反している場合はapplyできないようにする○ 現在は指定したタグがついているかのチェックを実施している○ その他検討中
コストの表示 Infracost41● Infracost(https://www.infracost.io/)を組み込み、作成リソースの金額の差分を表示
まとめ43● IaCのCI/CD環境の必要性○ 複数人で作業や、構成の管理が必要な場合はあった方がよい● ツールと選定の考慮点● 導入によるフローの変化● フロー拡張の例
We are Hiring !!!45https://hrmos.co/pages/chatwork/jobs/1020019
働くをもっと楽しく、創造的に