Cloud9上にTerraformの実行環境を作ってみた

2023.01.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、soraです。

今回は、Cloud9上にTerraformの実行環境を作ってみたことについて書いていきます。

Cloud9上にCDK+Goの実行環境を作ってみたことは、先日記事しました。
Cloud9上にCDK+Goの実行環境を作ってみた

AWS Cloud9とは

AWS Cloud9は、AWS上に統合開発環境を簡単に作ることができ、ブラウザ上でコードの記述や実行ができるサービスです。

実態としては、EC2サーバを起動してその上に統合開発環境を作ってくれます。

特にローカル環境を汚したくない方やWindowsPCを使っていてローカルで開発環境を作るのを手間に感じる方は、利用すると便利なサービスだと思います。

Terraformとは

Terraformは、HashiCorp社によって開発されたIaCを実現するツールです。

CDKとは異なり、独自言語であるHCL (HashiCorp Configuration Language)を使う必要があります。
また、AWSだけでなくGDPやAzureなど他のクラウドに対しても使用可能です。

個人的には、公式のマニュアルも読みやすいことも好きなポイントの1つです。
公式のマニュアル(Docs overview | hashicorp/aws | Terraform Registry)

やってみた

それでは、実際にCloud9上にTerraformの環境を作っていきます。

Cloud9の構築

Cloud9のページから[Create environment]を押して、セットアップ画面で入力・設定変更をします。


名前を入れて、他はEC2インスタンスタイプを含めてデフォルトです。

[Create]を押して、少し待つとセットアップが完了します。
セットアップが完了したら、Cloud9 IDEの列の[OPEN]から環境に入れます。

Terraformの環境準備

Cloud9の場合、aws-cliやgitがデフォルトでインストールされています。
gitはパッケージをインストールするときに使用します。

$ aws --version
aws-cli/1.19.112 Python/2.7.18 Linux/4.14.301-224.520.amzn2.x86_64 botocore/1.20.112

$ git -v
git version 2.38.1

Terraformのバージョン管理に便利なtfenvをインストールします。
その後に、Terraformをインストールします。

#tfenvのインストール
$ git clone https://github.com/tfutils/tfenv.git ~/.tfenv

#パスを通す
$ sudo ln -s ~/.tfenv/bin/* /usr/local/bin

#tfenvのバージョン確認
$ tfenv -v
tfenv 3.0.0-18-g1ccfddb

#Terraformのインストール可能なバージョンの確認
$ tfenv list-remote
1.4.0-alpha20221207
1.4.0-alpha20221109
1.3.7
1.3.6
……
0.1.1
0.1.0

#Terraformのインストール
$ tfenv install 1.3.7

#Terraformのインストール済みのバージョンの確認
$ tfenv list

#利用するTerraformのバージョンを指定
$ tfenv use 1.3.7

#利用中のTerraformのバージョン確認
$ terraform -v
Terraform v1.3.7
on linux_amd64

テスト

せっかくなので実際にCloud9上でTerraformを使ってみます。
今回はEC2を作成してみます。

まずテスト用にフォルダを作成します。

#新しいフォルダを作成して移動します。
$ mkdir test-terraform && cd test-terraform

main.tfを作成して、処理を記載します。
今回は簡易なため1ファイルにまとめていますが、本来であればmainと各リソース作成のコードは分けた方が良いです。
Terraformで実行・管理している状態を保存する.tfstateファイルは、保存先としてローカル(ここではCloud9)ではなくS3を指定しています。(backend s3の箇所)
main.tf

terraform {
    #AWSプロバイダーのバージョン指定
    required_providers {
        aws = {
            source  = "hashicorp/aws"
            version = "~> 4.51.0"
        }
    }
    #tfstateファイルをS3に配置する(配置先のS3は事前に作成済み)
    backend s3 {
        bucket = "sora-testbucket-terraform"
        region = "ap-northeast-1"
        key    = "tf-test.tfstate"
    }
}

#AWSプロバイダーの定義
provider aws {
    region = "ap-northeast-1"
}

#EC2の作成
resource aws_instance ec2 {
    ami           = "ami-0bba69335379e17f8"
    instance_type = "t2.micro"
    tags = {
        Name = "tf-test"
    }
}

ソースコードが完成したので、実行していきます。

#ワークスペースの初期化や必要なプラグインのダウンロード
$ terraform init

#実行したときのリソースの差分を確認(実行結果は一部省略、行は詰めています)
$ terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
  + create
Terraform will perform the following actions:
  # aws_instance.ec2 will be created
  + resource "aws_instance" "ec2" {
      + ami                                  = "ami-0bba69335379e17f8"
      + instance_type                        = "t2.micro"
      + tags                                 = {
          + "Name" = "tf-test"
        }
  Plan: 1 to add, 0 to change, 0 to destroy.

#実行
$ terraform apply

コマンド実行後に、EC2が生成されていることが確認できます。(画像2行目)
CDKとは異なり、CloudFormationスタックを生成されません。

また注意点として、Terraformで構築したリソースを変更したい場合は、直接変更せずソースコードを修正して変更するようにしましょう。
tfstateで保持している状態と現状のリソースの整合性が取れなくなり、管理する上で良くないです。

クリーンアップ

最後に、Terraformで作成したEC2を削除します。

$ terraform destroy

最後に

今回は、Cloud9上にTerraformの実行環境を作って実行するまでの流れを紹介しました。

TerraformやCDKなどのIaCを実現するツールは、AWSで構築を行う際に基本的に使われるため、興味がある方はぜひ使ってみてはいかがでしょうか。