こんにちは。入社して2年目のエンジニアの石川です。Terraform実践編1の続きとなるこの記事では
モジュール化の方法や、Amazon EC2でJenkinsを動かす方法について紹介します。
モジュール化
初心者が急にモジュール化を始める際、どこから手をつければ良いのか悩むことがあるかもしれません。
行いたい処理全てを1つのmain.tfにまとめる(前回まで)
変数化する
outputを定義する
moduleを作成する
変数を利用する新しいmain.tfを作成する
なぜ最初に行いたい処理全てを1つのmain.tfにまとめるのかと思うかもしれませんが、
これは処理自体に誤りがないことをモジュール化前に確認するためです。
こうすることで問題の原因を分けることができ、Terraformに慣れていない人でも
上手くいかない場合の原因調査が行えます。
変数化する
変数にできるものを変数化していきます。場合によってどんな物を変数化するかが
変わります。
具体的には以下のものが変数化されます。
リソースに必要な設定値
一部リソースを作成するかどうかのフラグ(private_subnetsを作成するかどうかのフラグ)逆に変数化する必要がないものもあります。
仕様で絶対に決まっている設定(enable_flow_logは必ずtrueにしなければならない...などと仕様で決まっている場合)
AWSの予約語または予約の設定
以下は変数化の例です。変数化前がこのような形だとします。
そして変数ファイルとなるvariables.tfはこのような形になります。 variables.tfは変数の宣言が主な役割です。
変数の説明や型、デフォルトの値を指定することができます。(例:下のコードのname)
変数にどのような値を代入するのかを指定するのは.auto.tfvarsに記述します。
$ terraform plan などのコマンドを実行する際に-var-fileのオプションで利用する.tfvars
ファイルを指定しない場合、.auto.tfvarsが自動で選ばれます。
変数化を終えたら、$ terraform validate、$ terraform plan を実行しここまでの修正に
文法的な間違いがないことを確認します。
outputを定義する
outputファイルには、「他のmoduleで利用するがmodule作成後にしか分からない値」
などが記述されます。
作成したvpcのidやサブネットなどがこれに当てはまります。
moduleを作成する 次にモジュール化するファイル構造を用意します。
ここまでの作業を終えているとmain.tf、.auto.tfvars、variables.tf、output.tfが作成されています。
modulesフォルダを用意し、その中にモジュール用のフォルダを用意します。それぞれのモジュールフォルダ下に処理を書くファイル(今回の場合はmain.tfのみ)や変数ファイル(variables.tf)、出力ファイル(output.tf)を作成します。
用意し終えるとこのようなファイル構造になります。(どの単位でモジュールを作成するか任意です)
それぞれのファイルを用意したら、main.tfに書かれている該当部分をそれぞれの モジュールフォルダ下のmain.tfにコピペしていきます。
モジュールフォルダのmain.tfに合わせてvariables.tfやoutput.tfもコピペします。
変数を利用する新しいmain.tfを作成する
それぞれのモジュールに移動させることができたため、次に正常に動作するように
修正を行います。
修正後は以下のようになります。
まず、移動元となったmain.tf(モジュールファイル下にないもの)を修正します。
例えばvpcの場合、main.tfに書くことは「vpcの作成はモジュールファイル下の
vpcモジュールで 行うようにする」ということです。
今回は「vpcの作成はモジュールファイル下のvpcモジュールで行うようにする」
ということを 記すためのmain.tfのモジュール名をcall_vpcとしています。
そのため、sourceにモジュールファイル下のvpcモジュールを指定します。
次にvpcモジュールでvpcを作成するために必要なnameやcidrの値などを渡します。
var.nameという値は.tfvarsファイルのnameを指しています。
つまりここでは、.tfvarsファイルのnameという変数の値をvpcモジュールのnameという
変数に渡しています。
call_sgという「sgの作成はモジュールファイル下のsgモジュールで行うようにする」ことが
記されているモジュールでも同じようなことを行います。
vpcの時と異なるのは、vpc_idにmodule.call_vpc.idが渡されているという事です。
モジュールファイル下のvpcモジュールではoutput.tfにidという変数名でvpcのidを出力する
ということが書かれています。
(ここまでの作業をこの記事と同じように進めている場合)
これによって、module.call_vpc.idはモジュールファイル下のvpcモジュールで作成した
vpcのidと同じものを指すことになります。
動きは以下のファイルのようになります。
ここまでで得た感覚をもとに残りの修正をしていく形になります。
また適宜エラーを修正します。
シェルスクリプト
Amazon EC2を作りそこでJenkinsを動かす準備をしていきます。
Amazon EC2につけるセキュリティグループのingress_with_source_security_group_idのポートを8080番に修正する。
albのtarget_groupを変更する。
backend_portを8080番に変更する。
targetsのportを8080番にする。
以下のようなhealth_checkを追加する。
これで準備は完了です。
シェルスクリプトを修正した場合、反映させるためには一度 $ terraform destroy を実行する
必要があるため注意してください。
あとは $ terraform apply を実行してAmazon EC2を作成し、
設定したurlの8080番ポートに
アクセスすればJenkinsの最初の設定画面が開きます。
まとめ
以上がTerraformの実践編2になります。
今回のモジュール化は私なりのアプローチであるため、参考程度にしていただければと
思います。
Terraformの学習はおなか一杯なので、次に自分が書く記事はこれまでとは違った内容
になる予定です。お楽しみに!