terraformでfastlyをimportした時の話
こんにちは。株式会社スペースマーケットでフロントエンドエンジニアをしております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を使用する際のドキュメントを用意していくれておりますので、基本的にはそこに書いてある内容にしたがうと良いです。
Fastlyが提供しているProviderを試すだけであれば、こちらの記事を参考にPublic IP listを取得するなどしてみると良いでしょう。
実際にFastlyの設定をTerraformで管理するにはAPI tokenが必要ですので、Fastlyの管理画面から取得しておきましょう。
まずは、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
そしてterraformのリソースを書いていっても、一部だけtfstateから再現できない箇所があります。
activate
とactivate_version
、cloned_version
です。
この差分は、実際に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を改修できるようになりますね!
宣伝
スペースマーケットでは現在エンジニアを募集しております!
ちょっと話を聞いてみたいといったようなカジュアルな面談でも構いませんので、ご興味のある方は是非ご応募お待ちしております!
スペースを簡単に貸し借りできるサービス「スペースマーケット」のエンジニアによる公式ブログです。 弊社採用技術スタックはこちら -> whatweuse.dev/company/spacemarket
Discussion