「Pragmatic Terraform on AWS」あらため『実践Terraform』を商業出版します #技術書典 #Terraform

概要

実践Terraform』は、Terraform初級者から中級者向けの解説書です。 技術書典6とBOOTHで累計1,500部以上を販売した「Pragmatic Terraform on AWS」という同人誌をベースにしています。

もともと140ページの同人誌でしたが、商業誌化にあたり100ページ近く追記しています。 特に後半は大半が書き下ろしで、「中長期の運用」や「変更しやすいシステムにするための設計」に関する知見をたくさん詰め込みました。

構成

実践Terraform』では、Terraformを使ってAWS上にシステムを構築するノウハウを紹介します。 200以上のサンプルコードを用意したので、手を動かしながら一緒に学びましょう。

第1章から第3章が「入門編」で、Terraformの基礎知識を一気に習得します。 第4章から第16章が「実践編」で、最初にシステム全体のアーキテクチャ設計を行い、AWSの各種リソースをTerraformで実装します。 そして第17章から第28章が「運用・設計編」で、コードの構造化・リファクタリング・モジュール設計・既存リソースのインポート・チーム開発など、本番運用に欠かせない考え方を学びます。

目次

 1章 セットアップ
   1.1 AWS
      1.1.1 IAMユーザー
      1.1.2 AWS CLI
      1.1.3 クレデンシャル
   1.2 Terraform
      1.2.1 Homebrew
      1.2.2 tfenv
      1.2.3 Dockernized Terraform
   1.3 git-secrets
 2章 基本操作
   2.1 リソースの作成
      2.1.1 HCL(HashiCorp Configuration Language)
      2.1.2 terraform init
      2.1.3 terraform plan
      2.1.4 terraform apply
   2.2 リソースの更新
      2.2.1 リソースの設定変更
      2.2.2 リソースの再作成
   2.3 tfstateファイル
   2.4 リソースの削除
 3章 基本構文
   3.1 変数
   3.2 ローカル変数
   3.3 出力値
   3.4 データソース
   3.5 プロバイダ
   3.6 参照
   3.7 組み込み関数
   3.8 モジュール
      3.8.1 モジュールの定義
      3.8.2 モジュールの利用
 4章 全体設計
   4.1 システム要件
   4.2 アーキテクチャ設計
   4.3 テクノロジースタック
   4.4 ファイルレイアウト
 5章 権限管理
   5.1 ポリシー
      5.1.1 ポリシードキュメント
      5.1.2 IAMポリシー
   5.2 ロール
      5.2.1 信頼ポリシー
      5.2.2 IAMロール
      5.2.3 IAMポリシーのアタッチ
      5.2.4 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.2.3 HTTPアクセス
   8.3 Route 53
      8.3.1 ドメインの登録
      8.3.2 ホストゾーン
      8.3.3 DNSレコード
      8.3.4 独自ドメインへのアクセス
   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.5.3 HTTPSアクセス
   8.6 リクエストフォワーディング
      8.6.1 ターゲットグループ
      8.6.2 リスナールール
 9章 コンテナオーケストレーション
   9.1 ECSの構成要素
   9.2 ECSの起動タイプ
      9.2.1 EC2起動タイプ
      9.2.2 Fargate起動タイプ
   9.3 Webサーバーの構築
      9.3.1 ECSクラスタ
      9.3.2 タスク定義
      9.3.3 ECSサービス
      9.3.4 コンテナの動作確認
   9.4 Fargateにおけるロギング
      9.4.1 CloudWatch Logs
      9.4.2 ECSタスク実行IAMロール
      9.4.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イベントターゲット
      10.2.5 バッチの動作確認
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.1.1 運用
      15.1.2 セキュリティ
      15.1.3 トレーサビリティ
   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 ログ永続化バケット
      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章 Terraformベストプラクティス
   17.1 Terraformバージョンを固定する
   17.2 プロバイダバージョンを固定する
   17.3 削除操作を抑止する
   17.4 コードフォーマットをかける
   17.5 バリデーションをかける
   17.6 オートコンプリートを有効にする
   17.7 プラグインキャッシュを有効にする
   17.8 TFLintで不正なコードを検出する
      17.8.1 TFLintのインストール
      17.8.2 TFLintの使い方
      17.8.3 Deep Checking
18章 AWSベストプラクティス
   18.1 ネットワーク系デフォルトリソースの使用を避ける
   18.2 データストア系デフォルトリソースの使用を避ける
   18.3 APIの削除保護機能を活用する
   18.4 暗黙的な依存関係を把握する
   18.5 暗黙的に作られるリソースに注意する
19章 高度な構文
   19.1 三項演算子
   19.2 複数リソース作成
   19.3 リソース作成制御
   19.4 主要なデータソース
      19.4.1 AWSアカウントID
      19.4.2 リージョン
      19.4.3 アベイラビリティゾーン
      19.4.4 サービスアカウント
   19.5 主要な組み込み関数
      19.5.1 Numeric Functions
      19.5.2 String Functions
      19.5.3 Collection Functions
      19.5.4 Filesystem Functions
      19.5.5 その他の組み込み関数
   19.6 ランダム文字列
   19.7 Multipleプロバイダ
      19.7.1 リソースのマルチリージョン定義
      19.7.2 モジュールのマルチリージョン定義
   19.8 Dynamic blocks
      19.8.1 シンプルなDynamic blocks
      19.8.2 複雑なDynamic blocks
      19.8.3 Dynamic blocksの注意点
20章 tfstateファイルの管理
   20.1 ステートバケット
      20.1.1 ステートバケットの作成
      20.1.2 ステートバケットの利用
   20.2 Terraform Cloud
      20.2.1 アカウント登録
      20.2.2 Organizationの作成
      20.2.3 トークンの設定
      20.2.4 Terraform Cloudの利用
      20.2.5 ロックと変更履歴
21章 構造化
   21.1 モノリス
   21.2 モジュールの分離
      21.2.1 別ディレクトリへの分離
      21.2.2 別リポジトリへの分離
   21.3 独立した環境
      21.3.1 ディレクトリ分割
      21.3.2 Workspaces
   21.4 コンポーネント分割
      21.4.1 安定度
      21.4.2 ステートフル
      21.4.3 影響範囲
      21.4.4 組織のライフサイクル
      21.4.5 関心事の分離
   21.5 依存関係の制御
22章 モジュール設計
   22.1 モジュールの設計原則
      22.1.1 Small is beautiful
      22.1.2 疎結合
      22.1.3 高凝集
      22.1.4 認知的負荷
   22.2 優れたモジュールの構成要素
      22.2.1 Standard Module Structure
      22.2.2 ドキュメンテーション
      22.2.3 バージョニング
      22.2.4 バージョン制約
   22.3 公開モジュール
      22.3.1 GitHub
      22.3.2 Terraform Module Registry
      22.3.3 バージョンアップ
      22.3.4 公開モジュールの利用
23章 リソース参照パターン
   23.1 リテラル
      23.1.1 参照対象のリソースの定義
      23.1.2 リテラルによる参照
   23.2 リモートステート
      23.2.1 バックエンドの定義
      23.2.2 リモートステートによる参照
   23.3 SSMパラメータストア連携
      23.3.1 SSMパラメータストアの定義
      23.3.2 SSMパラメータストアによる参照
   23.4 データソースと依存関係の分離
      23.4.1 参照対象のリソースへタグを追加
      23.4.2 データソースによる参照
   23.5 Data-only Modules
      23.5.1 Data-only Modulesの定義
      23.5.2 Data-only Modulesによる参照
24章 リファクタリング
   24.1 tfstateファイルのバックアップ
   24.2 ステートの参照
      24.2.1 terraform state list
      24.2.2 terraform state show
      24.2.3 terraform state pull
   24.3 ステートの上書き
      24.3.1 tfstateファイルの書き換え
      24.3.2 terraform state push
   24.4 ステートからリソースを削除
      24.4.1 terraform state rm
      24.4.2 リソースの存在確認
   24.5 リネーム
      24.5.1 terraform state mvによるリソースのリネーム
      24.5.2 terraform state mvによるモジュールのリネーム
   24.6 tfstateファイル間の移動
      24.6.1 リソースをローカルへ移動
      24.6.2 移動先のtfstateファイルをローカルへコピー
      24.6.3 tfstateファイル間のリソース移動
      24.6.4 移動先のtfstateファイルを上書き
      24.6.5 コードの修正
25章 既存リソースのインポート
   25.1 terraform import
      25.1.1 単一リソースのインポート
      25.1.2 関連リソースのインポート
   25.2 terraformer
      25.2.1 terraformerのインストール
      25.2.2 指定したリソースのインポート
      25.2.3 すべてのリソースのインポート
      25.2.4 関連するリソースのインポート
26章 チーム開発
   26.1 ソースコード管理
   26.2 ブランチ戦略
   26.3 レビュー
      26.3.1 アーキテクチャレビュー
      26.3.2 コードレビュー
      26.3.3 実行計画レビュー
      26.3.4 プルリクエストテンプレート
   26.4 Apply戦略
      26.4.1 手動Apply
      26.4.2 自動Apply
   26.5 コンテキストの理解
      26.5.1 ビジネス目標
      26.5.2 ステークホルダー
      26.5.3 アプリケーション
      26.5.4 システムアーキテクチャ
27章 継続的Apply
   27.1 ワークフロー
   27.2 apply実行環境
      27.2.1 CodeBuildサービスロールの作成
      27.2.2 GitHubトークンの保存
      27.2.3 CodeBuildプロジェクトの作成
      27.2.4 CodeBuild Webhookの作成
   27.3 ビルドリポジトリ
      27.3.1 buildspec.yml
      27.3.2 buildスクリプト
      27.3.3 planスクリプト
      27.3.4 applyスクリプト
   27.4 tfnotify
      27.4.1 installスクリプト
      27.4.2 tfnotifyの設定
      27.4.3 tfnotifyの組み込み
      27.4.4 GitHubへの通知
   27.5 Branch protection rules
28章 落ち穂拾い
   28.1 高速化
   28.2 デバッグログ
   28.3 JSONコメント
   28.4 Terraformのアップグレード
   28.5 AWSプロバイダのアップグレード
   28.6 周辺ツールの探し方
   28.7 公式ドキュメントを読むコツ
   28.8 構成ドリフト
   28.9 未知の未知
 付録A 巨人の肩の上に乗る
   A.1 Terraform
   A.2 AWS
   A.3 インフラストラクチャ
   A.4 システムアーキテクチャ
   A.5 ソフトウェア設計

Pragmatic Terraform on AWSの書評

「Pragmatic Terraform on AWS」の書評を集めてみました。 未読の方は、『実践Terraform』の購入判断の参考にしてください。

qiita.com

dev.classmethod.jp

asmsuechan.hatenablog.com

jedipunkz.github.io

masutaka.net

sadayoshi-tada.hatenablog.com

mnuma.goat.me

Twitterでの反応も軽くまとめてあります。

nekopunch.hatenablog.com

なお、ここに書ききれないぐらい、たくさんの人にフィードバックいただきました。 「Pragmatic Terraform on AWS」を読んでくださった皆さん、本当にありがとうございました。

あとがき

同人誌の執筆後に発表されたAWSの新機能に追従したり、CircleCIによる校正環境を構築して読みやすくしたりと、ほぼすべてのページに手を入れました。 なかなかいい仕上がりになったと思うので、ぜひご期待ください。

価格とか発売日とか、細かい諸々は近日中に公開します。お楽しみに!