HCL2対応『Pragmatic Terraform on AWS』の目次完全版と推しポイント #技術書典

以前「技術書典6で『Pragmatic Terraform on AWS』という本を出します」という記事を公開しましたが、目次が確定し、本文の執筆もほぼ完了したので、改めて目次の完全版と推しポイントを紹介します。

nekopunch.hatenablog.com

4/8追記

無料サンプルや頒布価格を公開しているので、ぜひこちらもチェックしてください。

nekopunch.hatenablog.com

『Pragmatic Terraform on AWS』とは

Pragmatic Terraform on AWS』では、Terraformを使ってAWS上にシステムを構築するノウハウを紹介します。ECS Fargateなどのマネージドサービスを中心にアーキテクチャ設計を行い、Terraformで実装します。

推しポイント

  1. Terraform 0.12で登場する「HCL2」に早くも対応
    • HCL2対応の書籍はたぶん世界初?
    • 正式版が出ていないため「0.12.0-beta1」で動作確認
    • HCL1で書いていたサンプルコードをすべてHCL2に書き換えました1
  2. 100以上の豊富なサンプルコード
    • コードはすべてGitHubでも公開予定
    • GitHubには「0.11.13」で動作確認したHCL1系のコードもあわせて公開予定
  3. 多様なサービスを網羅
    • ECS Fargate、CodePipeline、Session Manager、Kinesis Data Firehose、ALB、RDSなどなど
    • これらのサービスをすべてTerraformで実装
  4. Terraformの設計に関する知見を凝縮
    • コードの構造化やベストプラクティス、モジュール設計などなど
    • 意外と形式知化されていない気がするので、結構貴重かも?

委託先情報

本書は委託本となります。なんと2つのサークルさんが引き受けてくださいました。本当にありがたいです。

yagitch.comさんでは、エンジニア向けにアウトプットを継続していくためのテクニックまとめ本『継続的にアウトプットする技術』と、モデリングの学習方法と社内勉強会の進め方ノウハウ本『もくもくモデリングの森を旅するチビドラゴンの軌跡』が頒布されます。バラエティ豊かなラインナップで、濃いブースになりそうです。

techbookfest.org

楽描帳さんでは、GitHub・CircleCI・Docker・AWSを利用してCIからコンテナのデプロイまで実現する本『コンテナ時代の個人Webサービスの作り方(仮題)』が頒布されます。インフラ構築にはTerraformを使うということなので、「Pragmatic Terraform on AWS」との親和性もバッチリです。

techbookfest.org

技術書典にお越しの際は、「か11」と「え35」にぜひお立ち寄りいただき、ついでに『Pragmatic Terraform on AWS』も手にとっていただければ嬉しいです。

目次

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

 1章 はじめに
   1.1 対象読者
   1.2 対象環境
   1.3 本書の構成
 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 変数
      3.3.2 ローカル変数
      3.3.3 出力値
      3.3.4 データソース
      3.3.5 プロバイダ
   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 システムアーキテクチャ
   4.3 テクノロジースタック
 5章 権限管理
   5.1 ポリシー
      5.1.1 ポリシードキュメント
      5.1.2 IAMポリシー
   5.2 ロール
      5.2.1 信頼ポリシー
      5.2.2 IAMロール
      5.2.3 IAMポリシーのアタッチ
   5.3 IAMロールのモジュール化
 6章 ストレージ
   6.1 プライベートバケット
      6.1.1 S3バケット
      6.1.2 ブロックパブリックアクセス
   6.2 パブリックバケット
   6.3 ログバケット
      6.3.1 ログローテーションバケット
      6.3.2 バケットポリシー
 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 ECSクラスタ
      9.2.2 タスク定義
      9.2.3 ECSサービス
   9.3 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イベントIAMロール
      10.2.3 CloudWatchイベントルール
      10.2.4 CloudWatchイベントターゲット
11章 鍵管理
   11.1 KMS(Key Management Service)
      11.1.1 カスタマーマスターキー
      11.1.2 エイリアス
12章 設定管理
   12.1 コンテナの設定管理
   12.2 SSMパラメータストア
      12.2.1 AWS CLIによる操作
      12.2.2 Terraformによるコード化
      12.2.3 SSMパラメータストアと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.1.5 マスターパスワードの変更
   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.2.3 Dockerイメージのプッシュ
   14.3 継続的インテグレーション
      14.3.1 CodeBuildサービスロール
      14.3.2 CodeBuildプロジェクト
      14.3.3 ビルド仕様
   14.4 継続的デリバリー
      14.4.1 CodePipelineサービスロール
      14.4.2 アーティファクトストア
      14.4.3 GitHubトークン
      14.4.4 CodePipeline
      14.4.5 CodePipeline Webhook
      14.4.6 GitHubプロバイダ
      14.4.7 GitHub Webhook
15章 SSHレスオペレーション
   15.1 オペレーションサーバの設計
   15.2 Session Manager
      15.2.1 インスタンスプロファイル
      15.2.2 EC2インスタンス
      15.2.3 オペレーションログ
   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 ログ永続化S3バケット
      16.3.2 Kinesis Data Firehose IAMロール
      16.3.3 Kinesis Data Firehose配信ストリーム
      16.3.4 CloudWatch Logs IAMロール
      16.3.5 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 APIの削除保護機能を活用する
   19.4 暗黙的な依存関係を把握する
   19.5 暗黙的に作られるリソースに注意する
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 GitHub
      20.3.2 Terraform Module Registry
      20.3.3 バージョンアップ
      20.3.4 公開モジュールの利用
21章 落ち穂拾い
   21.1 高速化
   21.2 デバッグログ
   21.3 構成ドリフト
   21.4 公式ドキュメントを読むコツ
   21.5 Terraform管理外のリソース
   21.6 Terraformのアップグレード
22章 巨人の肩の上に乗る
あとがき

電子書籍は?

多少はニーズがあるようなので、対応しようかと考えています。ただ、まだ紙版の入稿も終わっておらず、そっちが一段落してから手を付けるので、今のところ進捗はゼロです。なんとか出せるよう、がんばります。

おわりに

必ずあなたを満足させます!とまでは言えませんが、フツーの書店やAmazonでは手に入らない書籍にはなっているので、ぜひ遊びにきてください。いろんな人にレビューしてもらったので、そこそこのクオリティにはなってると思います。よろしくおねがいします!

参考:技術書典について


  1. 控えめに言って、メチャクチャ大変でした。コードの変換部分ではなく、本文の修正がw