
本講座で学習する内容についてどのような内容なのか、どのような順に進めていくのかについて確認します。
本講座は「AWSで作るWebアプリケーション実践講座」で作成したWebアプリケーションを「コード」で作成するにはどうしたらよいか、を学ぶ講座です。
その内容上、「AWSで作るWebアプリケーション実践講座」を受講されている方は事前に作成済みのリソースを削除いただいておかないとうまく講座を進めることができない可能性がありますので、事前にリソースが削除できているかご確認をお願いいたします。
添付リソースを一括ダウンロードできる「Googleドライブ」のリンクがあります。
クラウドを使ったWebサービス開発が当たり前になりつつある現在、これまでのやり方ではその変化に対応しきれない部分がでてきました。
本レクチャーではこれまでのやり方で課題になってきた運用まわりについて、どのような対応が考えられるのか、について学習します。
HashiCorp社はVagrantを開発した会社でTerraformやPackerといったクラウド環境のIaCを実現するツールを開発しています。
Terraformとは「コード化された構築設定に従って自動で任意のクラウド環境に対してデプロイをしてくれる」ツールです。
マルチクラウド対応が特徴でベンダーロックインされない点にメリットがあります。
Terraformを使った大まかな開発の流れは「アカウント作成→Terraformを使った環境構築→足りない部分の手動作成」です。
AWS CLI はAmazonのサイトからツールをダウンロードしてインストールします。
macOS、Windowsそれぞれダウンロード先は異なりますが、どちらもインストーラーに従ってインストールを行うことでインストールが可能です。
初期設定については次のレクチャーで行います。
通常利用のAWSアカウントとは別にTerraformが利用するAWSアカウントを作成します。
Terraform用アカウント作成後には AWS CLI に対して初期設定(プロファイルの登録)を行います。
GitBashは「Git」+「Bash」になり、Windows環境でBashが利用可能になるツールです。
Windows環境を利用されている場合、Terraformが動作保証している環境が GitBash になります。
Terraformはまだまだバージョンアップが頻繁に行われているツールです。
単純にインストールするとバージョンアップ時に手間が発生するため tfenv と呼ばれるバージョン管理ツールを利用して Terraform をインストールします。
git-secrets のインストール方法を確認し、簡単な使い方を学習します。
AWS CLI を使ってAWSへアクセスするために必要なキー(アクセスキーとシークレットキー)は流出するとなりすまされてアカウントを利用される事態が発生します。
本レクチャーで紹介している git-secrets は誤ってキー(アクセスキーとシークレットキー)をGitへコミットすることを防いでくれるツールです。
Visual Studio Code に 「HashiCorp Terraform」プラグインをインストールします。
「HashiCorp Terraform」をインストールすることで、HCL2利用時に「シンタックスハイライト」と「インテリセンス」が利用可能になります。
Visual Studio Code のデフォルトターミナルが「GitBash」になるよう設定を修正します。
Windows環境ではGitBashのみが動作保証対象となるため、本レクチャーの内容に従って設定を修正することがオススメです。
macOSの方は特に対応しなくても問題ありません。
「デフォルトVPCにEC2を起動」します。
本レクチャーを通して「コードの書き方」や「TerraformのCLIコマンドの使い方」など大まかな開発の流れを学習します。
Terraformを利用してクラウド環境構築を行うと環境構築したログ情報として tfstate ファイルが生成されます。
tfstateファイル中には構築した際に得られる詳細な情報(インスタンスIDなど)が保存されていることを確認します。
Terraformのソースコードを修正し、terraform apply コマンドを実行することで、コード定義された内容に従ってEC2の状態が変更されます。
本レクチャーではEC2が再作成されないパターンとして「タグ」の追加を行ってみます。
Terraformのソースコードを修正し、terraform apply コマンドを実行することで、コード定義された内容に従ってEC2の状態が変更されます。
本レクチャーではEC2が再作成されるパターンとして「ユーザーデータ」の登録を行ってみます。
Terraformで管理されたリソースは terraform destroy で一括削除することができます。
以下のコマンドについて学習します。
terraform plan
terraform apply
terraform destroy
Terraformで扱うソースコードは「HCL2」と呼ばれるHashiCorp社の独自言語です。
その特徴は以下のようなものがあります。
JSONに似ている
簡単なプログラムが組める
コメントが書ける
":"(コロン)ではな"="(イコール)でキーバリューをつなぐ
ヒアドキュメントが使える
「ブロック」と呼ばれる塊で定義していく
Terraformで使える「変数」には多く2種類が存在します。
「ローカル変数(locals)」はプロジェクト内でしか利用できない変数、
「変数(variables)」は実行時に値を指定して外から変更することが可能な変数です。
Terraformで扱えるデータ型について学習します。
プリミティブ
object
tuple
list
set
「変数(variables)」を terraform 実行時に値を指定する方法は3種類あります。
環境変数
変数ファイル(terraform.tfvars)
コマンド引数
基本的には「変数ファイル」を使った方法を利用しますが、一時的に修正したい場合は「コマンド引数」を利用します。
Terraformがマルチクラウド対応できる仕組みとして「プロバイダー」と呼ばれる仕組みがあります。
Terraformは本体のバージョン変更が頻繁に行われるうえ、プロバイダーのバージョンも変更となるとうまく動作保証させるためにはバージョン指定する必要があります。
terraformブロックには上記の対応のため「Terraform自体のバージョン」「プロバイダーのバージョン」が指定できます。
providerブロックには「クレデンシャル情報」と「デフォルトリージョン」を指定します。
dataブロックを利用すると「Terraform管理外のリソース」を取り込むことができます。
管理外のリソースとしては「AWSが作成したリソース」や「既存システムのリソース」「外だしの設定」などがあります。
outputブロックを利用するとTerraform管理のリソース情報を取り出すことができます。
Terraformで作成するリソースにおいてリソース間で情報を参照する方法について学習します。
Terraformには標準で提供される「組み込み関数」があります。
この「組み込み関数」の動作確認を行うには terraform console を利用すると簡単に確認できます。
Terraformのコードはその特性上肥大化しやすいものです。
「同じディレクトリ内に拡張子「.tf」ファイルを配置しておけばよい」というルールだけであるため、必要に応じてファイルは分割します。
公式ドキュメントは少したどりづらい場所に情報があるため、本レクチャーの中でよく見る情報へどのようにアクセスしていくかを学習します。
具体的には以下のようなドキュメントの参照先を確認していきます。
HCL2
CLI
provider
ここまでに学習した内容を踏まえて「ひな型」となるコードを準備します。
作成するファイルは以下の3ファイルです。
main.tf
terraform.tfvars
.gitignore
本講座で作成するWebアプリケーションは「BtoC向け飲食口コミサイト」です。
「AWSで作るWebアプリケーション実践講座」で作成したものと同じシステムを構築していきます。
システム構成はよくある構成として「Web+AP+DB」の3層構造に加え、「キャッシュサーバー」を追加した構成です。
Terraformを使ってVPCを作成する方法を学習します。
Terraformを使ってサブネットを作成する方法を学習します。
Terraformを使ってルートテーブルを作成する方法を学習します。
Terraformを使ってインターネットゲートウェイを作成する方法を学習します。
Terraformを使ってセキュリティグループを作成する際に必要となるリソースについて学習します。
実際にTerraformを使ってセキュリティグループを作成します。
S3へ向けたセキュリティグループのルールを作成したい場合「プレフィックスリスト」と呼ばれるリソースを利用します。
プレフィックスリストは複数のCIDRを束ねたリソースになり、S3向けのものはあらかじめ定義されています。
プレフィックスリストを利用してS3向けにアクセスできるようにするセキュリティグループを作成します。
Terraformを使ってパラメータグループを作成する方法を学習します。
定義可能な属性を学習し、実際にMySQL向けのパラメータグループを作成します。
Terraformを使ってオプショングループを作成する方法を学習します。
オプショングループとして定義可能な属性を学習し、実際にMySQL向けのオプショングループを作成します。
Terraformを使ってサブネットグループを作成する方法を学習します。
RDSのサブネットグループとして定義可能な属性を学習し、実際にサブネットグループを作成します。
RDSのパスワードにランダム文字列を利用するためには hashicorp/random を利用します。
この hashicorp/random に含まれるランダム文字列の生成方法を学習し、ランダム文字列生成するdataブロックを作成します。
Terraformを使ってRDS(MySQL)を構築する際、コード上に定義可能な属性を学習します。
以下のようなブロックに分けて定義できる属性を見ていきます。
基本設定
ストレージ
ネットワーク
DB設定
バックアップ
削除防止
Terraformを使ってRDS(MySQL)を構築します。
本レクチャーではシングルノードのMySQLを構築します。
Terraformを利用してRDSを作成すると tfstate にパスワードがクリアテキストで出力されます。
クリアテキストで出力されると本来閲覧出来てはいけない人にパスワードが見えてしまう危険があります。
この問題に対する対応として以下の2通りの方法が考えられます。
あとからパスワードを変更する
運用回避する
それぞれの具体的な対応方法とメリット/デメリットについて学習します。
RDS(データベース)には資産として大切なデータが保管されます。
簡単に消せては問題となるため、あらかじめ削除防止の機構が準備されています。
削除防止に関わる以下の属性についてデフォルトの値と削除時の設定方法を学習します。
deletion_protection
skip_final_snapshot
apply_immediately
起動済みのRDS(MySQL)へローカルマシン(開発環境)から直接接続することはできません。
RDS(MySQL)へ接続を行うため、踏み台となるサーバーを起動し、MySQLクライアントをインストールすることで接続できることを確認します。
前のレクチャーで準備した踏み台サーバーを利用してRDS(MySQL)へデータ投入を行います。
あらかじめAWSが準備してくれている「Amazon Linux 2」を利用してEC2を起動したいとき、できれば「最新の Amazon Linux 2 」の AMI ID を取得して設定したい、と言ったケースがあります。
動的に AMI ID を取得したい場合 data ブロック (aws_ami)を利用して外部リソースとして取り込みを行います。
動的に AMI ID を取得する方法は AWS CLI の aws ec2 describe-images と同じ検索条件となるため、describe-images のコマンドについてもあわせて学習します。
Terraformでキーペアを作成したい場合、あらかじめ手元で「公開鍵」と「秘密鍵」のペアをで生成し、「公開鍵」だけを登録します。
本レクチャーでは鍵の生成方法と登録方法を学習します。
TerraformでEC2インスタンスを作成する方法について学習します。
具体的に定義しなければならない属性、オプション属性がどのようなものかを学習します。
Terraformを使ってEC2インスタンスを作成します。
セキュリティグループ、IAMロール、キーペアなどの設定も同時に行っていきます。
クラウド開発を行っているといまだに手作業でやっていて疑問に感じることはありませんか?
そんな疑問や不安を解決する手段として、本講座では「Terraform」というツールを使って「AWSのインフラ環境構築をコード化/自動化する方法」を学びます。
まだまだ発展途上の領域ではありますが、「運用をコード化する」ということがどのようなものなのかを体験できるコースです。
ぜひ、一緒に学習をしていきましょう!
【概要】
本講座では環境構築から始まり、入門ともいえる簡易なEC2起動、本格的なシステム構築…といったステップで進めていきます。
学習できる内容には以下のようなものが含まれます。
◆Infrastructure as Code とは
IaCに関わるツール
◆Terraformの基礎(文法)
Terraformのコマンドや構文について学習します。
インフラ環境構築で必要となるタイミングでそれぞれ学習できるよう織り込んでいます。
HCL2構文
tfstateファイル
メタ引数
リソース依存関係の制御
ループと分岐
モジュール
◆AWSのインフラ構築
以下のリソースを Terraform で作成する方法を学習します。
基本的に単独のコーディングを学習するのではなく、Webアプリケーション向けのインフラ構築を総合的に行うよう組み合わせて学習を進めていきます。
VPC
セキュリティグループ
RDS(MySQL)
EC2
パラメータストア
AMI
ELB
ACM
S3
CloudFront
オートスケーリンググループ
IAM(ポリシー/グループ/ユーザー)
【謝辞】
今回も同僚の力を借りて作成することになりました。本コース作成にあたり実務上の知見や講座内容に対するフィードバックをしてくれた古澤魁さんには大変感謝しています。
【更新履歴】
v1.0.4 2021/07/23 「外部から変数を与える」レクチャーを追加
v1.0.3 2021/06/06 「添付リソースの一括ダウンロード」レクチャーを追加
v1.0.2 2012/03/31 SGの説明を修正
v1.0.1 2021/03/12 振り返りレクチャー追加
v1.0.0 2021/03/02 初版リリース