こんにちは、技術本部SRE部ZOZO-SREブロックの鈴木です。普段はSREエンジニアとしてZOZOTOWNの裏で動いているオンプレミスとクラウドの構築・運用・保守に携わっています。
ZOZOTOWNのインフラは大半がIaC化されていますが昔からあるリソースに関してはその限りではありません。弊社で導入しているAkamaiもIaC化されていないリソースの1つでしたが、頻繁な更新などによって重複した設定が入っている箇所がある等、長く運用しているとどうしても陥ってしまう沼にハマっていました。本記事ではこの沼から抜け出そうと部分的にもIaC化を導入して問題を解決したことを、Akamaiのネットワークリストを例に紹介します。同様の問題を抱えていた方の参考になれば幸いです。
目次
はじめに
まずはじめに、本記事で登場するキーワードであるInfrastructure as Code(以下IaC)について簡単に説明します。
IaCとは、インフラ構成をコード化して、コードの内容を自動でプロビジョニングすることです。コード化することによってソフトウェア開発における便利なツールが使えるようになり、様々な恩恵を受けられます。
ZOZOTOWNにおいては大半のリソースがIaCによって管理されているものの、昔からあるリソース、そもそもIaC化にかかるコストが効果に見合わないものはIaC化されないという柔軟な運用になっています。弊社では数多くのSaaSを導入しており、今回テーマとなるAkamaiも費用対効果が見合わないものとして導入当時にIaC化されていなかったリソースです。
Akamaiは弊社で利用しているCDNサービスであり、様々な用途で利用されています。以下のブログでもAkamaiを利用した事例について書かれています。
techblog.zozo.com techblog.zozo.com
Akamaiをいろいろなところで使うに従って設定情報は増えていきます。Akamaiの設定のうち、頻繁に変更するものとして「ネットワークリスト」があります。ネットワークリストはIPおよびGEOを単位としたリストを作り、ネットワークファイアウォールのブロック制御等を行うことができます。弊社では特定のIPのみ通信を通したいときなど、用意しておいたネットワークリストにIPを追加することで通信を許可できるように設定しています。
課題
Akamaiをしばらく運用するに従い、いくつか課題点がでてきました。
ネットワークリストの更新はAkamaiのコンソールから行っていました。ネットワークリストの更新が頻繁になるにつれ、このIPはなんのために追加したものなのか、いつ誰が追加したものなのかを追うのが困難になっていました。Akamaiのコンソール上にも設定変更の履歴が表示されるものの変更内容の詳細までは表示されません。それぞれのネットワークリストにはコメントをつけられるものの文字数制限があり、必要な情報すべてを書けませんでした。リストの内容の検索ができなかったため、内容の重複するようなリストがいくつも作成されるなど、次第に積み重ねによる使いにくさがどんどん増えていきました。
「設定の内容が可視化できていない」ことが私達の課題点でした。
これらの解決策としてパラメータシートのような資料を作り、設定を記録していくことが考えられますがメンテナンス性に難があります。そこで私達はAkamaiの設定情報をIaC化することで解決を図りました。今回のIaC化はひとまずネットワークリストのみに対象を絞ります。目標としては「ネットワークリストの設定変更の履歴を追える」「CI/CDを用いたデプロイが可能」の状態を目指し、AkamaiのすべてをIaCを目指すところまでは行わないことに決めました。
AkamaiのIaC化
AkamaiをIaC化する上で使えるツールとしては「Akamai API」「Akamai CLI」「Terraform」の3つがあります。
Akamai APIを用いることでAkamaiの提供する機能をAPIで操作できます。APIを直接利用して操作するため、コーディングが必要となりますが自由度が高く複雑なインフラも簡単に構築できます。
Akamai CLIはAkamaiを操作するためのCLIツールです。GUIを使わずにAkamaiを操作でき、工夫次第でIaC化などにも有用なツールです。
Terraformは代表的なIaCツールであり、Akamai社がTerraformのProviderを提供しているため、ほとんどの設定がTerraform上で管理可能です。代表的なIaCツールであり、IaC化したコードのデプロイ等の機能だけでなく、インポートや実際の環境との差分検知など便利な機能が多数あります。
Akamai CLIを用いてTerraformの設定ファイルを生成も可能です。初期構築の際など複雑な設定をする際にはこちらの機能を利用するとお手軽にIaC化を進められます。弊社でもWEARチームがAkamai CLIからTerraformの設定ファイルを作成して適用する流れをProperty Managerの設定の際に利用しています。
それぞれのツールについて簡単に比較したものが以下になります。
観点 | Akamai API | Akamai CLI | Terraform |
---|---|---|---|
柔軟な設定 | ◎ | ◎ | ○ |
既存設定のインポート | △ | △ | ◎ |
導入スピード | △ | △ | ○ |
各種機能が揃っており、代表的なIaCツールでありメンバーも特別な学習をすることなく利用できる点に魅力を感じ、今回はTerraformを用いてIaC化を行いました。特にすでにあるAkamaiの設定を手軽にインポートできる機能はAkamaiをすでに長く利用していた私達の求めていたものでした。
既存環境のTerraform化
既存のAkamaiのネットワークリストをTerraformを用いてIaC化する方法を解説します。流れとしては以下になります。
- Terraformの設定
- ネットワークリストのリソースIDを取得
- インポート
- コード化
1. Terraformの設定
TerraformからAkamaiの設定を操作できるようにAuthenticate the Akamai Providerに従い認証をします。クレデンシャル情報を作成し.edgerc
を用意する方式でまずは行いました。
❯ cat ~/.edgerc [default] host = akab-....luna.akamaiapis.net client_secret = pc... access_token = akab-... client_token = akab-...
2. ネットワークリストのリソースIDを取得
実際の環境で動いているネットワークリストのリソースIDを取得します。
terraform { required_providers { akamai = { source = "akamai/akamai" version = "1.10.0" } } } provider "akamai" { edgerc = "~/.edgerc" config_section = "default" } data "akamai_networklist_network_lists" "network_lists" { } output "network_lists_list" { value = data.akamai_networklist_network_lists.network_lists.list }
❯ terraform init ... ❯ terraform.sh plan Changes to Outputs: + network_lists_list = [ + "1000_ZOZOOFFICE", + "2000_ZOZOSERVICEIPS", ...
出力されたIDが実際の環境ですでに動いているリソースのIDであり、設定をインポートする際に利用します。
3. インポート
すでに作られているネットワークリスト情報を入れる先として空のリソースを作成し、インポートコマンドを使うことでTerraformの管理下にリソースを置きます。
resource "akamai_networklist_network_list" "zozo_office_ip_list" {}
❯ terraform import akamai_networklist_network_list.api_zozo_com_zozo_platform_natgateway 1000_ZOZOOFFICE
インポートした内容はstate show
コマンドを用いることで確認できます。
❯ terraform state show akamai_networklist_network_list.zozo_office_ip_list # akamai_networklist_network_list.zozo_office_ip_list: resource "akamai_networklist_network_list" "zozo_office_ip_list" { description = "Office IP List" id = "1000_ZOZOOFFICE" list = [ "a.a.a.a", "b.b.b.b", ... ] mode = "REPLACE" name = "ZOZO_OFIICE" network_list_id = "11000_ZOZOOFFICE" sync_point = 1 type = "IP" uniqueid = "1000_ZOZOOFFICE" }
4. コード化
Terraformの管理下にネットワークリストが入ったものの、まだコード上には反映されていません。この状態でTerraform applyしてしまうと設定が空になってしまうため、インポートした内容をもとにコードを修正します。
terraform state show
を用いて表示された設定情報をもとに空で作っていたリソースを更新します。
resource "akamai_networklist_network_list" "zozo_office_ip_list" { description = "Office IP List" list = [ "a.a.a.a", "b.b.b.b", ... ] mode = "REPLACE" name = "ZOZO_OFIICE" type = "IP" }
terraform plan
を打って無事にNo Changeとなっていればインポート完了です。 内容を更新する際には、コードを更新した後にterraform apply
することで設定を更新できます。
コード化によって
弊社ではコードの管理にGitHubを利用しています。AkamaiのネットワークリストをIaC化したことで、一般的なIaC化のメリットとなりますが以下の効果が得られました。
- 更新履歴が手軽に追える
- GitHubのコミット履歴をみることで誰がいつどこで何のために更新したのか見れるようになった
- 設定情報を手軽に確認できる
- 設定内容を確認するために今まではログインして等の手順が必要だったが、設定内容の書かれたリポジトリをPullするだけで最新の内容を確認できるようになった
- コード化されたことでコンソールからはできなかった検索ができるようになった
- 更新する設定のレビューをメンバーに依頼できる
- 一人で作業することがなくなりチーム内での情報共有が手軽になっただけでなく、更新内容を事前にしっかりメンバーと共有できているという事実が心理的な安全性を向上させてくれた
無事に「設定の内容が可視化できていない」という課題点をTerraformを用いて解決できました。設定情報が手軽に確認できるようになったことで重複のあったリストの整理や不要なリストの削除が進みました。削除作業の際にも履歴をコミットとして残せるため作業の途中経過を残すことができ、管理がしやすかったです。
まとめ
どうしても古くから利用しているSaaSやインフラは煩雑、複雑になってしまいがちです。部分的なところからでもIaCを導入することで開発効率の向上に少しづつ繋げていけます。
今回はAkamaiのネットワークリストをTerraformを用いてIaC化することで、いままで感じていた不便だった点を解消できました。今回IaC化のツールとしてTerraformを選択し、AkamaiのTerraformモジュールが整備されていることもありとても手軽にIaC化ができました。AkamaiのTerraformモジュールは頻繁にアップデートされており、IaC化の作業をしている間にも頻繁にアップデートがされていました。
すべてをIaC化することも良いと思いますが、まずはIaC化する意味があるところから少しずつ進めてみてはいかがでしょうか。
最後に
ZOZOでは、一緒にサービスを作り上げてくれる方を募集中です。ご興味のある方は、以下のリンクからぜひご応募ください。
また、カジュアル面談も随時実施中です。「話を聞いてみたい」のような気軽な感じで大丈夫ですので、是非ご応募ください。