既存のAkamai CDNの配信設定をTerraformで管理するには

# Akamai CDNの配信設定をTerraformで管理する

Akamai CDNの配信設定はAkamai Control Center (ACC) からProperty Managerを利用して行います。
通常、ACCからPropertyを管理するためにはGUIで設定を行いますが、既存のProperty設定をコード化していくために、今回はTerraformを利用した手順をご紹介します。

## Terraform化するまでの流れ
AkamaiのTerraformで管理できるリソースの一覧はこちらで参照できます。
https://registry.terraform.io/providers/akamai/akamai/latest/docs

しかしながら、上記を参考にTerraformのコードを1から作成する場合にはかなりの労力が必要となります。
今回はAkamai CLI Terraformを活用して設定をエクスポートし、そこからTerraform管理化する手順について解説します。

なお、API Keyを発行し、~/.edgercに記載が終わっている状態を前提としています。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/902cee29-7cfd-641e-8246-1517e78ba712.png">

## ACCから配信設定を作成

ACCよりCDNの配信設定を作成もしくは既存の設定を利用します。
今回はAkamaiの配信製品であるDownload Deliveryを利用しています。

<img width="900" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/cd7a233c-5a87-13b4-b824-9bc4263e5544.png">


# Akamai CLI Terraformインストール

まずはAkamai CLIのインストールを行います。

https://github.com/akamai/cli

Macの場合
```
$ brew install akamai
$ akamai --version
akamai version 1.4.2
```

次にAkamai CLI Terraformをインストールします

https://github.com/akamai/cli-terraform

```
$ akamai install terraform
$ akamai terraform --section default --version
akamai terraform version 0.7.1
```

sectionには、~/.edgercに記載している名前を利用してください。
今回は[default]のsectionに記載してあるアカウントを対象としています。


## Export Propertyの実施

Akamai CLI Terraformのcreate-propertyを利用することで既存の設定からTerraformのコードを作成することができます。
ACCより対象のProperty名を控えて、値に入力し、コマンドを実行します。

```
$ akamai terraform --section default export-property [property_name]
```

実施後に以下のファイルが作成され、構築コードが記載されます。

```
$ tree ./
./
├── import.sh
├── property-snippets
│   └── main.json
├── property.tf
└── variables.tf
```

## Importを実施する

既存環境をTerraform管理化にするにはImportコマンドを実行する必要がありますが、先程Akamai CLI Terraformにて作成した中にimport.shが用意されています。
こちらのファイルにはすでに対象の引数が記載されていますので、コードをコピペするか.shを実行してImportを行います。

```
$ vim import.sh
terraform init
terraform import akamai_edge_hostname.xxxxxxxxxxxxxxx ehn_xxxxx,ctr_xxxxxx,grp_xxxxx
terraform import akamai_property.xxxxxxxxxxxxxxxx prp_xxxxx,ctr_xxxxx,grp_xxxxx
```

## 差分を修正する

terraform planを実行して差分があるかどうか確認をします。

```
$ terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
  ~ update in-place
-/+ destroy and then create replacement

Terraform will perform the following actions:

  # akamai_edge_hostname.xxxxxxxxxxxxxx must be replaced
-/+ resource "akamai_edge_hostname" "xxxxxxxxxxxxxxxxx" {
      ~ contract      = "ctr_xxxxxxx" -> (known after apply)
      ~ group         = "grp_xxxxxxxx" -> (known after apply)
      ~ id            = "xxxxxxxxxx" -> (known after apply)
      + ip_behavior   = "IPV6_COMPLIANCE" # forces replacement
      + product       = (known after apply)
      + product_id    = "prd_Download_Delivery"
      ~ use_cases     = jsonencode( # whitespace changes
```

本環境の場合には3箇所修正する必要がありました。環境に応じて修正をしてください。

### 修正1

property.tfの記載とtfstateに差分があるため、cert_provisioning_typeのCPS_MANAGEDの記載をDEFAULTに合わせる。
cert_provisioning_typeの確認
https://registry.terraform.io/providers/akamai/akamai/latest/docs/resources/property

```
$ sed -i -e "s/CPS_MANAGED/DEFAULT/g" property.tf
```
### 修正2
Importされた際にip_behaviorの項目がnullになっているが、null指定はできないためIPV6_COMPLIANCE(IPv4/IPv6を受け付ける)を指定する。
ip_behaviorの項目確認
https://registry.terraform.io/providers/akamai/akamai/latest/docs/resources/edge_hostname

```
$ sed -i -e "s/\"ip_behavior\": null/\"ip_behavior\": \"IPV6_COMPLIANCE\"/g" terraform.tfstate
```

### 修正3

Importされた際にproduct_idが空となっているが配信プロダクト名に合わせるため、この環境ではprd_Download_Deliveryを追加する。
Product IDの確認
https://registry.terraform.io/providers/akamai/akamai/latest/docs/guides/appendix#common-product-ids

```
$ sed -i -e "s/\"product_id\": \"\"/\"product_id\": \"prd_Download_Delivery\"/g" terraform.tfstate
```


## 再度Planの実施

差分がakamai_property_activationのみになったことを確認します。
以下のコマンド出力の場合、ステージングの環境に適用されているVersionが最新ではないため、apply時に最新のVersionがステージングに適用されます。

```
$ terraform plan
 
 # akamai_property_activation.xxxxxxxxxxxxxxxxx will be created
  + resource "akamai_property_activation" "xxxxxxxxxxxxxxxxx" {
      + activation_id                  = (known after apply)
      + auto_acknowledge_rule_warnings = true
      + 
      + contact                        = [
      +       + contact                        = [
          + "xxxxxxxx@xxxxx.com",
        ]
      + errors                         = (known after apply)
      + id                             = (known after apply)
      + network                        = "STAGING"
```

## おわりに

既存の配信設定をTerraformでコード化する際に1からコードを作成するのではなく、Akamai CLI Terraformを利用することで、配信設定をエクスポートしてTerraformのコード化を行うことができます。
AkamaiのTerraformのコードの記載方法やパラメーターの指定の仕方などをAkamai CLI Terraformが自動で出力したコードの内容を参考にすることもできます。

実際の運用では、さらにコードを追記して機能を増やしたり、コードを再利用して新規の配信設定を作成することこともできますが、そのたたき台づくりを、まずは今回のような手順で簡単に始めることができます。

## 関連記事

https://qiita.com/isss802/items/3bbc3cc208982c96f9e1

https://qiita.com/isss802/items/8201595651f285061e0f