
- ライター:柏 澤聞
- 金融、公共系のネットワーク設計、構築を経験した後、ネットワンシステムズに入社。
現在は自動化推進の一環としてトレーニング環境の整備や知財の蓄積に取り組んでいる。
はじめに
前回はAnsibleが動く環境をAWS上に作ります【前編】で簡単にどのような自動化ツールで作るか説明しました。
今回は実際に環境を作るにあたりどのようなコードが必要なのかをご紹介します。
作りたい環境
作りたい環境は下図のようにSecurity groupが分かれたAnsibleのコントローラとなるControle Nodeを1つ、操作対象のTarget Nodeを3つの計4つのEC2インスタンスを作成します。
① AWS上に仮想ネットワーク(VPC:Virtual Private Cloud)を作成します
② VPCの中でさらにインターネットと通信ができない内部ネットワーク(Private Subnet)を作成します
③ ネットワークの安全性を確保するため、Security groupを作成してアクセス制御をします
④ 作成したSecurity group内に仮想コンピュータ(EC2:Elastic Compute Cloud)を作成します
仮想ネットワークの作成
まず、Virtual Private Cloud(以降VPC)と呼ばれるプライベート仮想ネットワーク空間をAWS上に作成します。
前回の記事で説明した通り、Terraformは構成をコードで宣言することで、構築手順のような順番を意識することなく、
必要な構成情報を記述するだけで、その状態にすることができます。
しかし、VPCを作成すると単に言っても、VPCを構成する様々な設定がありますが、今回はどのような設定が必要でしょうか。
- プライベート仮想ネットワーク空間の範囲
- インターネットゲートウェイ
- 経路情報
プライベート仮想ネットワーク空間の範囲はネットワーク内でどのようなアドレス帯を利用するかの設定です。
また、インターネットと通信するためにゲートウェイや経路情報を作成する必要があります。
下記例では、
1.まずネットワーク空間で利用するアドレス帯を指定して、VPCを作成します。

2.次にVPCとインターネット間で通信ができるようにゲートウェイを作成します。

3.最後にVPC内からインターネットへの経路情報を作成します。
上記サンプルでは「gateway_id」というオプションを利用して宛先をインターネットゲートウェイとしていますが、
他のオプションを利用することでより細かい経路情報を設定することができます。
プライベートサブネットの作成
プライベートサブネットはVPCで割り当てたアドレス空間をより細かく分けることができますが、今回の作りたい環境では、
コントロールノードとターゲットノードは同じネットワーク内にあるため、プライベートサブネットも1つのみ作成します。
なお、異なるサブネットとした場合は前項の3.にてより細かい経路情報を作成することで相互に通信することができます。
下記例ではサブネットを作成し、経路情報を関連付けます。

セキュリティグループの作成
オンプレミスのネットワークでは攻撃や不正アクセスなどを防御するために、インターネットとの間にファイヤーウォールを設置する設計が一般的と考えられます。パブリッククラウドでは仮想ファイヤーウォールを作成することも可能ですが、
AWSではセキュリティグループを利用して関連付けられたリソースのトラフィックを制御することができます。
下記例ではコントロールノードで必要最低限のポート、サービスを許可するセキュリティグループを作成し、VPCに関連付けます。
ターゲットノードについても名称やポート番号、アドレス帯などを適切な値に変更して、
続けて記述することで2つのセキュリティグループを作成することができます。
仮想コンピュータの作成
前項までにネットワーク関連のリソースが作成され、いよいよEC2インスタンスと呼ばれる仮想コンピュータの作成になります。
仮想コンピュータはAWSマーケットプレイスやコミュニティなど多くのイメージがあり、これらのイメージを利用して仮想コンピュータを構成することができます。また、自身で作成したイメージをアップロードして利用することもできます。
下記例では特定のAIM(イメージのID)を指定して仮想コンピュータを構成します。
ここまでで仮想コンピュータは作成されますが、これだけではAnsibleは動きません。
Ansibleが動作する環境を整えるためにはさらに作成した仮想コンピュータ内の設定が必要になります。
下記例では「provisioner」オプションを利用して、作成した仮想コンピュータにSSHでログインし、Ansibleをインストールします。
「inline」の部分で複数行記述することも可能ですが、行数が多ければ多いほど管理や修正が煩雑となるため、「provisioner "file"」を利用して、スクリプトを仮想コンピュータに転送し、「inline」にてスクリプトを起動するコマンドのみ記述することでより細かい設定や自由度が高まると考えられます。
実は・・・
実は上記以外に準備が必要です。
- 変数を定義するファイル
- AWSにアクセスするための設定ファイル
- そもそもTerraformを実行する環境
今回は触れてませんが、Terraformの動作環境、AnsibleのinventoryのようなAWSのアクセスキーやAWSのリージョンなど事前準備が必要となります。動作環境はもちろん事前準備が必要ですが、AWSのアクセスキーやリージョンなどAWSに関する基本的な設定に関しても、Terraformで定義することができます。
「provider.tf」というファイルを作成し、以下例のように記述することで、Terraformを実行すると自動的に読み込まれます。
変数ファイルにつきましても「variables.tf」というファイルを作成し、以下例のように定義したい変数を続けて記述することで、
参照させることができます。

最後に
今回はTerraformでどのようにコードを書くかを紹介しました。
作成したい環境を順番通りに書きましたが、Ansibleが動く環境をAWS上に作ります【前編】で紹介したように、必要な設定をコードとして書く必要はありますが、順序を意識する必要はありません。事前にAWSのアクセス情報を設定する必要がある、サブネットを作成する前にVPCを作成する必要があるというようにAWSのリソースの関連性や知識が相当量必要ですが、VPC作成やサブネット作成、変数などのコードが同一ディレクトリに配置することで、Terraformの実行時に拡張子が「.tf」のファイルをすべて読み込みます。
改めてAnsibleとの違いを考えた際、ある環境を構築するのに順序は重要ではありますが、最終的な状態はなにかを記述することでその状態にするTerraformはパブリッククラウド含め、環境を構築(デプロイ)することに適していると考えられます。
AnsibleでできなかったことやTerraformで物足りないところ、それぞれに利点や欠点はありますが、1つのツールにこだわらずに複数のツールを組み合わせることでより自動化の幅も広がるのではないでしょうか。
※本記事の内容は執筆者個人の見解であり、所属する組織の見解を代表するものではありません。