技術書典6で『Pragmatic Terraform on AWS』という本を出します #技術書典
タイトルどおり、TerraformとAWSについて書いた本を出す予定です。いま絶賛執筆中で、ちょこちょこ変わるかもしれませんが、だいたい構成が固まってきたので目次案を公開しておきます。
4/8追記
確定版の目次や無料サンプルを公開しているので、ぜひこちらもチェックしてください。
概要
『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の記事のリンク貼っておきます。これぐらいのクオリティになると思うので、参考にしていただければ幸いです。
- AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ
- Webアプリケーションフレームワーク導入時に考慮すべき22の観点
- 大規模Webアプリケーションにおける複雑性とアーキテクチャ設計に関する一考察
本を書くなどはじめてで、全力で書いてたら150ページ超えてしまいました。同人誌だし、書きたいだけ書くかみたいな気持ちなので、あんまりページ数は減りそうにありません。
だんだんとりとめがなくなってきたので、このあたりで。何卒よろしくおねがいします。
2/20追記
委託をお願いしている@yagitchさんの配置場所が「か11」に決まりました。ぜひともお立ち寄りください!
Q.「か11」ってどのあたり?
— yagitch(やぎっち) (@yagitch) 2019年2月20日
A.会場のど真ん中、いわゆる島中です。 pic.twitter.com/SePThovDCa