Tailscaleで実現するAkamai's cloud computing servicesのマルチリージョン接続

# Akamai's cloud computing servicesのリージョンについて

Akamai's cloud computing servicesのリージョンは世界中に分散しており、執筆時点で14リージョンに展開しています。
リージョンについては拡張していく予定があり、大阪リージョンについての展開計画もあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/7e96d081-4fd0-0c77-546c-9f795cd07110.png)

リージョン間の通信はAkamai Cloud Global Networkを利用して行われますが、一部はインターネット経由となります。
そのため、暗号化して通信を行いたいユースケースがあった際には、以下の記事の方法などでVPN経由にする必要があります。

https://qiita.com/isss802/items/ca30053171d6cb69a295

今回はリージョン間のVPN構築をTailscaleというサービスを利用してフルメッシュのVPNを構築する方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/441f62f4-3007-37c9-fd41-3bcbcc5bdc72.png)

## Tailscaleとは

Tailscaleは、非常に使いやすくセキュアなクラウド型VPNサービスです。Linuxカーネルにも組み込まれている「Wireguard」をベースに設計されており、ユーザーはアカウントを作成し、端末にクライアントプログラムをインストールするだけでVPNを構築することができます。
TailscaleはHub-and-spokeやMesh networkのVPN構成も取ることができ、様々なユースケースにて利用することができます。

https://tailscale.com/blog/how-tailscale-works/

## インスタンスの構築とTailscaleエージェントのインストール

今回はTailscaleを利用してAkamai's cloud computing services全リージョンにインスタンスを構築、フルメッシュVPNを接続する構成となります。
インスタンスの構築はTerraformで行い、TailscaleのエージェントもTerraformでインストールします。Tailscaleはエージェントをインストールするだけで、インストールされたインスタンス同士で自動的にVPNが構築されます。

インスタンスはLinode 32GBで構築しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/0350286c-1957-7184-3891-f04402c6b05e.png)

インストール時にはAuthKeyの設定が必要となるため、管理画面から発行します。
https://login.tailscale.com/admin/settings/keys


```terraform:instance.tf
resource "linode_instance" "vpn" {
  count =  length(var.regions)
  label = "tailscale-multi-${element(var.regions, count.index % length(var.regions))}"
  image = var.vpn.image
  region = element(var.regions, count.index % length(var.regions))
  type = var.vpn.type
  authorized_keys = ["${chomp(file(var.public_ssh_key))}"]

  group = var.vpn.group
  swap_size = 256
  root_pass = random_string.password.result
  private_ip = false

  tags = [ "tailscale" ]

  provisioner "remote-exec" {
    inline = [
      "apt-get update",
      "hostnamectl set-hostname tailscale-multi-${element(var.regions, count.index % length(var.regions))}",
      "curl -fsSL https://tailscale.com/install.sh | sh",
      "tailscale up --authkey ${var.tailscale_auth_key} --hostname=tailscale-multi-${element(var.regions, count.index % length(var.regions))} --ssh",
      "sudo apt-get install -y iperf3"
    ]

    connection {
      type = "ssh"
      user = "root"
      password = random_string.password.result
      host = self.ip_address
    }
  }
}
```

```terraform:variables.tf

variable "tailscale_auth_key" {}

variable "linode_token" {}

variable "node_count" {
  default = 1
}

variable "regions" {
  type    = list(string)
  default = [
    "ap-west",
    "ca-central",
    "ap-southeast",
    "us-iad",
    "us-ord",
    "fr-par",
    "us-central",
    "us-west",
    "us-southeast",
    "us-east",
    "eu-west",
    "ap-south",
    "eu-central",
    "ap-northeast"
  ]
}

variable "vpn" {
  default = {
    image = "linode/ubuntu22.04"
    type = "g6-standard-8"
    group = "vpn"
  }
}

variable "public_ssh_key" {
  default     = "~/.ssh/linode/xxxxxxxxxx.pub"
}

resource "random_string" "password" {
  length = 32
  special = true
  upper = true
  lower = true
  numeric = true
}
```

```terraform:terraform.tf
terraform {
  required_providers {
    linode = {
      source  = "linode/linode"
    }
  }
}

provider "linode" {
  token = "${var.linode_token}"
}
```

設定ファイルの記載が完了したら、TerraformをApplyします。

```
terraform init
terraform apply
```

以上で構築は完了です。

## Tailscaleの接続確認

エージェントをインストールするとVPN用のIPが自動的に割り当てられ、デフォルトでは同じTailscaleのテナント内のインスタンス間のVPNがフルメッシュで接続されています。
管理画面ではエージェントの状況を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/f7d6d21d-6b70-29a4-a330-55bbb8980ca0.png)


各インスタンスにログインし、statusコマンドを利用することで接続先のIPを確認することもできます。

```
~# tailscale status
100.96.140.130 tailscale-multi-ap-northeast tenant-id@ linux -
100.127.131.55 tailscale-multi-ap-south tenant-id@ linux idle, tx 436156580 rx 6863116
100.69.216.38 tailscale-multi-ap-southeast tenant-id@ linux idle, tx 635586188 rx 8568644
100.81.195.92 tailscale-multi-ap-west tenant-id@ linux idle, tx 106984948 rx 1747932
100.112.225.130 tailscale-multi-ca-central tenant-id@ linux idle, tx 160458356 rx 2487868
100.108.43.103 tailscale-multi-eu-central tenant-id@ linux idle, tx 121129796 rx 1940716
100.73.169.5 tailscale-multi-eu-west tenant-id@ linux idle, tx 118070468 rx 1119244
100.97.65.44 tailscale-multi-fr-par tenant-id@ linux idle, tx 121937732 rx 2443308
100.125.106.137 tailscale-multi-us-central tenant-id@ linux idle, tx 226397300 rx 3480700
100.109.2.28 tailscale-multi-us-east tenant-id@ linux idle, tx 183259588 rx 2670812
100.92.189.130 tailscale-multi-us-iad tenant-id@ linux idle, tx 185877188 rx 3139132
100.111.41.138 tailscale-multi-us-ord tenant-id@ linux idle, tx 222174772 rx 3116396
100.75.148.69 tailscale-multi-us-southeast tenant-id@ linux idle, tx 199727540 rx 3287516
100.121.93.101 tailscale-multi-us-west tenant-id@ linux idle, tx 296428020 rx 5450572
```

試しにPingを実行してみると、疎通が取れていることが確認できます。

```
root@tailscale-multi-ap-northeast:~# ping -c 1 100.69.216.38
PING 100.69.216.38 (100.69.216.38) 56(84) bytes of data.
64 bytes from 100.69.216.38: icmp_seq=1 ttl=64 time=100 ms

--- 100.69.216.38 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 100.262/100.262/100.262/0.000 ms
```

このようにTailscaleはインストールするだけで、VPNを簡単に構築することができます。


## 通信速度の測定

TailscaleのVPN経由でTokyoリージョンから各リージョンにPingとiperf3の測定を行いました。

以下はその結果となり、結果の良い順に並べてあります。

現状Tokyoリージョンから一番近く、速度が早いリージョンはMumbaiであることがわかります。

| Label | City | IP | Ping (ms) | Bandwidth (Mbits/sec) |
| --- | --- | --- | --- | --- |
| ap-northeast | Tokyo | 100.96.140.130 | 0.065 ms | 23637 Mbits/sec |
| ap-south | Mumbai | 100.127.131.55 | 76.260 ms | 324 Mbits/sec |
| us-west | San Francisco | 100.121.93.101 | 110.622 ms | 218 Mbits/sec |
| ap-southeast | Singapore | 100.69.216.38 | 109.671 ms | 220 Mbits/sec |
| us-central | Dallas | 100.125.106.137 | 142.021 ms | 166 Mbits/sec |
| us-ord | Chicago | 100.111.41.138 | 143.918 ms | 164 Mbits/sec |
| ap-west | Fremont | 100.81.195.92 | 142.604 ms | 77 Mbits/sec |
| us-southeast | Miami | 100.75.148.69 | 159.697 ms | 147 Mbits/sec |
| us-iad | Washington D.C. | 100.92.189.130 | 168.810 ms | 136 Mbits/sec |
| us-east | Newark | 100.109.2.28 | 172.316 ms | 134 Mbits/sec |
| ca-central | Montreal | 100.112.225.130 | 192.720 ms | 117 Mbits/sec |
| eu-central | Frankfurt | 100.108.43.103 | 245.050 ms | 88 Mbits/sec |
| fr-par | Paris | 100.97.65.44 | 245.196 ms | 88 Mbits/sec |
| eu-west | London | 100.73.169.5 | 247.916 ms | 86 Mbits/sec |

:::note warn
執筆時点での測定結果であり、通信速度を保証するものではありません。
:::

各リージョンともにVPNを利用した接続で、安定した速度がでることがわかりました。

# まとめ

Akamai's cloud computing servicesは複数のリージョンを提供しておりますが、リージョン間の通信をインターネット経由で行う際には暗号化が必要になるケースがあります。
その際に、Tailscaleなどのサービスを利用することで簡単にVPNが構築することができ、安全なリージョン間の通信を実現することができます。


# 関連記事

アカマイ・テクノロジーズ合同会社はQiitaでAkamai's cloud computing services関連など開発者向けの記事を掲載しております。

https://qiita.com/xenbase/items/52e2956a64cedc772bd9