SRE の田中 @kenzo0107 です。
Terraform コードリーディング会を実施した結果、 エンジニア組織全体でインフラの知識の底上げができた話です。
何故やることになったか?
弊社では以下のような背景がありました。
- SRE チームが基本インフラ管理
- 会社の成長に比例し管理するインフラが増加⤴️
SRE チームの処理能力が頭打ちにとなる未来が予想され、
インフラ管理は以下体制への移行が求められていました。
上記の体制へ移行活動の一環として、
まず 「Terraform を知る」こと、ひいては 「AWS を知る」きっかけを作るべく、
Terraform コードリーディング会を開催することとしました。
勉強会の頻度や基本方針
- 週 1 回 30 分 × 15~6 回*1
- 自身の携わるプロジェクトの勉強会に参加*2
- 構成図を元にコードを読む範囲の構成を定める
- 以下を見ながら、設定の意味や挙動を確認する
- AWS 公式ドキュメント
- Terraform のドキュメント
- AWS Provider のドキュメント
- 以下を見ながら、設定の意味や挙動を確認する
- おまけ
- ディレクトリ構成
- 弊社デファクトの構成やアンチパターンの共有
- Actionsで実行してる内容:
- terraform fmt
- trivy
- tflint
- Terraform Cloud の plan 結果確認方法
- ディレクトリ構成
参考図書
勉強会の例
以下開催した勉強会の一例です。*3
タイトル | 内容 | |
---|---|---|
1 | リーディング会実施の目的と terraform の概要 | ・AWS とは? ・Terraform と Provider の関係性 *4 ・バグ?と思った時の調べ先 ・Terraformの文法 |
2 | Terraformの使い方とTerraform Cloud | ・Terraform インストール方法 ・Terraform の各種コマンド ・State, Lock の役割 ・Terraform Cloud ・Workspace ・Built-in Functions ・ 演習 Built-in Function の挙動確認・文字列分割, 配列長, 配列結合, 配列のネストの深さを揃える |
3 | RDS | ・RDS とは? ・DB Subnet, Cluster, Cluster Instance ・Cluster Parameter Group と Parameter Group の違い ・ 演習 DB パスワードのような秘匿情報はどの様に渡すか |
4 | LB | ・ALB とは? ・NLB, CLB との違い ・メンテ時のリスナールールの挙動 ・ 演習 リスナールールで Host ヘッダーが正しいか制御しているのはどういう意図か? |
5 | ECS Part1 | ・EC2 → ECS on EC2 → Fargate 歴史 ・タスク定義で定義するもの ・EKS とは?採用するメリット・デメリット ・ 演習 ECS EC2 と比較し Fargate を採用するメリット・デメリットは? |
6 | ECS Part2 | ・ECS Cluster ・ECS Service ・デプロイ時の挙動 (RollingUpdate, Blue/Green Deployment) ・無限再起動ループ ・AWS 勉強会 ECS 編 で補足 |
7 | ECS Part3 | ・ECS Service がどの機能で利用されているか認識合わせ ・タスクサイズを ECS Service 毎に変えている理由 ・rails コンテナの WEB_CONCURRENCY とタスクサイズについて |
8 | Network Part1 | ・VPC, Subnet, NAT Gateway の各役割 ・AWS の各種リソースの所属ネットワーク ・provider のリージョン指定 ・例: CloudFront の ACM は us-east-1 を指定する ・例: バックアップの設定で ap-northeast-2, 3 を指定する ・CIDR とは? ・Subnet の設計 ・弊社デファクトの構成 ・アンチパターン ・ 演習 ・NAT Gateway がどの AZ で起動しているかコードから追ってみてください ・NAT Gateway をマルチ AZ で配置している理由は?*5 |
9 | Network Part2 | ・Route Table ・Public Subnet 用の Route Table ・Private Subnet 用の Route Table ・Private Subnet からインターネットへアクセスする経路の確認 ・VPC Peering ・演習: Route Table は何に紐付ける? |
10 | IAM Part1 | ・IAM User と IAM Role ・IAM User は使わない!その理由 ・IAM Group, IAM Policy ・IAM JSON Policy 言語 ・IAMとリソース側のポリシー ・IAM ポリシーでアクセス許可と禁止がかちあった場合、どうなる? ・ 演習 ・パラメータストアに登録された SendGrid API Key を復号し値を取得する権限を所持する IAM ポリシー名は? ・その IAM ポリシーはカスタマー or AWS どちらの管理ポリシーですか? |
11 | IAM Part2 | ・IAM Role ・Assume Role |
12 | S3 | ・何故 S3 を使うか? ・プロジェクトでは何に S3 を利用しているか ・ACL (Access Control List) vs バケットポリシー ・パブリックアクセスブロック・SSE・バージョニング・アクセスログ・ライフサイクルポリシー |
13 | CloudFront | ・CloudFront とは? ・CDN, エッジサーバとは? ・CloudFront を利用した各種 Web サービスの構成 ・ 余談 JR東日本が2023年5月27日以降、JR の改札機がセンターサーバ方式を採用 *6 |
14 | WAF | ・WAF とは? ・マネージドルール, カスタマールール ・WAF のルールの評価の仕方 ・論理 statement 設定例 WAF でブロックされているか確認する方法 ・おまけ: ・IP制限ってSecurity GroupとWAFのどっちでやるべき? ・セキュリティグループとWAFがアタッチされている場合どっちが優先される? ・ 演習 ・特定のリクエストでどの WAF ルールが評価されるか? ・本番・ステージング環境でデフォルトアクションを ALLOW にしている理由は? |
15 | デプロイパイプライン | ・GitHub Actions ・Code シリーズ |
16 | Pull Requestの出し方 | ・plan 内容を確認後レビュー依頼する*7 ・適切なTerraform記法を利用しているか? ・専用のData Sourceを使える場面では使っているか? ・ファイル分割やファイル中のリソースの順序は周囲と統一してあるか? |
弊社のサーバは基本 Fargate を採用していること、 ネットワーク関連・ IAM 関連は初学者を苦しめると思われる為、 手厚めに数回実施しています。
開催後のアンケート
とある 1 プロジェクトについて参加者にアンケートを取った結果です。
他プロジェクトを見渡しても
「ちょっとした変更なら実装できる気がする」以上になったことは
元々の関心の高さもありますが、理解の一助になったかと思います。
勉強会をして変わったこと
サービスチームへインフラ管理の移譲が進む様になり理解の底上げができた実感があります。
以下対応をいただくプロジェクトもありました。
例
- RDS for MySQL から Aurora MySQL へリプレイス
- Aurora MySQL 5.7 から 8 系へのバージョンアップ
- Datadog の APM Tracer による監視追加
総評
まず勉強会で全エンジニアが Terraform を触るきっかけ作りができたことが良かったです。
プロジェクト間でノウハウを共有し効率化する流れが生まれたのも大きな変化です。
プロジェクトの人員数や理解度によって、段階的に管理を移譲していますが、 強制でなく、組織として望む体制として共有した上で進め、できる様になったら評価する、 というスタンスを取れたことが個人的にとても弊社らしいなと思いました。
アンケートでハンズオン形式でも開催を希望する声があったので今後の参考にしたいと思います。
改めまして勉強会参加いただきましたエンジニアに感謝です。
以上
参考になれば幸いです。
是非読者になってください
メドピアでは一緒に働く仲間を募集しています。 ご応募をお待ちしております!
■募集ポジションはこちら medpeer.co.jp
■エンジニア紹介ページはこちら engineer.medpeer.co.jp
■メドピア公式YouTube www.youtube.com
■メドピア公式note
style.medpeer.co.jp
*1:30分は参加ハードルを下げるのにちょうど良かった。アンケートで1時間参加は業務的に難しい、という結果でした。
*2:参加したいプロジェクトがあれば任意参加可能
*3:プロジェクトによっては希望するコンテンツを別途用意したりと適宜対応しました。
*4:ファミコンとカセットで例えたら若者には伝わらなかった 😢
*5:弊社では耐障害性向上の為、 NAT Gateway は基本マルチ AZ に配置するポリシーです。
*6:エッジサーバでキャッシュして高速化するのと逆の解決方法として紹介しました
*7:対応リソース以外の変更がある場合や意図しない変更となっていないか確認後にレビュー依頼を出すことが大事