これは何?
IaCを学ぼうの第2回、Terraformを使ってAWSのVPCリソースを作成するために必要なコードを書いてみる記事です。
Terraformのコードの書き方
まず言語としては HCL(Hashicorp Configuration Language) を利用します。
Terraformを利用する場合は当然HCLの書き方やお作法を覚える必要があります。
複雑に書こうと思えばいくらでも書けますが、今回は基本ということで必要最低限のコードのみ書いてAWSのVPCを構築してみたいと思います。
書かないといけないもの
provider
Terraformは第1回でtenvを使ってインストールした本体の他に、Providerと呼ばれるAWS等のインフラ上のリソース(VPCとか)を制御するものがあります。
Providerは本体には含まれておらず、プラグイン形式で後からダウンロードして機能拡張できるように提供されています。
Terraformでコードを書いていく場合は、まずは利用するProviderに必要な設定値を記述しておく必要があり
AWSを利用したいのであればそれ用のProviderをインストールする必要があると覚えておくと良いと思います。
resource
AWSにはVPC以外にも様々なサービスがありますし、サービスごとに設定値が無数に存在しますよね。
どのサービスをどの設定で構築したいか?を記述するのがresourceと呼ばれるものです。
どうやって書くの?はこの記事でこれからまとめていきます。
コードの書き方
provider
今回はVPCを作成したいので、AWS用のProviderの設定を記述しておきます。
リソースを作成したいリージョンの指定ですね。
他にもアクセスキーやシークレットキー等のAWSのAPIを実行するための認証情報も書けますが
書いてしまうと外部に出せなくなってしまうので、認証情報は基本別の方法で渡すようにしましょう。(後述します)
provider "aws" {
region = ap-northeast-1
}
resource
resourceの基本的な書式は以下です。
resource "リソース種別" "リソース名" {
//ここにリソース作成時に必要なパラメータを書いていく
}
VPCを作成する場合は、aws_vpc を利用します。
リソース種別はTerraformのお作法としてドキュメントにまとめられているのでデタラメに書いてもダメです。
作りたいサービスごとにTerraformではどのリソース種別を使えばいいかを覚えておくと良いかと思います。
resourceには任意の名前をつけることができます。(今回はvpcという名前をつけています)
Terraformのコード上で他のリソースの値を動的に参照する場合(例えばサブネットを作る場合にVPCのID値が必要等)に利用するので、自由に命名できますが他のresourceと被るのはNGです。
resource "aws_vpc" "vpc" {
//ここにリソース作成時に必要なパラメータを書いていく
}
必要なパラメータにはこれがなければリソースが作れないという必須項目と、なくてもいいが必要であれば記述する任意項目の2つがあります。
必須項目としてVPCのIPアドレス帯(cidr_block)と任意項目として名前タグを設定する場合以下のようになります。
resource "aws_vpc" "vpc" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "test-vpc"
}
}
詳細なパラメータ情報はマニュアルに記載されているのでそちらをご参照ください。
マネジメントコンソールから設定できるこの部分はTerraformではどんなパラメータだっけ?という形で
コンソールとコードを比較して眺めてみると良いかもしれません。
コマンドを実行してリソース(VPC)を作成する
コードのフォーマット
書いたHCLのフォーマット(インデントを揃えたり)ができます。
$ terraform fmt
プラグインのインストール
冒頭で以下のように記載したと思います。
Terraformでコードを書いていく場合は、まずは利用するProviderに必要な設定値を記述しておく必要があり
AWSを利用したいのであればそれ用のProviderをインストールする必要があると覚えておくと良いと思います。
これを行うのがinitというサブコマンドです。(厳密には他にもいろいろ処理してますが)
初めてコードを書いたときは必ず実行する必要があります。
※ 実行しないで先に進むとエラーになります。
$ terraform init
ドライラン
いきなりコード内容をAWS上に反映するのは怖いですよね。
planというサブコマンドを使うと実行計画を反映前に確認することができます。
(どのリソースが作られるとか設定変更されるとか削除されるとかが分かる)
$ terraform plan
反映
コードで記述した設定を反映します。
applyというサブコマンドを使えばできますがその前に少し事前準備を。
AWS用のProviderは内部処理でAWSのAPIを実行します。
認証情報を環境変数にセットしておきましょう。
export AWS_ACCESS_KEY_ID=アクセスキー
export AWS_SECRET_ACCESS_KEY=シークレットキー
その後にapplyを実行しましょう。
$ terraform apply
お分かりの通り、アクセスキーとシークレットキーは秘匿情報ですが
この方法だとAWSでIAMユーザーを作成してキーを発行してローカルに持ってくる必要があります。
個人で勉強目的の場合はこれでもいいんですが、実際の業務ではセキュリティ的に
Terraform実行用のEC2インスタンスや別途CIサービスを使いながらIAMロールを使って認証情報を取得するやり方の方がいいと思います。
作成したリソースを削除する
最後のお片付け。Terraformで作成したリソースを削除できます。
放置していると課金されてしまうので勉強目的の場合はdestroyをお忘れなく。
$ terraform destroy
まとめ
次回は変数の使い方について記事を書いていきます。