Terraformで再現:実践編2(AWSでJenkinsを動かす)
こんにちは。入社して2年目のエンジニアの石川です。Terraform実践編1の続きとなるこの記事ではモジュール化の方法や、Amazon EC2でJenkinsを動かす方法について紹介します。
←前回の記事(実践編1)はこちら
モジュール化
自分はTerraformに全く慣れておらず「モジュール化初めて」という状態であったため、どこから手をつければ良いのか悩んでしまいました。
今回は自分なりにたどり着いたモジュール化の手順をご紹介します。
- 行いたい処理全てを1つのmain.tfにまとめる(前回まで)
- 変数化する
- outputを定義する
- moduleを作成する
- 変数を利用する新しいmain.tfを作成する
処理自体に誤りがないことをモジュール化前に確認するために、最初に行いたい処理すべてを1つのmain.tfに纏めています。
このようにすることで問題の原因を分けることができ、上手くいかない場合の原因調査がよりスムーズになります。
変数化する
変数にできるものを変数化していきます。場合によってどんな物を変数化するかが変わります。
具体的には以下のものが変数化されます。
- リソースに必要な設定値
- 一部リソースを作成するかどうかのフラグ(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やサブネットなどがこれに当てはまります。
以下がoutputs.tfの例です。
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を追加する