terraform

A collection of 28 posts
Generate bolt targets from Terraform state
bolt

Generate bolt targets from Terraform state

現在個人サーバーの管理を Terraform で、サーバーのプロビジョニングを Bolt で行なっています。 * terraform - ゆるふわキャンパー * bolt - ゆるふわキャンパー Bolt ではインベントリファイルを使用してターゲットとなるサーバーを指定できます。インベントリファイルは例えば以下のような内容です。 groups: - name: production targets: - web.example.com - db.example.com - app.example.com config: ssh: host-key-check: false user: centos private-key: ~/.ssh/id_rsa run-as: root ↑のようにターゲットのサーバーを指定できるのですが、ドメイン名ではなく Terraform で作成し動的に変化、増減する IP
2 min read
Cloud provisioning with Bolt
bolt

Cloud provisioning with Bolt

このブログを動かしているサーバーは Terraform で構築しています。 * Nomad クラスターを作成する とりあえずでプロビジョニングも Terraform で行なっていたのですが、いいかげん辛くなってきたので Bolt を使ったプロビジョニングに移行しました。 * Welcome to Bolt ツールとしては Ansible を今まで個人サーバーを構築する際に使っていたのですが、Bolt を今まで使ったことがなかったので選んでみました。 Bolt の概念 Bolt は Puppet Lab の開発した割と新しめのオーケストレーションツールです。Puppet との違いは対象のサーバーにエージェントソフトウェアを入れなくても使える点です。 Puppet の知識がなくても使う事ができ、やろうと思えば Puppet の機能を使用することも出来ます。 Bolt は任意のスクリプトやコマンドを複数のサーバーに実行する事ができます。 任意のスクリプトに説明などのメタデータを加えるなど再利用生を持たせたものをタスクと呼びます。 複数のタスクを 1 つ
1 min read
Split DigitalOcean project
digitalocean

Split DigitalOcean project

最近このブログを Nomad クラスター環境へ移行しました。 * Nomad クラスターを作成する * Nomad クラスター上で Ghost ブログを動作させる クラスターは DigitalOcean 上に構築しており、構築は Terraform で自動化しています。ウェブサーバーやブログなどのアプリケーションの配備や管理は Nomad に任せています。 DigitalOcean ではプロジェクトという単位でリソースをまとめることが出来ます。 * Projects :: DigitalOcean Product Documentation とりあえず Nomad クラスター関連のリソースをまとめる意図で Nomad Cluster というプロジェクトを作成し Droplet や Load Balancer などのリソースを放り込んでいました。 が、最近 G Suite の試用を始め、G Suite 用の DNS レコードの設定を DigitalOcean DNS に設定する必要が出てきました。それ以外にも Redash
1 min read
Create Nomad Cluster on DigitalOcean
nomad

Create Nomad Cluster on DigitalOcean

Nomad 上にこのブログ (Ghost) を移そうと考えています。 * Nomad by HashiCorp そこで、まずは Nomad クラスターを DigitalOcean 上に作成してみました。 この記事の一番最後にクラスター作成に使用している Terraform のファイルを貼っておきます。 Nomad とは Nomad とは Docker コンテナや Qemu 仮想マシン、 Java アプリケーション等のデプロイ、それらによる処理の実行の管理を自動的に行うツールです。 つまり、ワークロードオーケストレーターです。 * Introduction - Nomad by HashiCorp ラーメン二郎で言えばロット・マエストロやロット・マイスターが該当するかもしれません。 ※ロット・マエストロ/マイスターはラーメンが一定のペースで効率よく置かれるように、ラーメンのデプロイ (カウンターへの配置) を管理し、リソースの調整 (少食っぽい人に大を食わせない、食べるのが遅い人を急かす・手伝う) や他のマエストロ/マイスターとの協業 (広い店舗
9 min read
Manage state files on Terraform Cloud
terraform

Manage state files on Terraform Cloud

先日発表された Terraform Cloud の Remote State Management 機能、絶対いいやつなので試してみます。 * Introducing Terraform Cloud Remote State Management Terraform Cloud とは Terraform Cloud とは terraform のために作られた SaaS です。 以下のような機能が (今後公開予定の機能も含め) あります。 * state ファイル管理ストレージ * terraform を複数人で運用するためのコラボレーション機能 * terraform モジュールの共有基盤 展開としては小規模チーム向けの無料プラン、ビジネスプラン、エンタープライズプランと規模に応じた有償枠もできるそうです。 上記将来の機能や展開についての詳細は以下の記事にまとまっていました。 * Terraform Collaboration for Everyone 今回公開された機能は state ファイルのためのストレージ機能です。 これは t
3 min read
Summary of Terraform v0.10
terraform

Summary of Terraform v0.10

terraformのv0.10が出ましたね。 ✨ * HashiCorp Terraform 0.10 | HashiCorp v0.10の概要とv0.9からの移行方法をメモしておきます。 v0.10の概要 以下の大きめの変更があるようです。 * プロバイダの分離 * 多数のプロバイダの改善 * State Environmentsの名前の変更 プロバイダの分離がだいぶ大きな変更ですね。今まではterraformのバイナリにプロバイダのリソースが含まれていましたが、これからはtarraformのコアのバイナリとプロバイダのバイナリが分離されます。 プロバイダのリソースはそれぞれのプロバイダ毎の単一のバイナリファイルとなり、terraformにインクルードされて使われる様になります。 また、terraformのリポジトリもコアのリポジトリとプロバイダのリポジトリで分離されるようになります。 * Terraform Providers · GitHub このような変更を行った目的として、terraformを改善していく速度を加速させること
3 min read
Terraform state file removed by S3 Lifecycle
aws

Terraform state file removed by S3 Lifecycle

こんにちわ。最近キャンプばっかり行っているのでブログ更新が滞っています。あかん! さて、このブログが動いているサーバはterraformでインフラの管理をしています。 terraformのstateファイルの管理はS3バックエンドを使っています。 * Migration from terraform remote command to terraform backend system また、S3の設定でバージョニングとライフサイクルの設定をしていました。 * Versioning terraform.tfstate この設定が原因でtfstateファイルが消えてしまったので記録しておきます…。 起きたこと terraform planを実行したら全てのリソースがcreateされる差分が出てしまいました。 急いでS3のバケットを見たところ、なんと空になっていました…。泣きながら削除済みオブジェクトを表示してみたところ、以下のように削除マーカーが設置されていました。削除マーカー以前のバージョンのtfstateファイルも見れる状態でした。
2 min read
DigitalOcean released Cloud Firewalls
digitalocean

DigitalOcean released Cloud Firewalls

DigitalOceanにマネージドなファイアウォールが追加されました! ✨ * Cloud Firewalls: Secure Droplets by Default 管理画面やAPIから設定できるファイアウォールで、設定はDigitalOceanのネットワーク層で適用されます(フィルタされたパケットはドロップレットまで届かない)。 この機能によってドロップレット毎にiptablesやfirewalldを設定する必要がなくなるのがうれしいですね。 sourceもしくはdestinationにはIPv4, IPv6, タグ, ドロップレット, ロードバランサを指定することができます。tagを指定することで楽かつ柔軟にスケールできそうですね。 terraformでも近いうち実装されそう。 * resource_digitalocean_firewall.go: Add DO Cloud Firewalls (#15124) by keinohguchi · Pull Request #1 · terraform-providers/terraform-p
1 min read
Summary of Terraform v0.9
terraform

Summary of Terraform v0.9

terraform0.9が出ました。 * Terraform 0.9 | HashiCorp tfstateの管理を設定する方法が変わって、これは今のところは後方互換性がありますが0.11で旧方式が廃止されるみたいなので先日移行しました。 * Migration from terraform remote command to terraform backend system 今回はほかに追加された機能についてもためしてみます。本家ブログの流れにだいたい沿って見ていきました。 * Terraform 0.9 | HashiCorp うまく訳せず理解が追いつかないところも多いですがφ(..)メモメモ Backendsについて Backendsという概念が追加されて、これが結構重要そうなので先にまとめてみます。 Backendsとはterraformで管理されたリソースの状態(作成したリソースのIPアドレスのような実際の値)をどのように読み込むか、そしてapplyでどのような処理が実行されるかを決定する機構のようです。 * Backends
7 min read
Migration from terraform remote command to terraform backend system
terraform

Migration from terraform remote command to terraform backend system

先日terraform 0.9がリリースされました。 * Terraform 0.9 | HashiCorp いくつかの面白そうな機能追加・変更がありますが、そのうちの一つとしてtfstateファイル(terraformで管理しているリソースの状態を記録しているjsonファイル)をクラウド管理するためのremoteコマンドが廃止され、代わりにbackendが実装されました。 * Backends - Terraform by HashiCorp backend以外の諸々の機能も気になりますが、今回はひとまずremoteコマンドからbackendへの移行をしてみます。 terraformのドキュメントには各メジャーバージョン毎のアップグレード手順が用意されており、0.9のアップグレード手順でremoteコマンドからbackendへの移行方法を見ることができます。 * Upgrading to Terraform 0.9 - Terraform by HashiCorp 移行方法 今までは以下のようなコマンドでtfstateファイルのクラウド管理設定
2 min read
Arukas provider with Terraform
terraform

Arukas provider with Terraform

以前Windows環境で実行できないという理由で消えてしまったterraformのArukasプロバイダですが、terraform v0.8.7で無事復活したようです!(コメントで気づいた!) * terraform v0.8.3でArukasがサポートされたがv0.8.4で削除されていた 早速使ってみます。 準備 まずArukasのトークンとシークレットキーを取得します。 ドキュメントを見ると環境変数からトークンとシークレットキーを読み込ませられるので設定しておきます。 export ARUKAS_JSON_API_TOKEN=XXXXXXXX export ARUKAS_JSON_API_SECRET=YYYYYYYY 使ってみる 以下のようなtfファイルを作成。 resource "arukas_container" "hello_arukas" { name = "hello_arukas" image = "nginx:latest" instances = 1 memory = 256
5 min read
Add annotation to Mackerel when changed infrastructure with Terraform
terraform

Add annotation to Mackerel when changed infrastructure with Terraform

mackerelにグラフアノテーション機能が追加されました。 * グラフアノテーションをリリースしました! ほか - Mackerel ブログ #mackerelio * Mackerel API ドキュメント(v0) - Mackerel API ドキュメント (v0) グラフアノテーション機能とは先日のmackerelミートアップでも紹介があった通り、デプロイや何かしらの事象をmackerelのグラフ上で注釈することができる機能です。 * Mackerel Meetup #9 Tokyo #mackerelio 今回はterraformで特定のリソースに変更があった場合、それをグラフ上に表示させてみます。 まずは普通にAPIを叩いてみる 鬼のようなcurlを実行します。 できた。 Terraformと連携させる方法を考える 今回は例として、DigitalOceanのtagリソースに変更が加えられた場合、グラフに注釈を入れるようにしてみます。 「tagリソースに変更が加えられた場合何かを実行する」方法として、null_reso
4 min read
Arukas provider was added in terraform v0.8.3, but removed in v0.8.4
terraform

Arukas provider was added in terraform v0.8.3, but removed in v0.8.4

terraformのアップデートが来ていたのでv0.8.5にアップデートがてらChangeLogを流し読み。 ん!?v0.8.3でArukasがサポートされてるやんけ!!Arukasユーザとして嬉しい。 ん?でもv0.8.4はずいぶん差分が少ないな...。 アッ We have removed the Arukas provider that was added in v0.8.3 for this release. Unfortunately we found the new provider included a dependency that would not compile and run on Windows operating systems. For now
1 min read
Read access key from Vault with Terraform
terraform

Read access key from Vault with Terraform

ここ最近terraformのvaultプロバイダについて試していました。 * terraformのvaultプロバイダを試す * terraformでvaultから値を取得する方法 * Solved Vault data source error その成果として、terraformで管理している個人サーバのアクセスキーをvaultで管理し、terraformで利用してみます。 これまで main.tfのあるディレクトリでdirenvを使い、アクセスキーを環境変数で設定していました。 export DIGITALOCEAN_TOKEN="XXXXXXXX" これから vaultにアクセスキーを格納し、terraformから呼び出すようにしました。 data "vault_generic_secret" "digitalocean" { path = "secret/digitalocean" } provider "digitalocean" { token = "${data.vault_generic_secret.digital
1 min read
Solved Vault data source error
terraform

Solved Vault data source error

terraformからvaultを使う際にうまくいかなかった問題が解決できたっぽいのでメモ。 * terraformのvaultプロバイダを試す これ。* Resource 'data.vault_generic_secret.test' does not have attribute 'data' for variable 'data.vault_generic_secret.test.data' vaultのバージョンを0.6.0から0.6.4に上げたら解消した! terraformのvaultプロバイダのコードを見るとvaultのapiライブラリをインポートして使っている。 * terraform/data_source_generic_secret.go at master · hashicorp/terraform · GitHub vault側のチェンジログを見ると、0.6.0から0.6.4の差分はだいぶ大きい。例えば0.6.1ではGo APIのための修正が入っていたりする(この修正はCLIとGo
1 min read
Get value from Vault with Terraform
vault

Get value from Vault with Terraform

この前terraformのvaultプロバイダを使おうとした所うまくいきませんでした。 * terraformのvaultプロバイダを試す そこで、もう少し単純なコードで書き直して検証してみたところ、うまくvaultから値を取ってこれたのでその方法をメモしておきます。 準備 MacでVaultを起動しておきます。検証なのでdevモードで起動します。起動したら、出力に出るRoot Tokenの値をメモしておきます。 brew install vault vault server -dev 環境変数に必要な値をセットしておきます。 export VAULT_ADDR="http://127.0.0.1:8200" export VAULT_TOKEN="Root Tokenの値" main.tfを書く こんなmain.tfを書きました。 * vaultにsecret/doというpathを作成し、token=XXXXXXXXというkey/valueをセットする * データソースにvaultを指定し、作成したpathからfetchできるよ
1 min read
Vault provider by Terraform v0.8
terraform

Vault provider by Terraform v0.8

terraform 0.8がリリースされました。 * Terraform 0.8 | HashiCorp 幾つかの新機能が追加さました!!!その中でVaultとの連携を試してみます。 が、うまく動きませんでした。orz できた。✨ → Read access key from Vault with Terraform やったところまで書く。 Vault providerが提供する2つの機能 vault providerが提供する機能は2つあります。 * terraformからvaultそのものを変更する機能(新しいkey/valueの追加とか) * vaultから機密情報をreadし、terraformで使う機能(シークレットキーを取得したりとか) 注意事項 vaultと連携することによって、より便利にterraformが使えるようになりましたが、それぞれ以下のようなセキュリティ上のトレードオフがあるのでよく考慮した上で導入すること。とのこと。 * vaultに変更を加える(機密情報の追加とか)場合は、terraformの設定ファイル内
4 min read
去年より個人ブログのポスト数を2倍くらい増やせたのでなぜなのか書く
ghost

去年より個人ブログのポスト数を2倍くらい増やせたのでなぜなのか書く

この記事はfeedforceアドベントカレンダーの11日目の記事なんだからね! * feedforce Advent Calendar 2016 - Adventar 昨日は@tmd45さんのターンでした。私も脂肪が増えてきた気がするので減らしていこうと思います(戒め)。まずは野菜だ!(ちなみに最初フト「れ」ない話に空目して関連する人物が3人ほど脳内サジェストされました。) * フトらない話 - TMD45'β'LOG!!! さて、今回は「分散惑星間データセンター(Grid Interplanetary Data Center)時代のデータ通信技術」について書こうとしたのですが、すごい難しそうなので諦めました。 公転の関係で季節によって通信先の惑星とのレイテンシが変わったり、公転の関係で通信先の惑星が太陽の向こう側に隠れると通信できなくなったり、太陽風とか重力レンズ効果を考慮しないとだめとか多分そんな感じです。 ていうかそもそもまだ地球以外の惑星にデータセンターと呼べるものがないのでは?(怒) なので今回は、去年よりブログのポスト数が増やせたことに関して
5 min read
Improve my terraform modules
terraform

Improve my terraform modules

以前terraformのmain.tfをモジュールに分割した際に、モジュール同士で変数をやり取りする方法について書きました。 モジュール間の変数のやり取りはregion = "${droplet_region}"みたいに書く Split main.tf into modules, my server was dead しかし、最近になって以下のようなエラーが出るようになっていました。 $ terraform plan There are warnings and/or errors related to your configuration. Please fix these before continuing. Errors: * invalid variable syntax: "droplet_region". If this is part of inline `template` parameter then
2 min read
Auto formatting with Vim for Terraform
vim

Auto formatting with Vim for Terraform

terraform v0.6.15からfmtコマンドが追加されてました!(最近知った) * terraform/CHANGELOG.md at master · hashicorp/terraform · GitHub terraform fmtコマンドを実行すると、カレントディレクトリ以下のtfファイルをフォーマッティングしてくれます。 自然にフォーマッティングしたいので、vimでファイル保存時にフォーマッティングしてくれるようにしてみます。 vim-terraformプラグインを使います。 * GitHub - hashivim/vim-terraform: basic vim/terraform integration インストール、設定方法は.vimrcに以下の行を追記するだけ。terraform_fmt_on_saveというグローバル変数に値を入れることで保存時のフォーマッティングを有効にしています。 NeoBundle 'hashivim/vim-terraform' let g:terraform_fmt_on_save = 1 フォ
1 min read
Versioning terraform.tfstate
terraform

Versioning terraform.tfstate

この記事のS3ライフサイクルの設定では、90日以上更新のないtfstateファイルを削除してしまうので注意…。 * Terraform state file removed by S3 Lifecycle 助言を頂いた! .tfstate の backend を S3 にしていたら、バケットの Versioning Property を Enable にしておくと良いかも。 > plan で .tfstate に差分 / “Split main…” https://t.co/qX3vZAP5LW — Takashi Masuda (@masutaka) 2016年10月23日 その後口頭で公式のベストプラクティス的なものにも書いてあった気がすると聞いたので確認したところ、オフィシャルのドキュメントでS3でtfstate管理する場合はBucket Versioningを有効にすることを激しく推奨していました! Warning! It is highly recommended to enable Bucket Versioning on the
2 min read
Split main.tf into modules, my server was dead
terraform

Split main.tf into modules, my server was dead

このサイトが動いているサーバはDigitalOceanで、terraformで管理しています。 最近、main.tfを見ていて見づらいなと感じたので(行数は100行もないけれど大半が変更しない行だしいつも目で飛ばしてる行だった。)moduleを使ってスッキリさせようと思い立ちました。 * Modules - Terraform by HashiCorp 結果、main.tfが大分すっきりしました。 variable "default_key" {} variable "mailgun_key" {} module "droplet" { source = "./modules/digitalocean/droplet" default_key = "${var.default_key}" } module "networking" { source = "./modules/digitalocean/networking" mailgun_key = "{var.mailgun_key}" } モジュールについてのメモ モジュールは2個
6 min read
Create swap with cloud-config
swap

Create swap with cloud-config

digitaloceanでcloud-configを使ってサーバ初期起動時にswapが有効になるようにしてみる。 * How to enable linux swap on boot? cloud-configの作成 こんな感じのcloud-config.ymlを書く。fstabへの記述はansibleでやっているので端折ったが、ここまでやるならfstabの編集までcloud-configの責務にしたほうが良さそう。 #cloud-config runcmd: - fallocate -l 2G /swapfile - chmod 600 /swapfile - mkswap /swapfile - swapon /swapfile 動作確認 実際にdropletを立てて確認する(もっと楽な方法無いかな…)。 doctl compute droplet create cloud-config-test --region sgp1 --image centos-7-0-x64 --size 512mb --user-data-file
1 min read
End of Atlas free trial
terraform

End of Atlas free trial

\(o)/オワタ * Atlas | HashiCorp $ terraform plan Error reloading remote state: Unexpected HTTP response code: 400 Body: {"errors":["This feature requires Terraform Enterprise. Please contact sales@hashicorp.com to start or extend your trial."],"success":false} Freeプランだとterraform(のtfstate置き場として)使えないのよな…。泣きそう。 とりあえずS3に退避。諸々忘れてていったんまっさらにしてから始め直したいので、まずは既存のremote設定を消す(消さなくても出来ると思われる)。 terraform remote config -disable これでローカルの.terraform/terraform.
1 min read