Terraformで作るAkamai配信設定とLinode Object Storage
Terraformでは複数のプロバイダーを指定して、同一のコード内で管理することができます。
今回は、LinodeのObject Storageに静的コンテンツを配置し、AkamaiのCDNで分散配信する構成をTerraformで作成する例を紹介します。
Linodeとは
Linodeはシンプル、低価格、使いやすさに定評のあるIaaSのサービスです。
2022年2月にAkamaiが買収を発表しました。(買収完了は本年3月)
https://www.akamai.com/ja/newsroom/press-release/akamai-to-acquire-linode
Linodeは仮想サーバーのみの提供ではなく、S3互換製品であるObject Storageをサービスとして提供しています。
今回はそのObject StorageをオリジンとしたAkamaiの配信設定をTerraformのコードで管理する方法をご紹介します。
Akamaiの配信設定
今回はAkamaiの配信製品の一つであるDownload Deliveryを利用するTerraformのコードとなっています。
Download Deliveryは大容量のファイルベースのコンテンツ配信に最適化された、高性能のコンテンツ配信ソリューションです。
Terraformのコードと構成
Terraformのコードはこちらのサンプルを利用します。
https://github.com/isss802/linode-terraform-demo/tree/main/linode-objectstorage-akamai
構成図は以下となります。
コードの取得
Githubからコードを取得します。
$ git clone git@github.com:isss802/linode-terraform-demo.git
$ cd linode-objectstorage-akamai/
Akamai API Keyの設定
AkamaiとLinodeのAPI Keyを取得し、設定をします。
API Key取得の参考サイト
https://www.akamai.com/ja/blog/developers/akamai-api-part1-api-client-edgegrid#000003
~/.edgerc に作成したAPI Keyの登録を行います。
$ vim ~/.edgerc
[default]
; Akamai {OPEN} API credentials
client_secret = xxxxxxxxxxxxxxxxxxxxx
host = akab-xxxxxxxxxxxxxxxxxxxxxxxxxx.luna.akamaiapis.net
access_token = akab-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
client_token = akab-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Linode API Keyの設定
LinodeのAPI Keyを取得し、設定をします。
$ export TF_VAR_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
コードの説明
記載している各コードに関しての説明となります。
$ tree ./
./
├── README.md
├── index.html → Linode Object Storageにアップロードするファイル
├── objectstorage.tf → Linode Object Storageの作成、アクセスキーの作成、ファイルアップ
├── property-snippets
│ └── main.json → Download Deliveryの設定ファイル
├── property.tf → Download DeliveryのProperty作成、CPコード作成、Edge Hostnameの作成
├── terraform.tf → プロバイダーの定義
└── variables.tf → 変数の指定
Variablesの指定
Variablesの指定をする際に、ContractIDとGroupNameが必要となります。
ACC(Akamai Control Center)より確認を行い、情報を控えておきます。
グループ名の中にContractIDが含まれている場合が多いです。
Contract IDはBillingのページからも確認が可能です。
variables.tfを編集し、作成する際の値を入力します。
$ vim variables.tf
#########################
# Linode
#########################
variable "token" {}
# Linode Object Storageを立ち上げるリージョンを指定
variable "region" {
default = "us-southeast-1"
}
# Linode Object Storageの名前を記載
variable "label" {
default = "example"
}
#########################
# Akamai Property
#########################
variable "edgerc_path" {
type = string
default = "~/.edgerc"
}
variable "config_section" {
type = string
default = "default"
}
variable "env" {
type = string
default = "staging"
}
# Group NameとContract ID(先頭にはctr_が必要)を記載する
variable "akamai_group" {
default = {
group_name = "example-group"
contract_id = "ctr_XXXXXXXXXX"
}
}
# CP Code Nameに任意の名前を設定する
variable "cpcode_name" {
default = "example"
}
# Akamaiに割り当てるHostnameを指定する
variable "cname" {
default = "hoge.example.com"
}
# Emailを記載
variable "email" {
default = "hoge@example.com"
}
# EdgeHostnameを記載する
variable "edge_hostname" {
default = "hoge-example-com.edgesuite.net"
}
Terraformの実行
Terraformを実行し、各環境へリソースの作成を行います。
尚、今回のサンプルではAkamaiへのステージング環境に設定を適用するため4分ほど実行にかかります。
コーヒーでも作って待ちます。
$ terraform init
$ terraform apply
akamai_property_activation.dd: Still creating... [3m40s elapsed]
akamai_property_activation.dd: Creation complete after 3m44s [id=:STAGING]
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
作成完了したらAkamaiのACCからPropertyが作成されていることを確認します。
設定ではS3互換ストレージであるLinode Object Storageが設定されています。
また、Edge Hostnameが利用可能になるまで15分程度かかります。
作ったコーヒーでも飲んで待ちます。
接続確認
Edge Hostnameの作成が完了したら、ステージング環境へのアクセス確認を行います。
Akamaiのステージング環境にアクセスするにはSpoofing(スプーフィング)を行います。
詳しくはこちらのサイトを参考にしてください。
https://community.akamai.com/customers/s/article/Stagingrxdxn?language=en_US
$ dig xxxxxxxxxx.edgesuite-staging.net +short
axxx.dscd.akamai-staging.net.
xx.xx.xx.xx #IPをコピーする
xx.xx.xx.xx
$ sudo vim /etc/hosts
xx.xx.xx.xx hoge.example.com #IPとドメインをHostsに記載する
Webブラウザからhoge.example.comにアクセスし、ページが表示されるか確認する。
運用のTips_1
Akamaiの配信設定をTerraformで管理する場合、jsonファイルの管理が必要です。
$ tree ./
./
├── property-snippets
│ └── main.json → Download Deliveryの設定ファイル
このjsonファイルの可読性が低く、またどのような設定を記載すればいいかが悩ましいところです。
このjsonファイルはData Sourcesのakamai_property_rulesにより管理をしやすくすることができます。
jsonファイルをテンプレート化したい場合に、指定の箇所を変数化することができ、他の環境にも流用しやすくなります。
$ view property.tf
data "akamai_property_rules_template" "rules" {
template_file = abspath("${path.module}/property-snippets/main.json")
# 変数を指定可能、この場合はLinodeのObject Storageを指定している
variables {
name = "hostname"
value = "${linode_object_storage_bucket.mybucket.label}.${linode_object_storage_bucket.mybucket.cluster}.linodeobjects.com"
type = "string"
}
main.json内に "${env.hostname}"
として記載している。
$ view property-snippets/main.json
34 "behaviors": [
35 {
36 "name": "origin",
37 "options": {
38 "cacheKeyHostname": "REQUEST_HOST_HEADER",
39 "compress": true,
40 "enableTrueClientIp": true,
41 "forwardHostHeader": "ORIGIN_HOSTNAME",
42 "hostname": "${env.hostname}",
43 "httpPort": 80,
運用Tips_2
Akamai Propertyに新規設定を1つ追加したい場合、このmain.jsonの追記が必要となります。
しかし、このjsonをどのように記載したら差分がでないようになるか悩ましいところです。
ACCからProperty Managerを操作し、追加したい設定を入れた後に View JSONから参照が可能となります。
また、ダウンロードも行えるので、作成したい、もしくは追加したいjsonがどのような記載か確認し、Terraformへ反映する運用を行うことでコード化の手間を簡略化してみましょう。
まとめ
Terraformで作るAkamai配信設定とLinode Object Storage、いかがでしょうか。
Akamaiは様々なリソースがTerraformに対応しているため、Infrastructure as Code(IaC)の対応を迅速に進めていくことができます。
関連記事
アカマイ・テクノロジーズ合同会社のQiitaではLinode関連など開発者向けの記事を記載しております。