terraform cloudで初めるAWS その1: 設定編

Share on:

これはシリーズ化する予定なので続きは←リンクからどうぞ。

ちなみに最低限AWSでEC2を起動してSSHした事程度は事ある人向けの記事です

AWSって適当にEC2なんかを起動すると特に難しい事を考えなくてよいように「デフォルトの設定」でドバドバっとネットワークが構築されて特に深い知識があまりなくてもいきなり使えるようになってたりします。これはこれで便利がよいので使ったらいいと思うんですが、実際の製品レベルでの運用だとちょっとキツいのかなという気がします。

で、いろいろ設定をカマしていくんですが、webフォームでポチポチやるといろいろきついんすよね。設定漏れとかも出がちですし。というわけでIaCの出番となります。

terraformという選択肢

IaCっていう言葉を聞いた事あるかないかわからんけど(相変わらずこういう言葉作るの好きだよなあ…)、terraformというツールで、(比較的)簡単にIaCできます。これに関して解説していく記事です。

ただ、terraformはローカルにコマンドを入れて*.tfというファイルを作成するのがベーシックな使い方なんですが、複数人で構築しに行くときにはVCSプロバイダ+terraform cloudというwebのツールを使う事が結構あります。なので今回はそれを使ってみようぜって事です。

ちなみに、最初の敷居は「そこそこ高い」です。乗り切っちゃえばかなり楽になれると思いますんで、このページに書いてある事はちょっと頑張ってください。

いろいろアカウントを開設

もってなければですが

terraform cloud: https://app.terraform.io/

あと、VCSプロバイダを用意します。ここではgitlabを利用

https://gitlab.com

もちろん、awsも用意します。従って3つのアカウントをマネージメントしていく必要があります。

terraform cloudでorganizationを作ってVCSプロバイダと連携させる

見出しからしてイカれてますが、まずterraform cloudにログインできたら、organizationを作ります。これはログインするとすぐわかると思います。適当な名前を与えます。

その次にChoose your workflowとか出てくるので

Version control workflowを選択します。Most commonだそうです。

使えるのは

  • GitHub
  • GitLab
  • Bitbucket
  • Azure DevOpts

だそうですが、ここでは先述した通りGitLabを選択。バージョンはgitlab.comを選択します

すると

On GitLab, register a new OAuth Application. Enter the following information:

など言われると思います。これはgitlab側からterraform cloudへ通信を許可する奴で、twitterの「連携アプリ」とかと同じ概念ですが、

  • Name
  • Redirect URI

の2つ入力する所があります。これはterraform cloud側に表示されている通りに入力します。

さらに

Scopes: Only the following should be checked: api

とあるように「api」の項目のみチェックをします。そしたら「Save application」します

The application was created successfully. と出たら、今度はgitlab側に

  • Application ID
  • Secret

の2つが表示されているので、これをコピってterraformのApplication IDSecretに貼ります。Nameはそのままでいいです。Connectなんとかっていうボタンを押すとgitlabに飛ばされるのでログインして承認(Authorize)します。これでVCSプロバイダと接続は完了。

Set up SSH keypairはskipでよいです。

terraform cloudでworkspaceを作成する

の前にgitlabでプロジェクトを作っておく

私はgitlabなのでそうします。terraformのファイルを格納しておく場所となります。

とりあえず空のプロジェクトを作成し、プロジェクトというかリポジトリができたらcloneしておきます。README.mdは作っても作らなくてもokです

改めてworkspaceを作る

workspaceの作成を押していくと、 ここでもまたVersion control workflowの選択があります。

これを選択するとconnect済みのVCSプロバイダが表示されるはずです。

ここで先程作成したプロジェクトが見えてくるので、これを選択します。

Advanced optionsでTerraform Working Directoryterraformと入力します

続いて Automatic Run TriggeringOnly trigger runs when files in specified paths changeにしておくのがよいでしょう。まあこの辺はファイルというかツリーの構成にもよるけど今回はブランクプロジェクトという事でこのようにしました。

Configure variables

続いてこれをしろという事になると思います。

ここで必要なのは今度はAWS側の設定です、えらいこっちゃ。。。

「マイセキュリティ資格情報」からユーザを作りましょう。

  • ユーザ名: terraform
  • AWSアクセスの種類: プログラムによるアクセスのみ

とします。

アクセス許可は既存のポリシーを直接アタッチしてAdministratorAccessを選んでおくのが楽っちゃ楽ですね

タグはなくてもいいです。

するとこんな具合にアクセスキーIDとシークレットアクセスキーが出てくるのでメモります。これをterraform cloudのvariablesに入れていきます。

variablesには2つセクションがありますが入れるべきはEnvironment Variables(環境変数)です。

これは名前が決まっていて、以下のように設定します

ドキュメント的にはこちら https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-envvars.html

  • AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
  • AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  • AWS_DEFAULT_REGION=ap-northeast-1

とかなんですが、AWS_SECRET_ACCESS_KEYはsensitiveにしときましょう

これで準備が整いました。

VPCを作ってみる

VPCとかいきなり言われても…っていう所は次回から対応していきますが、とりあえずVPCっていうのはネットワークの範囲の事です。

手元にcloneしてきたワーキングディレクトリにterraform/というディレクトリを作成しterraform/network.tfというのを作ってみましょう

network.tf

1resource "aws_vpc" "vpc" {
2  cidr_block = "192.168.0.0/16"
3}

続いて、terraformがAWSを使うという事を明示するための設定とかがあります。これはterraform/settings.tfをとかにします。

ファイルは最終的に統合されて評価されるため、ファイル名は基本何でもいいです、わかりやすいやつで。

settings.tf

1provider "aws" {
2}

こうなってるはずです

1terraform
2terraform/network.tf
3terraform/settings.tf

これでcommitし、pushします

terraform cloud上でQueue Planする

すると

みたいになるはずです。失敗してなければしばらくすると「Confirm & Apply」というボタンが出るので押します。commentは空でいいです。

最終的に↑みたいになればokです。

確認してみる

AWS側にVPCが出来たのか出来てないのか、確認してみましょう

AWSマネジメントコンソールからVPCを選択します。うまくいけば

のようなVPCが出来ていると思います。

しかし、名前が入ってなく判別がし辛いと思いますので、これを修正してみます。

tfを修正してタグを付ける

VPCの名前をworkspaceの名前と同じにしたいとします。これはちょっと特殊な設定が必要で、以下のようなのをsettings.tfに書いておきます。

まあ、どこからかパクってきたやつなんすけどね…

 1provider "aws" {
 2}
 3
 4variable "TFC_WORKSPACE_NAME" {
 5  type    = string
 6  default = ""
 7}
 8
 9locals {
10  # If your backend is not Terraform Cloud, the value is ${terraform.workspace}
11  # otherwise the value retrieved is that of the TFC_WORKSPACE_NAME with trimprefix
12  workspace = var.TFC_WORKSPACE_NAME != "" ? trimprefix(var.TFC_WORKSPACE_NAME, "ecs-") :
13terraform.workspace
14}

ここでnetwork.tf編集しtagsを与えます

1resource "aws_vpc" "vpc" {
2  cidr_block = "192.168.0.0/16"
3  tags = {
4    Name = local.workspace
5  }
6}

これでcommit & pushします。

適用

最初は自分でトリガーひっぱってきましたけど、2回目からは terraform/ 以下のコミットは自動で検知してきてterraform cloudがtfファイルの検証を行います。

runsに入るとNEEDS CONFIRMATIONとなっているはずで、

このようにワークスペースの名前が入ってるのがわかります(ここではvm2-replaceという名前になってるのがそれ)

Confirm & Applyします。

正常に終わったら以下のようにVPCに名前が出てくるようになったと思います。

今回はここまで

今回の記事で以下の事が身に付いたと思います(見についてるといいなあ)

  • terraform cloud + VCSプロバイダ(gitlab) + awsの連携
  • とりあえずgitlabにcommitしたらterraform cloudが何かトリガーするようになった
  • VPCが作成できた
  • 作成したVPCを修正した

こんなもんですかね。次回はこれを用いてネットワークを構築していきます。