技術書典6で『Pragmatic Terraform on AWS』という本を出します #技術書典

タイトルどおり、TerraformとAWSについて書いた本を出す予定です。いま絶賛執筆中で、ちょこちょこ変わるかもしれませんが、だいたい構成が固まってきたので目次案を公開しておきます。

概要

『Pragmatic Terraform on AWS』では、Terraformを使ってAWS上にシステムを構築するノウハウを、100以上のサンプルコードとともに紹介します。ECS Fargateなどのマネージドサービスを中心にアーキテクチャ設計を行い、Terraformで実装していきます。Terraformは入門的な内容からスタートし、コードの構造化やベストプラクティス、モジュール設計まで踏み込みます。

目次(案)

本書は3部構成です。1〜3章までが「入門編」で、Terraformのインストールからはじめて、文法などを一気に学びます。4〜16章までが「実践編」で、各種リソースのTerraformのコードと設計のポイントを紹介します。17〜23章が「設計編」で、メンテナンス性の高いTerraformの設計について考察します。

 1章 はじめに
   1.1 対象読者
   1.2 対象環境
 2章 インストール
   2.1 Homebrew
   2.2 tfenv
   2.3 クレデンシャル
 3章 Terraformの基本
   3.1 リソースの作成
      3.1.1 HCL(HashiCorp Configuration Language)
      3.1.2 terraform init
      3.1.3 terraform plan
      3.1.4 terraform apply
   3.2 リソースの更新
      3.2.1 リソースの設定変更
      3.2.2 リソースの再作成
   3.3 Terraformの構成要素
      3.3.1 Input Variable
      3.3.2 Local Value
      3.3.3 Output
      3.3.4 Data Source
      3.3.5 Provider
   3.4 Interpolation Syntax
      3.4.1 参照
      3.4.2 条件分岐
      3.4.3 組み込み関数
      3.4.4 テンプレート
   3.5 tfstateファイル
   3.6 リソースの削除
   3.7 モジュール
      3.7.1 モジュールの作成
      3.7.2 モジュールの利用
 4章 全体設計
   4.1 システム要件
   4.2 システムアーキテクチャ
 5章 権限管理
   5.1 IAMポリシー
   5.2 IAMロール
   5.3 IAMロールのモジュール化
 6章 ストレージ
   6.1 S3(Simple Storage Service)
   6.2 S3の代表的なユースケース
      6.2.1 プライベートバケット
      6.2.2 パブリックバケット
      6.2.3 ログバケット
 7章 ネットワーク
   7.1 パブリックネットワーク
      7.1.1 VPC(Virtual Private Cloud)
      7.1.2 パブリックサブネット
      7.1.3 インターネットゲートウェイ
      7.1.4 ルートテーブル
   7.2 プライベートネットワーク
      7.2.1 プライベートサブネット
      7.2.2 NATゲートウェイ
      7.2.3 依存関係の明示
   7.3 マルチAZ
      7.3.1 パブリックネットワークのマルチAZ化
      7.3.2 プライベートネットワークのマルチAZ化
   7.4 ファイアウォール
      7.4.1 セキュリティグループ
      7.4.2 セキュリティグループのモジュール化
 8章 ロードバランサとDNS
   8.1 ALBのコンポーネント
   8.2 HTTP用ロードバランサ
      8.2.1 ロードバランサ
      8.2.2 リスナー
   8.3 Route 53
      8.3.1 ドメインの登録
      8.3.2 ホストゾーン
      8.3.3 DNSレコード
   8.4 ACM(AWS Certificate Manager)
      8.4.1 SSL証明書の作成
      8.4.2 SSL証明書の検証
   8.5 HTTPS用ロードバランサ
      8.5.1 HTTPSリスナー
      8.5.2 HTTPのリダイレクト
   8.6 リクエストルーティング
      8.6.1 ターゲットグループ
      8.6.2 リスナールール
 9章 コンテナオーケストレーション
   9.1 ECSのコンポーネント
   9.2 Webサーバの構築
      9.2.1 クラスタ
      9.2.2 タスク定義
      9.2.3 サービス
   9.3 ECS Fargateにおけるロギング
      9.3.1 CloudWatch Logs
      9.3.2 ECSタスク実行IAMロール
      9.3.3 Dockerコンテナのロギング
10章 バッチ
   10.1 バッチ設計
      10.1.1 バッチ設計の基本原則
      10.1.2 ジョブ管理
   10.2 ECS Scheduled Tasks
      10.2.1 バッチ用タスク定義
      10.2.2 CloudWatchイベントルール
      10.2.3 CloudWatchイベントターゲット
11章 鍵管理
   11.1 KMS(Key Management Service)
      11.1.1 CMK(Customer Master Key)
      11.1.2 エイリアス
12章 設定管理
   12.1 コンテナの設定管理
   12.2 SSMパラメータストア
      12.2.1 AWS CLIによる操作
      12.2.2 Terraformによるコード化
      12.2.3 ECSとの統合
13章 データストア
   13.1 RDS(Relational Database Service)
      13.1.1 DBパラメータグループ
      13.1.2 DBオプショングループ
      13.1.3 DBサブネットグループ
      13.1.4 DBインスタンス
   13.2 ElastiCache
      13.2.1 ElastiCacheパラメータグループ
      13.2.2 ElastiCacheサブネットグループ
      13.2.3 ElastiCacheレプリケーショングループ
14章 デプロイメントパイプライン
   14.1 デプロイメントパイプラインの設計
   14.2 コンテナレジストリ
      14.2.1 ECRリポジトリ
      14.2.2 ECRライフサイクルポリシー
   14.3 継続的インテグレーション
      14.3.1 CodeBuildサービスロール
      14.3.2 CodeBuildプロジェクト
      14.3.3 ビルド定義
   14.4 継続的デリバリー
      14.4.1 CodePipelineサービスロール
      14.4.2 CodePipeline
      14.4.3 WebhookによるGitHub連携
15章 SSHレスオペレーション
   15.1 オペレーションサーバの設計
   15.2 Session Manager
      15.2.1 インスタンスプロファイル
      15.2.2 EC2インスタンス
      15.2.3 SSM Document
   15.3 ローカル環境
      15.3.1 Session Manager Plugin
      15.3.2 シェルアクセス
16章 ロギング
   16.1 ロギングの種類
      16.1.1 S3へのロギング
      16.1.2 CloudWatch Logsへのロギング
   16.2 ログ検索
      16.2.1 Athena
      16.2.2 CloudWatch Logs Insights
   16.3 ログ永続化
      16.3.1 Kinesis Data Firehose配信ストリーム
      16.3.2 CloudWatch Logsサブスクリプションフィルタ
17章 構造化
   17.1 モノリス
   17.2 モジュールの分離
      17.2.1 別ディレクトリへの分離
      17.2.2 別リポジトリへの分離
   17.3 独立した環境
      17.3.1 ディレクトリ分割
      17.3.2 Workspaces
   17.4 コンポーネント分割
      17.4.1 安定度
      17.4.2 ステートフル
      17.4.3 影響範囲
      17.4.4 組織のライフサイクル
      17.4.5 関心事
   17.5 依存関係の制御
18章 Terraformベストプラクティス
   18.1 リモートのバックエンドを利用する
   18.2 Terraformバージョンを固定する
   18.3 プロバイダバージョンを固定する
   18.4 リモートステートを使いこなす
   18.5 データソースを使いこなす
   18.6 削除操作を抑止する
   18.7 コードフォーマットをかける
   18.8 バリデーションをかける
19章 AWSベストプラクティス
   19.1 インライン定義を避ける
   19.2 ネットワーク系デフォルトリソースの使用を避ける
   19.3 データストア系デフォルトリソースの使用を避ける
   19.4 APIの削除保護機能を活用する
   19.5 暗黙的な依存関係を把握する
   19.6 暗黙的に作られるリソースに注意する
20章 モジュール設計
   20.1 モジュールの設計原則
      20.1.1 Small is beautiful
      20.1.2 疎結合
      20.1.3 高凝集
      20.1.4 認知的負荷
   20.2 優れたモジュールの構成要素
      20.2.1 Standard Module Structure
      20.2.2 ドキュメンテーション
      20.2.3 バージョニング
   20.3 公開モジュール
      20.3.1 公開モジュールの実装
      20.3.2 GitHub
      20.3.3 Terraform Module Registry
      20.3.4 バージョンアップ
      20.3.5 公開モジュールの利用
21章 落ち葉拾い
   21.1 高速化
   21.2 構成ドリフト
   21.3 公式ドキュメントを読むコツ
   21.4 Terraform管理外のリソース
22章 おわりに

頒布情報

技術書典6で出すと書きましたが、普通に抽選には落ちたので委託です。@yagitchさんのブースに置かせていただきます。本当にありがとうございます。技術書典6は4/14に池袋サンシャインシティで開催されます。

自分が紙でほしいので、紙で出す予定です。電子書籍は余力があったらやりますが、執筆を優先してるので、ちょっとまだどうなるかわかりません。

書いてる人

アプリケーションアーキテクチャ設計が得意なSREです。早くインフラが得意と言えるようになりたいです。最近はもっぱらTerraformを書いています。あと、わりと何かをまとめるのが得意な気がします。本のクオリティの参考に、昔書いたQiitaの記事のリンク貼っておきます。これぐらいのクオリティになると思うので、参考にしていただければ幸いです。

本を書くなどはじめてで、全力で書いてたら150ページ超えてしまいました。同人誌だし、書きたいだけ書くかみたいな気持ちなので、あんまりページ数は減りそうにありません。

だんだんとりとめがなくなってきたので、このあたりで。何卒よろしくおねがいします。

@tmknom

2/20追記

委託をお願いしている@yagitchさんの配置場所が「か11」に決まりました。ぜひともお立ち寄りください!