🐶

terraformでfastlyをimportした時の話

2024/06/07に公開

こんにちは。株式会社スペースマーケットでフロントエンドエンジニアをしておりますwado63です。
弊社ではCDNとしてFastlyを利用しており、いままではFastlyの管理画面から設定を行っていましたが、Terraformへ移行することにしましたのでその時の話を紹介します。

Fastlyとは

Fastlyはコンテンツ配信ネットワーク(CDN)やエッジコンピューティングなどを提供するサービスで、ユーザーに近い場所でコンテンツを配信することで、ユーザーの体験を向上させることができます。

スペースマーケットでは、Fastlyを使用して、画像やCSS、JSなどの静的ファイルを配信および、一部のページのHTMLをキャッシュすることでページの表示速度を向上させています。

Terraformとは

IaC(Infrastructure as Code)の1つで、インフラストラクチャをコードで管理するためのツールです。

スペースマーケットでは、awsやgcpなどのクラウドサービスをTerraformで管理しています。

移行するときに気をつけること

リファクタリングをせず、ありのままをコードに落とし込む

Fastlyだからという話ではないのですが本番稼働しているサービスをIaCに落とし込む際は、リファクタリングを行わず、ありのままをコードに落とし込むことをオススメします。

コード管理されていないインフラストラクチャは、大体のケースで本番と開発環境で細かい差分が存在すると思います。そのためコードに落とし込む際にリファクタリングをしてしまうと、コードレビューなどの際に、何が正しくて何が間違っているのか気づけなくなります。またその結果として意図しない障害を引き起こす可能性がありますので、リファクタリングは後回しにして差分を生まないことに注力しましょう。

実際にやったこと

FastlyがTerraformを使用する際のドキュメントを用意していくれておりますので、基本的にはそこに書いてある内容にしたがうと良いです。

https://www.fastly.com/documentation/guides/integrations/orchestration/terraform/

Fastlyが提供しているProviderを試すだけであれば、こちらの記事を参考にPublic IP listを取得するなどしてみると良いでしょう。
https://zenn.dev/jrsyo/articles/841c2d73d85a16

実際にFastlyの設定をTerraformで管理するにはAPI tokenが必要ですので、Fastlyの管理画面から取得しておきましょう。
https://docs.fastly.com/en/guides/using-api-tokens

まずは、importの準備です。
適当なterraformファイルを作成し、providerとimportさせたいresourceを記述します。

terraform {
  required_providers {
    fastly = {
      source  = "fastly/fastly"
      version = ">= 5.10.0"
    }
  }
}

provider "fastly" {
  api_key = "test"
}

resource "fastly_service_vcl" "default" {}

次に、terraform importコマンドを実行します。
Fastlyのproviderはimport blockのサポートがないため、importコマンドを使用してリソースをインポートします。

terraform import fastly_service_vcl.default ${service_id}

これでtfstateが作られましたね。あとはこれを差分が出ないようにterraformのリソースを書いていきます。
(この手動で差分が出なくなるまで書いていく問題をどうにか解決したいです。)

diffの確認はこちらの記事を参考にさせていただきました。
パッと見はわかりづらいですが、terraform planを実行した際の差分を別々のファイルに出力して、それをjqで整形しています。
これをvscodeなどで差分表示するとわかりやすいです。

$ terraform plan -out=diff.tfplan && terraform show -json diff.tfplan > diff.json && rm diff.tfplan && cat diff.json | jq ".resource_changes[].change.before" > diff.before.json && cat diff.json | jq ".resource_changes[].change.after" > diff.after.json

https://qiita.com/bigwheel/items/c5eabb23922dacb67ecc

そしてterraformのリソースを書いていっても、一部だけtfstateから再現できない箇所があります。
activateactivate_versioncloned_versionです。

activateの差分
activateの差分

この差分は、実際にterraform applyする際に自動的に更新されるので、terraformのリソースには書かなくても大丈夫です。

activateは即時反映するかどうかの設定、activate_versionは実際に稼働しているversion、cloned_versionはdraftなどで用いられる個別のversionです。

activateにtrueを設定し、terraform applyすると新しいversionで即時反映されます。
activateにfalseに設定し、terraform applyすると新しいversionが作成されますが、activate_versionは変わらず、新しいcloned_versionが発行されdraftとして扱われます。

まとめ

  • IaCに落とし込む際はリファクタリングをせず、差分を生まないようにする
  • tfstateの差分をみつつ、terraformのリソースを書いていく
  • active, activate_version, cloned_versionは差分として出てくるが恐れる必要なし

これで安心してVCLを改修できるようになりますね!

宣伝

スペースマーケットでは現在エンジニアを募集しております!
ちょっと話を聞いてみたいといったようなカジュアルな面談でも構いませんので、ご興味のある方は是非ご応募お待ちしております!

スペースマーケット Engineer Blog

Discussion