Terraform CloudでAWSリソースをデプロイしてみる

2022.10.03

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

「Terraform Cloudの雰囲気を掴みたい」

Terraform CloudはStateファイルの管理やTerraformのCI/CDを楽にできる便利なツールです。

この記事では、そんなTerraform Cloudの雰囲気を掴む助けになると幸いです。

やってみた

Terraform Cloudのアカウント作成

以下サイトで、Terraform Cloudのアカウントを作成します。

https://app.terraform.io/signup/account

本記事の内容は、5名まで無料のFreeプランで実行可能です。

サンプルコード

以下のコードが入っているGithubリポジトリとワークスペースを紐付けます。

任意の名前でGithubリポジトリを作成して、以下のコードをpushします。

この後の手順で、Terraform Cloudのワークスペースと作成したリポジトリを紐づけます。

AWSのus-east-1リージョンにVPCを作成するという内容です。

main.tf

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
  cloud {
    organization = "<オーガニゼーション名>"
    hostname = "app.terraform.io"

    workspaces {
      name = "state-sample-remote"
    }
  }
}

# Configure the AWS Provider
provider "aws" {
  region = "us-east-1"
}

# Create a VPC
resource "aws_vpc" "example" {
  cidr_block = "10.0.0.0/16"
}

注目してもらいたいのは、cloudブロックの部分です。

The cloud block only affects Terraform CLI's behavior. When Terraform Cloud uses a configuration that contains a cloud block - for example, when a workspace is configured to use a VCS provider directly - it ignores the block and behaves according to its own workspace settings.

クラウド ブロックは、Terraform CLI の動作にのみ影響します。 Terraform Cloud がクラウド ブロックを含む構成を使用する場合 (たとえば、ワークスペースが VCS プロバイダーを直接使用するように構成されている場合)、ブロックを無視し、独自のワークスペース設定に従って動作します。

引用元: Terraform Cloud Settings - Terraform CLI | Terraform by HashiCorp

この部分は、ローカルでTerraform CLIを使用する場合に影響します。 Terraform Cloud上でapplyやplan(remote実行)を行うために必須の項目ではありません。

実際にこの部分を記載せずに、Terraform Cloud上で実行してみましたが正常にRunを行えました。

個人的にはTerraform CLIを使用しない場合でも、記載しておいた方が良いと思います 理由としては、他の人がコードを見たときにTerraform Cloudを使用していることがわかるためです。

ワークスペースの作成

Terraform Cloud側の作業です。

ワークスペースを作成します。

AWS認証情報の設定

ワークスペースを作成したら、変数を設定します。 AWS上にリソースをデプロイするために、IAMユーザーのアクセスキーとシークレットアクセスキーが必要です。

今回は個人検証用のOrganizationを使っているため、Organization全体で使用できるように設定しています。 ワークスペース個別に設定したり、Organizationで設定して特定のワークスペースで利用できるようにもできます。

Create a Credentials Variable Set | Terraform - HashiCorp Learn

ちなみに、Terraform CloudがAWSリソースにアクセスするために、IAMロールを使用することも可能です。(2023/1/31のアップデート)

補足

Terraform Cloud上でplan,applyを実行しない場合は(実行モード local、Stateファイルの管理等のみを行う)、AWS認証情報の設定をTerraform Cloud上に保存する作業は不要です。

本記事の内容はTerraform Cloud上でplan,applyを実行する実行モード remoteを使用しています。

Terraformの実行

「サイドバーのRuns」 > 「Actions」 > 「Start new Run」で手動実行できます。

リポジトリへのpushやPull Requestをトリガーに実行することもできます。

デフォルトでは、Planまで実行されて「Confirm & Apply」のボタンを押すことでApplyを実行することができます。 (承認不要で自動Applyする設定も可能です)

Stateファイル

「States」からStateファイルを確認できます。

(補足)ローカルでTerraform CLIを実行したい場合

Terraform Cloud APIトークンの作成

ローカルからTerraform Cloudを使用するために、APIトークンを作成します。

以下コマンドでトークンが作成されます。

terraform login
# プロンプトに従って必要事項入力

トークンはローカルの「~/.terraform.d/credentials.tfrc.json」に保存されます。

$ cat ~/.terraform.d/credentials.tfrc.json 
{
  "credentials": {
    "app.terraform.io": {
      "token": "<トークン>"
    }
  }
}

Log in to Terraform Cloud from the CLI | Terraform - HashiCorp Learn

トークンが作成できたら、通常通りTerraform CLIを実行できます。

terraform init
terraform plan
terraform apply

おわりに

Terraform CloudでAWSリソースをデプロイする方法でした。

興味が湧いた方は、公式のチュートリアルをやってみると面白いと思います。

今回の記事では基本的な機能を紹介しましたが、より実践的な内容を見てみたい方は以下の記事がおすすめです。

他にもTerraform Cloudの便利な機能をブログで紹介しています。良かったら、読んでもらえると嬉しいです。

Terraform Cloud の記事一覧 | DevelopersIO

以上、AWS事業本部の佐藤(@chari7311)でした。

参考

5人まで無料! Terraform Cloudを使ってみた | DevelopersIO