エンジニア選書シリーズ[詳解]AWS Infrastructure as Code
――使って比べるTerraform&AWS CDK
――使って比べる
2025年2月12日紙版発売
原旅人 著
B5変形判/464ページ
定価3,740円(本体3,400円+税10%)
ISBN 978-4-297-14724-2
書籍の概要
この本の概要
本書は,Amazon Web Services(AWS)のリソースを対象とした,コードによるインフラ管理――Infrastructure as Code(IaC)をテーマにした実践的な解説書です。IaCツールの中でも,幅広いシステムに対応できる「Terraform」と,抽象的なリソース記述が可能な「AWS CDK」を取り上げます。それぞれのツールの基本的な使い方や仕組みを解説するとともに,VPCやECSの構築といった具体例を通じてこれら2つのツールを横断的に比較・理解します。両ツールの「宣言的なコード記述」という共通点や,コード記述法や差分抽出プロセスの違いを掘り下げながら,AWSにおけるIaCの汎用的なスキルを習得できる内容となっています。IaCをこれから始めるユーザーに加え,Terraformユーザー,AWS CDKユーザーのどちらにも,新たな視点とスキルを提供します。
こんな方におすすめ
- すでにTerraform,AWS CDKを利用している人
- AWSにおいてIaCをこれから始める人
目次
第1章 クラウドとInfrastructure as Code
- 1.1 クラウドとその利点
- 1.2 AWSサービスとリソース
- 1.2.1 リソースの属性
- 1.2.2 アクションによるリソースの操作や参照
- 1.3 Infrastructure as Code(IaC)
- 1.3.1 Web画面からリソースを構築するときの問題点
- 1.3.2 IaCとそのコンセプト
- 1.4 AWSのIaCのためのツール
- 1.4.1 Terraform
- 1.4.2 AWS CloudFormation
- 1.4.3 AWS CDK
- 1.5 CloudTrailを活用したアクションの実行ログの追跡
- 1.5.1 IaCを活用するときのアクション実行ログの必要性
- 1.5.2 CloudTrail
- 1.5.3 CloudTrailのイベントの表示
- 1.5.4 CloudTrailイベントの効率的な検索方法
- 1.6 本書の構成
第2章 IaC環境の構築
- 2.1 AWS CLIのインストール
- 2.2 AWS IAM Identity Centerとその設定
- 2.2.1 IaCの利用で必要となる管理者権限を持つユーザーの作成
- 2.2.2 IAM Identity Centerのアクセスポータル
- 2.2.3 IAM Identity Centerの構成要素
- 2.2.4 IAM Identity Centerの設定手順
- 2.2.5 IAM Identity Centerが使えない場合
- 2.3 Terraformのインストール
- 2.3.1 tenvのインストール
- 2.3.2 tenvによるTerraformのインストール
- 2.4 CDKのインストールとブートストラップ
- 2.4.1 CDKのインストール
- 2.4.2 ブートストラップの実行
- 2.5 開発環境・ツール
- 2.5.1 エディタ
- 2.5.2 その他のツール
- 2.6 まとめ
第3章 [体験]IaCによるリソースのデプロイ
- 3.1 題材
- 3.2 AWSマネジメントコンソールによるリソースのデプロイ
- 3.3 Terraformによるリソースのデプロイ
- 3.3.1 Terraformのコンフィグファイルを作成する
- 3.3.2 terraform initでルートモジュールを初期化する
- 3.3.3 terraform planで実行計画を確認する
- 3.3.4 terraform applyでリソースをデプロイする
- 3.3.5 tfstateファイル
- 3.4 CloudFormationによるリソースのデプロイ
- 3.4.1 SQSキューを記述するテンプレートを作成する
- 3.4.2 テンプレートからスタックを作成してSQSキューをデプロイする
- 3.5 CDKによるリソースのデプロイ
- 3.5.1 CDKプロジェクトを作成する
- 3.5.2 SQSキューのリソースをコードに記述する
- 3.5.3 cdk synthコマンドでCloudFormationのテンプレートを確認する
- 3.5.4 cdk deployコマンドでリソースをデプロイする
- 3.6 リソースの属性を変更する
- 3.6.1 Terraform
- 3.6.2 CloudFormation
- 3.6.3 CDK
- 3.7 IaCで構築したリソースの削除
- 3.7.1 Terraform
- 3.7.2 CloudFormation
- 3.7.3 CDK
- 3.8 まとめ
第4章 Terraform詳細解説
- 4.1 Terraformによるリソースのデプロイの基本的な流れ
- 4.2 Terraformのコンフィグファイルの記述
- 4.2.1 ブロック
- 4.2.2 引数などに使われる値の型
- 4.2.3 コメントアウト
- 4.2.4 resourceブロックとそのリファレンス
- 4.2.5 dataブロックとそのリファレンス
- 4.3 Terraformのコードの構成単位
- 4.3.1 ルートモジュールと子モジュール
- 4.4 ルートモジュールの記述
- 4.4.1 Terraformのバージョン指定と使用するプロバイダの情報の設定
- 4.4.2 プロバイダの設定
- 4.4.3 tfstateファイルの格納先(バックエンド)の設定
- 4.5 子モジュールの記述
- 4.5.1 入力パラメータの記述
- 4.5.2 子モジュールの出力の記述
- 4.5.3 子モジュールのその他の記述
- 4.6 子モジュールとその呼び出し
- 4.6.1 題材
- 4.6.2 子モジュールのファイルの記述
- 4.6.3 子モジュールを呼び出すルートモジュールの記述
- 4.6.4 子モジュールの中で複数のプロバイダ設定を使いたい場合
- 4.7 コンフィグファイルの記述に便利なその他の機能
- 4.7.1 localsブロック
- 4.7.2 繰り返し処理の記述
- 4.8 Terraformのモジュールの配置
- 4.8.1 モジュール配置が満たす要件
- 4.8.2 要件を満たすモジュール配置の1つの例
- 4.8.3 モジュール内でのファイルの構成
- 4.8.4 モジュール内の初期ファイルを作成するスクリプト
- 4.9 Terraformのコマンド
- 4.9.1 terraform init
- 4.9.2 terraform plan
- 4.9.3 terraform apply
- 4.9.4 Terraformのコマンド実行に必要な許可ポリシー
- 4.10 利用するTerraformやプロバイダのバージョン更新
- 4.10.1 利用するTerraformのバージョンの更新
- 4.10.2 プロバイダのバージョンアップ
- 4.10.3 バージョンを更新したときの動作確認
- 4.10.4 CIによるバージョンアップの自動化
- 4.11 まとめ
第5章 AWS CDK詳細解説
- 5.1 CDKによるリソースのデプロイの基本的な流れ
- 5.2 CDK最初の一歩:CDKプロジェクトの作成
- 5.3 初期のディレクトリ構成
- 5.4 Node.jsアプリとしてのCDK
- 5.5 リソースの記述とデプロイ
- 5.5.1 スタックを記述するファイルの初期状態
- 5.5.2 リソースのコンストラクタの呼び出しによるリソースの記述
- 5.5.3 スタックのコンストラクタの呼び出し
- 5.5.4 cdk synth:生成されるCloudFormationのテンプレートの確認
- 5.5.5 CloudFormationのテンプレート
- 5.5.6 cdk diff:差分の表示
- 5.5.7 cdk deploy:リソースのデプロイ
- 5.5.8 CDKコマンドの実行に必要な許可ポリシー
- 5.6 CDKのコンストラクタとツリー構造
- 5.6.1 コンストラクタツリー
- 5.6.2 コンストラクタの引数
- 5.6.3 L1コンストラクタとL2コンストラクタ
- 5.6.4 コンストラクタツリーの把握
- 5.7 スタックのコンストラクタ
- 5.7.1 複数のスタックの作成
- 5.7.2 デプロイ先のAWSアカウントIDとリージョンの指定
- 5.7.3 スタックの分割の際に考慮すること
- 5.8 複数の環境へのデプロイ
- 5.8.1 題材
- 5.8.2 環境に依存するパラメータのコードへの記述
- 5.8.3 環境とスタック
- 5.8.4 Stageコンストラクタ
- 5.9 cdk.context.json
- 5.10 タグ
- 5.10.1 タグの付与とコンストラクタツリー
- 5.10.2 スタック全体に一律にタグを付与する
- 5.10.3 複数スタックに一律にタグを付与する
- 5.11 エスケープハッチとrawオーバーライド
- 5.12 スタック間の参照
- 5.12.1 CloudFormationのテンプレートにおけるエクスポートの記述
- 5.12.2 CDKにおけるエクスポート
- 5.12.3 CfnOutputのコンストラクタを使う方法
- 5.12.4 スタックのクラスのインスタンス変数を用いる方法
- 5.12.5 スタック間の依存関係とデプロイされるスタック
- 5.12.6 エクスポート・インポートを使うときの留意点
- 5.13 CDKのスナップショットテスト
- 5.13.1 CDKのテストとスナップショットテストのメリット
- 5.13.2 スナップショットテストの作成
- 5.13.3 スナップショットテストの実行
- 5.13.4 CDKのコードのリソースの記述を変更したとき
- 5.13.5 環境やスタックが複数ある場合
- 5.14 ブートストラップの役割
- 5.14.1 ブートストラップによって作成されるスタック
- 5.14.2 ブートストラップによって作成されるIAMロール
- 5.14.3 CDKを実行するための最小の許可ポリシー
- 5.15 CloudFormationのスタックの操作に失敗したとき
- 5.15.1 スタックの削除の中でリソースの削除に失敗したとき
- 5.15.2 スタックの更新の中でリソースの削除に失敗したとき
- 5.15.3 スタックの更新に失敗してロールバックにも失敗した場合
- 5.16 まとめ
第6章 VPCのIaCによる記述
- 6.1 VPCを構成するリソース
- 6.2 構築するVPCの仕様
- 6.2.1 VPCの名前とCIDRブロック
- 6.2.2 VPCに配置するサブネット
- 6.2.3 NATゲートウェイの配置
- 6.2.4 その他
- 6.3 TerraformによるVPCの記述
- 6.3.1 Terraform Registry
- 6.3.2 Terraform Registryに公開されているドキュメントの読み方
- 6.3.3 VPCモジュールを呼び出す子モジュールの作成
- 6.3.4 ルートモジュールからの呼び出し
- 6.4 CDKによるVPCの記述
- 6.4.1 Vpcコンストラクタのデフォルト設定で構築されるリソース
- 6.4.2 スタックのコンストラクタの記述
- 6.4.3 環境に依存するパラメータの記述
- 6.4.4 スタックのコンストラクタの呼び出し
- 6.4.5 作成されるサブネットとそのカスタマイズ
- 6.5 まとめ
第7章 ECSサービスのIaCによる記述
- 7.1 構築するECSサービスの仕様
- 7.1.1 ECSとは
- 7.1.2 構築するECSサービスの仕様
- 7.1.3 ECSサービスの構築手順
- 7.2 デプロイするアプリの仕様とコード
- 7.2.1 APIサーバアプリの仕様
- 7.2.2 APIサーバアプリのコード
- 7.2.3 APIサーバアプリのコンテナイメージを作成
- 7.2.4 ローカルでのAPIサーバの挙動の確認
- 7.3 Terraformによるリソースの記述
- 7.3.1 ECRのリポジトリとSSMパラメータストアの記述
- 7.3.2 ECS関連リソースの記述
- 7.3.3 リソースのデプロイ
- 7.3.4 リソースの削除
- 7.3.5 Terraform Registryのモジュールの利用
- 7.4 CDKによるリソースの記述
- 7.4.1 ECRリポジトリとSecrets Managerの記述
- 7.4.2 ECS関連リソースの記述
- 7.4.3 リソースのデプロイ
- 7.4.4 コンストラクタツリー
- 7.4.5 リソースの削除
- 7.4.6 IAMロールやセキュリティグループのカスタマイズ
- 7.4.7 自動的に作成されるECSタスクロールへの許可アクションの追加
- 7.5 まとめ
第8章 Terraform & AWS CDK注意すべき相違点
- 8.1 手動で変更されたリソースの差分検出
- 8.1.1 SQSキューの作成
- 8.1.2 Terraformのコンフィグに記述がある属性を手動で変更
- 8.1.3 CDKのコードに記述がある属性を手動で変更
- 8.1.4 Terraformのコンフィグに記述がない属性の値を手動で変更
- 8.1.5 CDKのコードに記述がない属性の値を手動で変更
- 8.2 実行計画(差分)作成プロセス
- 8.2.1 題材
- 8.2.2 Terraformの場合
- 8.2.3 CloudFormation(CDK)の場合
- 8.3 差分表示のプロセス
- 8.3.1 Terraformにおける実行計画の確認
- 8.3.2 cdk diffによる差分の出力
- 8.3.3 変更セットでリソースの操作計画を確認する
- 8.4 既存のリソースの参照
- 8.4.1 Terraformにおける既存のリソースの参照
- 8.4.2 CDKにおける既存のリソースの参照
- 8.5 IaCの管理下からリソースを除外する
- 8.5.1 題材
- 8.5.2 リソースの一部をIaCの管理から除外:Terraform
- 8.5.3 リソースの一部をIaCの管理から除外:CDK
- 8.6 リソースの置換と処理順序
- 8.6.1 リソースの置換の発生
- 8.6.2 リソースの置換に伴うリソースの削除と新規作成の処理順序
- 8.7 まとめ
第9章 既存リソースのインポート
- 9.1 既存のリソースのインポートの必要性
- 9.2 題材
- 9.3 Terraformにおけるインポート
- 9.3.1 インポートの流れ
- 9.3.2 terraform importコマンドによるインポート
- 9.3.3 importブロックによるインポート
- 9.3.4 インポートしたリソースの複数の環境へのデプロイ
- 9.4 CDKにおけるインポート
- 9.4.1 IaCジェネレーターによる既存リソースのテンプレートの作成
- 9.4.2 cdk migrateによる既存リソースのスタックへのインポート
- 9.4.3 既存のリソースをインポートする手順のまとめ
- 9.5 CloudFormationからCDKへの移行
- 9.6 まとめ
第10章 Lambda関数のデプロイ
- 10.1 Lambda関数のデプロイ
- 10.1.1 Lambda関数とは
- 10.1.2 Lambda関数のデプロイに必要な2つのプロセス
- 10.1.3 Lambda関数のデプロイの戦略
- 10.1.4 Lambda関数をデプロイするトリガー
- 10.1.5 ZIPファイルのアセットが満たす要件
- 10.2 題材
- 10.2.1 本章で用いるLambda関数のコード
- 10.3 アセット分離戦略におけるアセット
- 10.3.1 アセットの配置
- 10.4 Terraformを用いたアセット分離戦略によるLambda関数のデプロイ
- 10.4.1 子モジュールへのリソースの記述
- 10.4.2 ルートモジュールの作成とリソースのデプロイ
- 10.4.3 Lambda関数のコードを更新したときのデプロイ
- 10.5 CDKを用いたアセット分離戦略によるLambda関数のデプロイ
- 10.5.1 CDKプロジェクトの作成とAWS SDKパッケージのインストール
- 10.5.2 AWS SDKを用いたSSMパラメータストアの値の取得
- 10.5.3 リソースのスタックへの記述
- 10.5.4 環境に依存するパラメータの記述
- 10.5.5 SSMパラメータストアの値の取得とスタックの呼び出し
- 10.5.6 Lambda関数のデプロイ
- 10.6 アセット統合戦略によるLambda関数のデプロイ
- 10.7 CDKを用いたアセット統合戦略によるLambda関数のデプロイ
- 10.7.1 codeに指定するインスタンスを作成する静的メソッドの選択
- 10.7.2 ビルドをするためのDockerfileの作成
- 10.7.3 スタックへのリソースの記述
- 10.7.4 環境に依存するパラメータの記述
- 10.7.5 スタックコンストラクタの呼び出し
- 10.7.6 CDKの合成処理を実行したときの挙動
- 10.7.7 cdk deployを実行したときのアセットの扱い
- 10.7.8 Node.jsをランライムに使うLambda関数のデプロイ
- 10.8 Terraformを用いたアセット統合戦略によるLambda関数のデプロイ
- 10.8.1 ビルドの実行とアセットの作成
- 10.8.2 子モジュールの作成と設定
- 10.8.3 リソースの記述
- 10.8.4 ルートモジュールの作成
- 10.9 まとめ
第11章 IaCにおけるLambda関数の活用
- 11.1 CloudFormation(CDK)でLambda関数を活用する仕組み
- 11.1.1 カスタムリソースの使用例
- 11.2 CloudFormationのカスタムリソースの記述方法
- 11.2.1 CloudFormationのテンプレートによるカスタムリソースの記述
- 11.2.2 CDKのコードによるカスタムリソースの記述
- 11.3 カスタムリソースの最初の実践:Lambdaに渡されるイベントの記録
- 11.3.1 カスタムリソースから起動されるLambda関数のコード
- 11.3.2 カスタムリソースを記述するCDKのコード
- 11.3.3 カスタムリソースの操作時にLambda関数に渡されるイベント
- 11.4 カスタムリソースの更新と物理ID
- 11.4.1 カスタムリソースの更新と物理IDの変化に伴う処理
- 11.4.2 カスタムリソースの作成が失敗した場合
- 11.4.3 カスタムリソースの更新が失敗した場合
- 11.5 イベントタイプによって挙動が異なるLambda関数の例
- 11.5.1 仕様
- 11.5.2 Lambda関数の実装
- 11.5.3 カスタムリソースを記述するCDKのコード
- 11.5.4 スタックの作成,更新,削除に伴うS3オブジェクトの挙動
- 11.6 カスタムリソースプロバイダの活用
- 11.6.1 カスタムリソースプロバイダの実体
- 11.6.2 カスタムリソースプロバイダを使う場合のユーザーのLambda関数
- 11.6.3 カスタムリソースプロバイダを使う場合のCDKのコード
- 11.6.4 カスタムリソースプロバイダを使う場合の制約事項
- 11.7 TerraformにおけるLambda関数の活用
- 11.7.1 lambda_invocationの使い方
- 11.7.2 Lambda関数に入力されるイベント
- 11.7.3 aws_lambda_invocationで実行するLambda関数の例
- 11.7.4 Lambda関数がエラーになったとき
- 11.8 まとめ
この本に関連する書籍
-
AWSクラウドネイティブデザインパターン
AWSをはじめとするクラウドサービス利用の広まりやコンテナ技術の進歩に伴い,「クラウドネイティブ」といえるアプリケーションの構築が容易になりつつあります。本書で...
-
AWSで実現するモダンアプリケーション入門 〜サーバーレス、コンテナ、マイクロサービスで何ができるのか
アプリケーションの設計・構築・管理を継続的に見直し,変化に迅速な対応をする開発戦略として,注目されている「モダンアプリケーション」。高い俊敏性・柔軟性のある...