エンジニア選書シリーズ[詳解]AWS Infrastructure as Code
――使って比べるTerraformAWS CDK

[表紙][詳解]AWS Infrastructure as Code――使って比べるTerraform&AWS CDK

紙版発売

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 まとめ

著者プロフィール

原旅人(はらたびと)

ソフトウェアエンジニア・クラウドエンジニア。1975年生まれ。松本市出身。スーパーコンピュータを使って天気予報をするためのソフトウェア(数値予報モデル)の開発に14年間従事し,その精度向上に貢献。

その後,Webアプリケーションや高速検索用データベースの開発を手掛ける中でAWSの可能性に惹かれ,クラウド技術を活用した効率的なアプリケーション開発・運用に強い関心を持って注力し,開発期間の短縮や運用コストの削減を実現。

著書に『コンセプトから理解するRust』(技術評論社)。