Terraform を使った Fastly サービスの設定方法
This post was written with version 0.30.0 of the Fastly Terraform provider. This is no longer the latest release so please refer to the documentation.
必要に応じてコントロールパネルやコマンドラインインターフェイス、API などを通じて Fastly サービスの設定を行う一方で、アプリケーションコードの進化と並行して設定内容を保存し、追跡できるようにすることも大切です。エッジで構築する機会が増えるに従い、アプリケーションやインフラストラクチャへ変更をデプロイするのと同じように、エッジロジックをデプロイすることがより重要になります。クラウドサービスによってインフラストラクチャとソフトウェアの境界線が曖昧になる中、複数のベンダーのサービスに対する コードや設定の変更を1つのバージョンにまとめてデプロイする方法がいっそう必要となります。Fastly サービスにも当てはまるこの原則を利用することを Infrastructure as Code (IaC) と言います。
以前、人気ツールの Terraform を使って継続的デプロイのパイプラインを構築する方法をご紹介しましたが、Fastly ではバージョンレスリソース、WAF、サードパーティのログエンドポイント、TLS、Compute@Edge のサポートを強化すべく 、機能の反復的な改善を続けてきました。今回は、Terraform を使用して Fastly サービスの設定、管理、デプロイを行う際の全体的なプロセスとベストプラクティスをご紹介します。
まず、Terraform を使ってシンプルな VCL サービスを作成します。このサービスは、人気のリクエスト/レスポンスのテストサイト https://httpbin.org の前に透過型プロキシとしてまず配置されます (つまり httpbin にプロキシされる前はリクエストオブジェクトへの変更は行われません)。その後、プログラムロジックをエッジで実行するための変更を行います。
今回のデモでは、以下のステップを行います。
登録 : Fastly アカウントを作成し、API キーを生成します。
記述 : Terraform コードで要件を定義します。
実行 : Terraform の CLI を使って要件を計画し、実行します。
検証 : Web ブラウザを開き、サービスが正常に動作していることを確認します。
変更 : 定義されたリソースに変更を加え、新たなプランを生成して再度実行します。
これらのステップを頭の中でたどれるように、以下の図で全体的なワークフローをわかりやすくまとめています。
Fastly のアカウントを作成する
まずは、Fastly のアカウントを作成します。アカウントの作成は無料で、最大50ドル分のトラフィックを無料で試すことができます。アカウント作成後、ログインして Fastly API トークンを作成します。これは、個々のユーザーに関連づけられた固有の認証情報です。ユーザーに代わって Fastly API と通信できるようにするために、このトークンを Terraform プロバイダーに渡す必要があります。
Terraform 設定を記述する
次に、お好きなコードエディターで新しい Terraform ファイルを作成します。ファイルを main.tf
と名付け、以下のコードを加えます。
terraform { required_providers { fastly = { source = "fastly/fastly" version = "~> 0.30" } }}
resource "fastly_service_v1" "test_service" { name = "An Example Service"
domain { name = "<name>.global.ssl.fastly.net" }
backend { address = "httpbin.org" name = "My Test Backend" }
force_destroy = true}
output "active" { value = fastly_service_v1.test_service.active_version}
今回はセットアップを素早く済ますためにコードを1つのファイルにまとめましたが、プロジェクトが発展するのにつれて、コードを別々のファイルに分割した方が管理しやすくなります。
上記のコードは、さまざまなブロックやコンテナを name { ... }
で示してコンテンツを整理することができる HashiCorp Configuration Language (HCL) で書かれています。上記の例では3つのトップレベルのブロックがあります。
1. terraform
2. resource
3. output
terraform
ブロックは、使用する Terraform プロバイダーのリストを定義します。今回、私たちが使用するのは Fastly Terraform プロバイダー です。
ヒント : バージョン制約について詳しくは、Terraform ドキュメントをご覧ください。
resource ブロックは、1つ以上のインフラオブジェクトを示します。上記の設定では、Terraform プロバイダーによって提供され、新しい VCL サービスの作成に必要な fastly_service_v1 という特定のリソース (「test_service」と表示される) が定義されています。このリソースには2つのブロック domain と backend がネストされています。これらのブロックは、どのドメイン名に対して VCL サービスがリクエストを処理するべきか、そして最終的にどのバックエンドサービスがリクエストを処理すべきか決定するために必要になります。Terraform の使用の有無にかかわらず、すべての Fastly サービスでこの2つの設定が最低限必要です。
このデモでは、domain 値の <name>
部分を固有の名前に変更します。変更しない場合、ドメイン名が他のサービスによってすでに使用されているというエラーが表示される可能性があります。
output ブロックでは、インフラストラクチャのデプロイ完了後に Terraform が表示する値を定義することができます。例えば、バージョン番号など、デプロイによって変わる値がよく使われます。
fastly_service_v1
リソースによって active_version 属性が生成され、サービスが正常に作成・有効化された後にその値が表示されます。Terraform コード内の active
と表示された output ブロックに割り当てられた値は、アクティブなバージョンへのアクセスを可能にする HCL のプログラム表現です。
以下のシンタックスでリソース内の属性値を参照することができます。
<resource_type>.<resource_label>.<resource_attribute>