「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』の購入判断の参考にしてください。
Twitterでの反応も軽くまとめてあります。
なお、ここに書ききれないぐらい、たくさんの人にフィードバックいただきました。 「Pragmatic Terraform on AWS」を読んでくださった皆さん、本当にありがとうございました。
あとがき
同人誌の執筆後に発表されたAWSの新機能に追従したり、CircleCIによる校正環境を構築して読みやすくしたりと、ほぼすべてのページに手を入れました。 なかなかいい仕上がりになったと思うので、ぜひご期待ください。
価格とか発売日とか、細かい諸々は近日中に公開します。お楽しみに!