terraform cloudで初めるAWS その1: 設定編
これはシリーズ化する予定なので続きは←リンクからどうぞ。
ちなみに最低限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を利用
もちろん、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 ID
とSecret
に貼ります。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 Directory
にterraformと入力します
続いて Automatic Run Triggering
を Only 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を修正した
こんなもんですかね。次回はこれを用いてネットワークを構築していきます。