【初心者】AWS Wavelengthを使ってみる

# 目的
- エッジコンピューティングがこれからのトレンドになるかなと思い、まずはAWSのエッジコンピューティングサービスであるWavelengthをいち早く触って、基本概念を理解しておく。

# AWS Wavelength とは（自分の理解）
- AWSが提供するMEC的なサービスで、モバイルキャリア網から低遅延でのアクセスを可能とするサービス。
- 2020/9現在、北米2拠点(Boston, San Francisco Bay Area)のみで提供されている。

# やったこと
- Wavelength Zone(今回はSan Francisco Bay Area)にて基本構成を確認する。
    - Wavelength Zone内にSubnet、EC2インスタンスを作成する。
    - Carrier Gateway(外部との接続口)を作成し、外部からEC2インスタンスへCarrier Gateway経由でアクセスする。

# 構成図
- 設定手順

![構成図01a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/12ab1674-34c9-f8ba-5405-365f50d77583.png)


- アクセス経路

![構成図02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/c73d8ad0-434f-4f35-5c79-8bf47f1a64fc.png)



- Wavelengthサービスにおける新規要素は以下の通り。
    - **Carrier Gateway(CAGW):** Wavelength内のEC2インスタンスを外部(キャリア網、インターネット)と接続するためのゲートウェイ。従来のリージョンサービスのInternet Gatewayに相当する。
    - **Carrier IP(CIP):** Wavelength内のEC2インスタンス(ENI)に関連付けを行い、インスタンスと外部との間の疎通を可能にするIPアドレス。従来のリージョンサービスのElastic IPに相当する。EIP同様、グローバルIPアドレスだが、インターネットとの疎通には制約がある。なお用語の定義としては以下のようになる様子。
        - 従来のElastic IP(Internet Gatewayを経由しての外部接続用のIP)はPublic IPと呼ぶ
        - Carrier IPとPublic IPの両方をElastic IPと呼ぶ
    

# 作業手順
## 利用申請
- 2020/9現在、利用には事前申請及びAWSからの承認が必要。以下のフォームにて利用目的、AWSアカウント等を入力して申請する。
    - [「Request Access to AWS Wavelength Zones」](https://pages.awscloud.com/wavelength-signup-form.html)

## 基本環境構築
### 1. 事前準備(VPC/Subnetの作成)
- 構成図の通り、以下のVPC/Subnetを作成する。
    - VPC: 10.0.0.0/16
    - Subnet(Public): 10.0.1.0/24
    - 踏み台用/内部接続用のEC2インスタンス(Public Subnetに作成)
- VPCはWavelength(San Francisco Bay Area) の親リージョンであるオレゴンリージョン(us-west-2)に作成する。

### 2. Wavelength Zone内にSubnetを作成
-  Subnetの作成画面にて、AZの選択肢からWavelength Zone「us-west-2-wl1-sfo-wlz-1」を選択し、Subnet(Wavelength)を作成する。

![wl02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/b89cb64d-5a96-75d8-e6f7-f024ba38d995.png)

### 3. Carrier Gateway 作成及びルーティング設定
- 「VPC - キャリアゲートウェイ - キャリアゲートウェイの作成」にて、Carrier Gatewayを作成する。以下の内容の設定を行う。
    - Carrier Gatewayの名前 (mksamba-cagw)
    - Carrier GatewayをアタッチするVPC (上記1.で作成したVPC)
    - Carrier Gatewayへのルートを作成するsubnet(上記2.で作成したSubnet)

![wl03a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/45223e52-0108-8670-ba1a-cd894cdb9be5.png)

- 上記設定にて「キャリアゲートウェイを作成」のボタンを押すと、Carrier Gatewayが作成される。それに加えて、デフォルトルートがCarrier Gatewayに設定されたRoute Table が作成され、Subnetに関連付けが行われる。該当のRoute Tableの設定内容は以下の通り。デフォルトルート(0.0.0.0/0)の宛先がCarrier Gatewayになっている。

![wl04a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/7161d6cd-730c-b7df-195b-06e2acde410a.png)

### 4. Wavelength Zone内にEC2インスタンスを作成
- インスタンスの作成画面にて、Wavelength Zone内のSubnetを指定してインスタンスを作成する。

![wl05a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/b39f40a1-4abb-9968-366c-1ba17929470c.png)

### 5. Carrier IPの取得とインスタンスへの関連付け
- 「VPC - Elastic IPアドレス - Elastic IPアドレスの割り当て」にて、ネットワークボーダーグループに「us-west-2-wl1-sfo-wlz-1」を指定し、割り当てを実行する(ネットワークボーダーグループの指定により、従来のEIPを取得するのか、Wavelength用のCIPを取得するのかを選択可能)。
    - ネットワークボーダーグループに「us-west-2」を選択：　オレゴンリージョンの通常のEIP(Public IP)
    - ネットワークボーダーグループに「us-west-2-wl1-sfo-wlz-1」を選択：　WavelengthのCIP ⇒ **こちらを選択**

![wl06a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/3f00e47b-6849-5a7e-866c-b52f7f825b5a.png)

- 「VPC - Elastic IPアドレス - Elastic IPアドレスの関連付け」にて、取得したCarrier IPをインスタンスに関連付けする。

![wl07a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/efad8cac-9190-6677-988f-d4f496a43639.png)



## 疎通確認
### 注意事項
- 公式ドキュメントの[「Wavelength considerations and quotas」](https://docs.aws.amazon.com/wavelength/latest/developerguide/wavelength-quotas.html)にて、以下の注意事項がある。

> Networking considerations
> The following controls are enabled by the carrier gateway for Internet flows by default and cannot be removed:
> - TCP is allowed for outbound and response
> - UDP is denied
> - ICMP is allowed
> In addition, inbound routing from the carrier network is optimized for devices in the location of the Wavelength Zone. For example, a Wavelength Zone in the San Francisco Bay area allows low latency access only from devices that are in that metro area and carrier network. Other metro areas and other carriers are not able to access the Wavelength Zone. 

- まとめると、許可されている通信は以下の通り。（以下はWavelengthサービスとしての制限であり、別途SecurityGroup等で追加の制限を行う）

|SRC|DST|Protocol|Action|
|:---|:---|:---|:---|
|同一VPC内|Wavelength内のインスタンス|Any|Allow|
|Wavelength内のインスタンス|同一VPC内|Any|Allow|
|キャリア(Verizon)網|Wavelength内のインスタンス|Any|Allow|
|Wavelength内のインスタンス|キャリア(Verizon)網|Any|Allow|
|インターネット|Wavelengthのインスタンス|icmp|Allow|
|Wavelengthのインスタンス|インターネット|icmp,tcp|Allow|


- 今回はキャリア網(米国のVerizon網)からのアクセス手段は用意できず、Wavelengthのインスタンスには日本からのインターネット経由でのアクセスとなり、Carrier Gateway経由でのアクセスはicmpでしか確認することができない。

### VPC内(リージョン側Subnet) からの疎通確認
- オレゴンリージョンのSubnet(Public)内のインスタンスから、Wavelength内のインスタンスへpingやsshが可能。

``` 
# Public SubnetのインスタンスからWavelength内のインスタンスへssh
[ec2-user@ip-10-0-1-204 ~]$ ssh ec2-user@10.0.0.111 -i oregon.key
Last login: Mon Sep 14 15:21:06 2020 from 10.0.1.204
       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|
https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-10-0-0-111 ~]$
```

### インターネットへの疎通確認

- Wavelength内のインスタンスから、インターネット上のサーバへpingやhttpアクセスが可能。

```
# Wavelength内のインスタンスから阿部寛ホームページにhttpアクセス
[ec2-user@ip-10-0-0-111 ~]$ curl http://abehiroshi.la.coocan.jp/
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
～中略～
</html>
[ec2-user@ip-10-0-0-111 ~]$
```

### インターネットからの疎通確認

- 自宅PC(日本)からWavelength内のインスタンスへはpingのみ可能。(インターネットからのアクセスはicmpのみ許可となっておりssh等は不可)

```
c:\work>ping 155.x.x.x
155.x.x.x に ping を送信しています 32 バイトのデータ:
155.x.x.x からの応答: バイト数 =32 時間 =132ms TTL=238
155.x.x.x からの応答: バイト数 =32 時間 =132ms TTL=238
155.x.x.x からの応答: バイト数 =32 時間 =134ms TTL=238
155.x.x.x からの応答: バイト数 =32 時間 =132ms TTL=238
155.x.x.x の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 132ms、最大 = 134ms、平均 = 132ms
```

# 所感
- 基本的な構成は確認できたため、リージョンサービスとの連携、コンテナ系サービスとの組み合わせ利用等、引き続き検証していきたい。