Terraformで再現:実践編2(AWSでJenkinsを動かす)

こんにちは。入社して2年目のエンジニアの石川です。Terraform実践編1の続きとなるこの記事では

モジュール化の方法や、Amazon EC2でJenkinsを動かす方法について紹介します。

←前回の記事(実践編1)はこちら





モジュール化

初心者が急にモジュール化を始める際、どこから手をつければ良いのか悩むことがあるかもしれません。

今回は現役のDevOpsエンジニアの方からアドバイスを参考に自分なりにたどり着いた
モジュール化の手順をご紹介します。
以下の2番以降がモジュール化となります。

 

  1. 行いたい処理全てを1つのmain.tfにまとめる(前回まで)

  2. 変数化する

  3. outputを定義する

  4. moduleを作成する

  5. 変数を利用する新しいmain.tfを作成する


  なぜ最初に行いたい処理全てを1つのmain.tfにまとめるのかと思うかもしれませんが、

  これは処理自体に誤りがないことをモジュール化前に確認するためです。

  こうすることで問題の原因を分けることができ、Terraformに慣れていない人でも

  上手くいかない場合の原因調査が行えます。



変数化する


変数にできるものを変数化していきます。場合によってどんな物を変数化するかが

変わります。


具体的には以下のものが変数化されます。

  1. リソースに必要な設定値

  2. 一部リソースを作成するかどうかのフラグ(private_subnetsを作成するかどうかのフラグ)逆に変数化する必要がないものもあります。

  1. 仕様で絶対に決まっている設定(enable_flow_logは必ずtrueにしなければならない...などと仕様で決まっている場合)

  2. 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を動かす準備をしていきます。


  1. Amazon EC2につけるセキュリティグループのingress_with_source_security_group_idのポートを8080番に修正する。

  2. albのtarget_groupを変更する。


  1. backend_portを8080番に変更する。

  2. targetsのportを8080番にする。

  3. 以下のようなhealth_checkを追加する。



3. ec2モジュールのnginx.shを以下のように修正する。


これで準備は完了です。

シェルスクリプトを修正した場合、反映させるためには一度 $ terraform destroy を実行する

必要があるため注意してください。

あとは $ terraform apply を実行してAmazon EC2を作成し、

設定したurlの8080番ポートに

アクセスすればJenkinsの最初の設定画面が開きます。

まとめ

以上がTerraformの実践編2になります。

今回のモジュール化は私なりのアプローチであるため、参考程度にしていただければと

思います。

Terraformの学習はおなか一杯なので、次に自分が書く記事はこれまでとは違った内容

になる予定です。お楽しみに!