【メモ】実践Terraform　AWSにおけるシステム設計とベストプラクティス


## メモです

<a href="https://nextpublishing.jp/book/10983.html" target="_blank" rel="noopener noreferrer">実践Terraform　AWSにおけるシステム設計とベストプラクティス | 電子書籍とプリントオンデマンド（POD） | NextPublishing（ネクストパブリッシング）</a>



## 第１章　セットアップ

- AWS
    - IAMユーザー
    - AWS CLI
    - クレデンシャル
- Terraform
    - Homebrew
    - tfenv
    - Docernized Terraform
- git-secrets



## 第２章　基本操作



- リソースの作成
    - HCL
    - terraform init
    - terraform plan
    - terraform apply
- リソースの更新
    - リソースの設定変更
    - リソースに再作成
- tfstateファイル
- リソースの削除
    - terraform destroy



## 第３章　基本構文



- 変数
    - valiable
- ローカル変数
    - locals
- 出力値
    - output
- データソース
- プロバイダ
- 参照
- 組み込み関数
- モジュール
    - モジュールの定義
    - モジュールの利用



## 第４章　全体設計

- システム要件
- アーキテクチャ設計
- テクノロジースタック
- ファイルレイアウト



## 第５章　権限管理



- ポリシー
    - ポリシードキュメント
    - IAM ポリシー
- ロール
    - 信頼ポリシー
    - IAM ロール
    - IAM ポリシーのアタッチ
    - IAM ロールのモジュール化



## 第６章　ストレージ



- プライベートバケット
    - S3 バケット
    - ブロックパブリックアクセス
- パブリックバケット
- ログバケット
    - ログローテーションバケット
    - バケットポリシー



## 第７章　ネットワーク



- パブリックネットワーク
    - VPC
    - パブリックサブネット
    - インターネットゲートウェイ
    - ルートテーブル
- プライベートネットワーク
    - プライベートサブネット
    - NATゲートウェイ
    - 暗黒的な依存関係
- マルチAZ
    - パブリックネットワークのマルチAZ化
    - プライベートネットワークのマルチAZ化
- ファイアウォール
    - セキュリティグループ
    - セキュリティグループのモジュール化



## 第８章　ロードバランサーとDNS



- ALBの構成要素
- HTTP用ロードバランサー 
    - アプリケーションロードバランサー 
    - リスナー
    - HTTPアクセス
- Route 53
    - ドメインの登録
    - ホストゾーン
    - DNSレコード
    - 独自
- ACM（AWS Certificate Manager）
    - SSL証明書の作成
    - SSL証明書の検証
- HTTPS用ロードバランサー
    - HTTPSリスナー
    - HTTPのリダイレクト
    - HTTPSアクセス 
- リクエストフォワーディング
    - ターゲットグループ 
    - リスナールール



## 第９章　コンテナオーケストレーション

- ECSの構成要素
    - ECSクラスタ
    - タスク
    - ECSサービス
- ECSの起動タイプ
    - EC2起動タイプ
    - Fargate起動タイプ
- WEbサーバーの構築
    - ECSクラスタ
    - タスク定義
    - ECSサービス
    - コンテナの動作確認
- Fargateにおけるロギング
    - CloudWatch Logs
    - ECSタスク実行IAMロール
    - Dockerコンテナのロギング



## 第10章　バッチ

- バッチ設計
    - バッチ設計の基本原則
        - じょぶ管理
        - エラーハンドリング
        - リトライ
        - 依存関係制御
    - ジョブ管理
- ECS Scheduled Tasks
    - バッチ用タスク定義
    - CloudWatch イベントIAMロール
    - CloudWatchイベントルール
    - CloudWatchイベントターゲット



## 第11章　鍵管理

- KMS（Key Management Service）
    - カスタマーマスターキー
    - エイリアス

## 第12章　設定管理

- コンテナの設定管理
- SSMパラメータストア
    - AWS CLIによる操作
    - Terraformによるコード化
    - SSMパラメータストアとECSの統合





## 第13章　データストア



- RDS（Relational Database Service）

    - DBパラメータグループ
    - DBオプショングループ
    - DBサブネットグループ
    - DBインスタンス
    - マスターパスワードの変更

- ElastiCache

    - ElastiCache パラメータグループ
    - ElastiCache サブネットグループ
        - ElastiCache レプリケーショングループ

    

## 第14章　デプロイメントパイプライン



- デプロイメントパイプラインの設計
- コンテナレジストリ
    - ECRレポジトリ
    - ECRライフサイクルポリシー
    - Dockerイメージのプッシュ
- 継続的インテグレーション
    - CodeBuildサービスロール
    - CodeBuildプロジェクト
    - ビルド仕様
- 継続的デリバリー
    - CodePipelineサービスロール
    - アーティファクトストア
    - GitHubトークン



## 第15章　SSHレスオペレーション

- オペレーションサーバーの設計
    - 運用
    - セキュリティ
    - トレーサビリティ
- Session Manager
    - インスタンスプロファイル
    - EC2インスタンス
    - オペレーションログ
- ローカル環境
    - Session Manager Plugin
    - シェルアクセス



## 第16章　ロギング

- ロギングの種類
    - S3へのロギング
    - CloudWatch Logsheへのロギング
- ログ検索
    - Athena
    - CloudWatch Logs Insights
- ログ永続化
    - ログ永続かバケット
    - Kinesis Data Firehose IAM ロール
    - Kinesis Data Firehose配信ストリーム
    - CloudWatch Logs IAMロール
    - CloudWatch Logs サブスクリプションフィルタ

## 第17章　Terraform ベストプラクティス

- Terraformバージョンを固定する
- プロバイダバージョンを固定する
- 削除操作を抑止する
- コードフォーマットをかける
    - terraform fmt
- バリデーションをかける
    - terraform validate
- オートコンプリートを有効にする
- プラグインキャッシュを有効にする
    - .terraformrc
- TFLintで不正なコードを検出する





## 第18章　AWSベストプラクティス

- ネットワーク系デフォルトリソースの使用を避ける
- データストア系デフォルトリソースの使用を避ける
- APIの削除保護機能を活用する
- 暗黙的な依存関係を把握する
- 暗黙的に作られるリソースに注意する



## 第19章　高度な構文

- 三項演算子
- 複数リソース作成
    - count
- リソース作成制御
- 主要なデータソース
    - AWS アカウンtのID
    - リージョン
    - アベイラビリティゾーン
    - サービスアカウント
- 主要な組み込み関数
    - Numeric Functions
    - String Functions
    - Collection Functions
    - Filesystem Functions
- ランダム文字列
- Multiple プロバイダ
    - リソースのマルチリージョン定義
    - モジュールのマルチリージョン定義
- Dynamic blocks
    - シンプルなDynamic blocks
    - 複雑なDynamic blocks
    - Dynamic blocksの注意点



## 第20章　tfstateファイルの管理

- ステートバケット
    - ステートバケットの作成
    - ステートバケットの利用
- Terraform Cloud
    - アカウント登録
    - Organizationの作成



## 第21章　構造化

- モノリス
- モジュールの分離
    - 別ディレクトリへの分離
    - 別リポジトリへの分離
- 独立した環境
    - ディレクトリ分割
    - Workspaces
- コンポーネント分離
    - 安定度
    - ステートフル
    - 影響範囲
    - 組織のライフサイクル
    - 関心ごとの分離
- 依存関係の制御



## 第22章　モジュールの設計

- モジュールの設計原則
    - Small is beautiful
    - 疎結合
    - 高凝集
    - 認知的負荷
- 優れたモジュールの構成要素
    - Standard Module Structure
    - ドキュメンテーション
    - バージョニング
    - バージョン制約
- 公開モジュール
    - GitHub
    - Terraform Module Registry
    - バージョンアップ
    - 公開モジュールの利用

## 第23章　リソース参照パターン

- リテラル
    - 参照対象のリソースの定義
    - リテラルによる参照
- リモートステート
    - バックエンドの定義
    - リモートステートによる参照
- SSMパラメータストア連携
    - SSMパラメータストアの定義
    - SSMパラメータストアによる参照
- データソースと依存関係の分離
    - 参照対象リソースへタグを追加
    - データソースによる参照
- Data-only Modules
    - Data-only Modules の定義
    - Data-only Modules による参照

## 第24章　リファクタリング

- testateファイルのバックアップ
- ステートの参照
    - terraform state list
    - terraform state show
    - terraform state pull
- ステートの上書き
    - tfstateファイルの書き換え
    - terraform state push
- ステートからリソースを削除
    - terraform state rm
    - リソースの存在確認
- リネーム
    - terraform state mv によるリソースのリネーム
    - terraform state mv によるモジュールのリネーム
- tfstateファイル間の移動
    - リソースをローカルへ移動
    - 移動先のtfstate ファイルをローカルへコピー
    - tfstateファイル間のリソース移動
    - 移動先のtfstateファイルを上書き
    - コードの修正

## 第25章　既存リソースのインポート

- terraform import
    - 単一リソースのインポート
    - 関連リソースのインポート
- terraformer
    - terraformerのインストール
    - 指定したリソースのインポート
    - 全てのリソースのインポート

## 第26章　チーム開発

- ソースコード管理
    - tfstateファイルはバージョン管理システムで管理してはいけない
- ブランチ戦略
    - どのブランチでapplyするか
- レビュー
    - アーキテクチャレビュー
    - コードレビュー
        - パラメータの設定を省略して良いか
    - 実行計画レビュー
    - プルリクエストテンプレート
- Apply戦略
    - 手動Apply
    - 自動Apply
- コンテキストの理解
    - ビジネス目標
    - ステークホルダー
    - アプリケーション
    - システムアーキテクチャ

## 第27章　継続的Apply

- ワークフロー
- apply実行環境
    - CodeBuildサービスロールの作成
    - Githubトークンの保存
    - CodeBuildプロジェクトの作成
    - CodeBuild Webhookの作成
- ビルドリポジトリ
    - builds-spec.yml
    - buildスクリプト
    - planスクリプト
    - applyスクリプト
- tfnotify
    - installスクリプト
    - tfnotifyの設定
    - tfnotifyの組み込み
- Branch protection rules
    - 

## 第28章　落ち穂拾い

- 高速化
    - -parallelismオプション
- デバッグログ
    - 環境変数TF_LOG
- JSONコメント
    - jsonencode関数とyamldecode関数の組み合わせ
- Terraformのアップグレード
- AWSプロバイダのアップグレード
- 周辺ツールの探し方
    - awesome-terraform
- 公式ドキュメントを読むコツ
- 構成ドリフト
- 未知の未知
    - ドキュメント化