Cisco SD-WAN IPv6 AWS Controller Deployment

# 更新内容
2022年9月追記
Cisco SD-WANコントローラのバージョン20.5以降では、Cloud-Initのファイルフォーマットが変更となり、Yamlフォーマットを利用する必要があります。旧Cloud-Initのフォーマットのままだとファイルが読み込みされず、初期状態でインスタンスが起動しますので、AWSコンソールなどから初期セットアップを行う必要がありますのでご注意ください。

コントローラのスナップショットはvhdファイルからの作成も可能ですが、CiscoTAC経由でご利用のAWSアカウントに対してシェアすることも可能となりました。詳細は以下のURLをご参照ください。
https://www.cisco.com/c/en/us/td/docs/routers/sdwan/configuration/sdwan-xe-gs-book/controller-aws.html

# はじめに
<!-- 発端や概要を記載 -->
日本のインターネット回線はサービスの仕様からルータのWAN側にIPv6アドレスのみをサポートするものがあります。今回はIPv6に対応したCiscoSD-WANのテスト環境をTerraformを使って構築する手順について解説します。

<a id="#1"></a>
#1. SoftwareDownloadとアップロード
[SD-WANソフトダウンロードリンク](https://software.cisco.com/download/home/286320995/type)

- CiscoソフトウェアダウンロードサイトからSD-WANコントローラ各種のソフトウェアをダウンロードします。
対象のソフトウェアはVHDを選択してください。

例）
　vbond: viptela-edge-20.3.2-genericx86-64_vhd.tar.gz
　vsmart: viptela-smart-20.3.2-genericx86-64_vhd.tar.gz
　vmanage: viptela-vmanage-20.3.2-genericx86-64_vhd.tar.gz

- TAR.GZファイル３つを解凍します。解凍するとファイル名が変化します。ファイルサイズが11GBと22GBと大きいので注意。
例）
　vbond: viptela-edge-genericx86-64.vhd
　vsmart: viptela-smart-genericx86-64.vhd
　vmanage: viptela-vmanage-genericx86-64.vhd

- AWS-CLIで上記３つのVHDファイルをS3にアップロードしてください。*S3のバケット名はご利用の物を

```python
aws s3 cp viptela-edge-genericx86-64.vhd s3://<bucket-name>/viptela-edge-genericx86-64.vhd
aws s3 cp viptela-smart-genericx86-64.vhd s3://<bucket-name>/viptela-smart-genericx86-64.vhd
aws s3 cp viptela-vmanage-genericx86-64.vhd s3://<bucket-name>/viptela-vmanage-genericx86-64.vhd
```

<a id="#2"></a>
#2. AWS AMI作成

- 先ほどアップロードした３つのファイルをSnapshotにします。

Snapshot作成用のJSONファイルの作成

```python
cat <<EOF > /var/tmp/containers1.json
{
  "Description": "vbond 20.3.2 VHD",
  "Format": "VHD",
  "UserBucket": {
      "S3Bucket": "<bucket-name>",
      "S3Key": "viptela-edge-genericx86-64.vhd"
  }
}
EOF

cat <<EOF > /var/tmp/containers2.json
{
  "Description": "vsmart 20.3.2 VHD",
  "Format": "VHD",
  "UserBucket": {
      "S3Bucket": "<bucket-name>",
      "S3Key": "viptela-smart-genericx86-64.vhd"
  }
}
EOF

cat <<EOF > /var/tmp/containers3.json
{
  "Description": "vmanage 20.3.2 VHD",
  "Format": "VHD",
  "UserBucket": {
      "S3Bucket": "<bucket-name>",
      "S3Key": "viptela-vmanage-genericx86-64.vhd"
  }
}
EOF
```

Snapshot作成コマンド

```
aws ec2 import-snapshot --description "vbond 20.3.2 VHD" --disk-container file:///var/tmp/containers1.json
aws ec2 import-snapshot --description "vsmart 20.3.2 VHD" --disk-container file:///var/tmp/containers2.json
aws ec2 import-snapshot --description "vmanage 20.3.2 VHD" --disk-container file:///var/tmp/containers3.json
```

- AWS ConsoleのEC2に移動して作成したSnapshotから個人所有のAMIを作成します。
![スクリーンショット 2020-12-09 9.58.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/4ca68d1c-1dfb-fd1b-b48f-dd5bc6305ef5.png)

![スクリーンショット 2020-12-09 10.01.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/8e1ebb2d-1d4a-c086-b535-86dd38b7cd64.png)

- 作成済みのAMIのIDをメモしておきましょう。
![スクリーンショット 2020-12-09 10.04.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/67074532-5931-d120-ab9c-68c9ebdd2938.png)

- AWSのAMI作成は記載した方法とは別に、一般的なimport-imageコマンドでの作成手法がありますが、
これだとOSの制限がありますので無理でした。

```
KaptopPC$ aws ec2 describe-import-image-tasks
USERBUCKET      <bucket-name>     viptela-smart-genericx86-64.vhd
IMPORTIMAGETASKS        vbond200302     import-ami-01b9cxxxxxxxx    BYOL    deleted ClientError: Unknown OS / Missing OS files.
```

<a id="#3"></a>
#3. Terraformの事前準備
**今回はローカルTerraformでのオペレーションを想定して解説し、オリジナルと差分がある部分をピックアップして記載します。**

- [Githubリンク](https://github.com/CiscoDevNet/terraform-sdwan)
CiscoDevNetサイトからterraform-sdwanをGitCloneします。

- ディレクトリ丸ごとTerraformの作業ディレクトリ(~/terraform/terraform-sdwan/)にコピーしTFファイルをそれぞれ環境に合わせて修正します。

- ~/terraform/terraform-sdwan/Provision_Instances/my_instances_variables.auto.tfvars.json　前の章で作成した各AMIのIDに修正しインスタンスタイプはお好みの物を。

```python
{
    "vbond_instances_type": "c4.large",
    "vsmart_instances_type": "c4.large",
    "vmanage_instances_type": "c4.4xlarge",
    "vbond_ami": "ami-07acxxxxxxxxxxxxx", 
    "vsmart_ami": "ami-0935xxxxxxxxxxxxx",
    "vmanage_ami": "ami-0f89xxxxxxxxxxxxx",
    "vbond_count": "1",
    "vmanage_count": "1",
    "vsmart_count": "1"
}
```

- ~/terraform/terraform-sdwan/Provision_VPC/aws.tf と　~/terraform/terraform-sdwan/Provision_Instances/aws.tf の両方でProfileをDefaultに変更、Regionはお好みで今回は東京。

```python
provider "aws" {
  shared_credentials_file = "~/.aws/credentials"
  profile                 = "default"
  region                  = "ap-northeast-1"
}
```

- ~/terraform/terraform-sdwan/Provision_Instances/vbond/vbond.tf
バージョン20.x.x以降のvbondのインスタンスは、起動後のログインにSSH-KEYが必要となります。
インスタンス作成のTFファイルに以下（key_nameのみ）を追記します。
**AWSコンソールのEC2からVBOND用のKey pairsを作成しておいてください。**

```python
resource "aws_instance" "vbond" {
  key_name                    = "vbondkey"
  }
```

- ~/terraform/terraform-sdwan/Provision_Instances/cloud-init/各種
vbond/vsmart/vmanageの起動Configがここに格納されています。
ログインユーザとパスワードは初期状態だとadmin/adminになっているので注意。

- 余談ですが、個人用のGithubにディレクトリをアップロードして、Terraformと連携させ、WebUIからやる方法の方が個人的にはお勧めです。
![スクリーンショット 2020-12-09 23.44.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/071536bd-1c14-a83a-e0fc-d22e1f4c7a56.png)

- これも余談ですが、GithubDesktopとAtomエディタでの差分管理もできるので便利。
![スクリーンショット 2020-12-10 10.00.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/4d90696a-2aa0-bf1f-2309-0bcd87afcd2f.png)


<a id="#4"></a>
#4. VPC作成
- 早速terraformでVPCの作成をします。
- $を含む変数がTF旧バージョン形式なのでワーニングが出ますが無視しても大丈夫。

```python
cd ~/terraform/terraform-sdwan/Provision_VPC
terraform init
terraform plan
terraform apply
```
- 作成されたVPCに対してIPv6を有効にします。（今回は見た目がよいのでWebコンソールを表示）
![スクリーンショット 2020-12-09 12.48.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/7bdadbb0-7fda-2900-0dc3-d9d4f4a28a64.png)
![スクリーンショット 2020-12-09 12.48.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/2a4b7a05-96e4-c071-1d94-7261bebae737.png)

<a id="#5"></a>
#5. Instance作成
-  次にインスタンスを作成します。

```python
cd ~/terraform/terraform-sdwan/Provision_Instances
terraform init
terraform plan
terraform apply
```

<a id="#6"></a>
#6. ログインから各種設定
- インスタンスが起動してきたらプライマリのIPv4アドレスに対してSSHをします。

vbondインスタンスはssh-keyが必要なのでSSHコマンドが地味に違うので注意してください。

```python
ssh -i ~/vbondkey.pem admin@<vbond-ipv4-address>
ssh admin@<smart-ipv4-address>
ssh admin@<vmanage-ipv4-address>
```
vmanageにログインするとボリュームが見つからないから電源切るねのメッセージがでてきますが、気にしないでそのままエンターしてPoweroffしてください。

- vManageの追加EBSボリューム

AWSコンソールのEC2のVolumeからvManageの追加ボリュームを作成、作成したボリュームをvmanageインスタンスにアタッチします。直感的に/dev/sd **b** を使うべきに感じますが、Bをつかって起動すると、謎に起動時にボリュームを認識しないです。下のスクショのAWSのNoteに記載の通り、/dev/sd **f**などのf-pの間を使ってください。アタッチしたのちに再度vmanageのインスタンスを起動します。
![スクリーンショット 2020-12-09 13.04.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/96a25015-a08d-640e-e2ea-2163c658fb1f.png)

- 全てのコントローラインスタンスにログインできましたでしょうか。CLIでVPN0のインタフェースにIPv6-DHCPクライアントの設定を入れること、またDNSサーバの指定などができていることを確認してください。

- 各種コントローラにsystem設定を行なっていきます。system-ipやorganization-name,vbondなどの設定は次の章で行う設定値にも関連します。

- 順番が前後しますが、事前にcloud-initファイルに必要項目を入力しておくと手間がいっそう少なくなります。

コントローラの構築及びIPv6接続に必要な設定をここでピックアップしておきます。
VBOND-FQDNはドメインを持っている場合はそれを、持っていない、テストの際はIPアドレスでも構いません。

```
system
 host-name             <hostname>
 system-ip             <system-ip>
 site-id               1000
 sp-organization-name  <organization-name>
 organization-name     <organization-name>
 vbond <vbond-fqdn> #vbond local vbond-onlyとかをVbondは入れる
  !
vpn 0
 dns 8.8.8.8 primary
 dns 2001:4860:4860::8888 primary
 interface eth1
  ip dhcp-client
  ipv6 dhcp-client
```

- AWSコンソール画面のNetworkInterfaceから各コントローラの**VPN0**に相当するインタフェースにIPv6のアドレスをアサインします。
![スクリーンショット 2020-12-09 13.40.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/36505595-91be-66b7-f882-a33fb63829d8.png)

- SSH-CLIでコントローラにログインしてIPv6のリーチャビリティを確認してください。デフォゲのIPv6ネイバーはリンクローカルっぽいアドレスが表示されますがそれでOK.

```python
vBond# show ipv6 routes
Codes Proto-sub-type:
  IA -> ospf-intra-area, IE -> ospf-inter-area,
  E1 -> ospf-external1, E2 -> ospf-external2,
  N1 -> ospf-nssa-external1, N2 -> ospf-nssa-external2,
  e -> bgp-external, i -> bgp-internal
Codes Status flags:
  F -> fib, S -> selected, I -> inactive,
  B -> blackhole, R -> recursive, L -> import

                                            PROTOCOL  NEXTHOP     NEXTHOP          NEXTHOP
VPN    PREFIX              PROTOCOL         SUB TYPE  IF NAME     ADDR             VPN      TLOC IP          COLOR            ENCAP  STATUS
---------------------------------------------------------------------------------------------------------------------------------------------
0      ::/0                static           -         ge0/0       fe80::40c:bfff:fe07:aa7e-        -                -                -      F,S
0      2406:da14:4a8:1d00::/64connected        -         ge0/0       -                -        -                -                -      F,S
512    fcff::/120          connected        -         loop0.2     -                -        -                -                -      F,S

vBond#
vBond# ping 2001:4860:4860::8888
Ping in VPN 0
PING 2001:4860:4860::8888(2001:4860:4860::8888) 56 data bytes
64 bytes from 2001:4860:4860::8888: icmp_seq=2 ttl=105 time=15.3 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=3 ttl=105 time=16.3 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=4 ttl=105 time=17.3 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=5 ttl=105 time=20.3 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=6 ttl=105 time=22.4 ms
^C
--- 2001:4860:4860::8888 ping statistics ---
6 packets transmitted, 5 received, 16% packet loss, time 5005ms
rtt min/avg/max/mdev = 15.309/18.362/22.454/2.653 ms
vBond#

```

<a id="#7"></a>
#7. CiscoPnPポータルでVA及びコントローラプロファイルを作成
https://software.cisco.com/

- Cisco Software Centralにログインして画面下部のAdministrationの項目のManage Smart Accountをクリックします。
![スクリーンショット 2020-12-09 8.34.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/3bc2e988-88df-83fa-8455-e2bae7246eaf.png)

- Create Virtual Account（VA)のボタンをクリックします。
![スクリーンショット 2020-12-09 8.38.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/d5b1a7f2-a934-0e43-e727-3540b3fa0dbe.png)

- VAの基本情報を以下のように設定します。 *Nameなどの項目は任意の値
![スクリーンショット 2020-12-09 8.40.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/ef38047c-09aa-df10-dadf-72c371f1e2dc.png)

- VAのユーザやユーザグループの指定の画面に遷移しますが特に指定せず画面最下部のNext。最終確認の画面に遷移したら画面最下部のCreate Virtual Accountボタンをクリックします。（メールアドレスが表示されているのでスクショなし）

- トップ画面に戻ってPlug and Play Connectをクリックします。

- VAを検索してクリックします。
![スクリーンショット 2020-12-09 8.50.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/a23af86b-4720-c68a-2e5d-e62291bea980.png)

- Networkのタブをクリックして任意の組織名(Organization-nameに相当する）を入力します。
![スクリーンショット 2020-12-09 8.52.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/4b7e9d8a-9af7-30bf-15f6-e24287c0a91e.png)

- Controller ProfilesタブをクリックしてAdd Profileをクリック
![スクリーンショット 2020-12-09 8.58.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/7678f47c-f53b-deea-5cc7-a24663af634e.png)

- TypeをVBONDを指定してNext
![スクリーンショット 2020-12-09 8.59.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/c4ac7381-ced9-1f26-685c-a430ddf46a5b.png)

- 以下のように各種パラメータを入力します。Primay Controllerの項目はVBONDのFQDN（IPv4AレコードとIPv6AAAAレコードに対応させる）を入力してください。
![スクリーンショット 2020-12-09 9.00.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/46a386eb-8cc7-17a2-04d9-98018e63c209.png)

- Devicesタブに移動して利用するデバイスを登録してください。（今回は全部仮想ルータとしている）
![スクリーンショット 2020-12-09 9.06.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/1ef7e843-361b-1f26-57fb-7ed0146afd67.png)

<a id="#8"></a>
#8. コントローラ用証明書作成

- vManageの管理画面にアクセスして作成したコントローラ間登録をしていきます。

- vManageのAdministration > SettingsからController CertificateをManualに設定。

- Configuration > DeviceからControllerをクリックします。

- vbondの登録にはデフォルトのadmin/adminが使用できません（SSH-KEYが必要なため）、SSHCLIでログイン用の別のNETADMIN権限のユーザを作っておくことをお勧めします。

- Configuration > CertificateからControllerに移動して全コントローラのCSRをダウンロードします。

- PnPポータルに戻りCertificateタブのGenerate Certificateから先ほど作成したCSRをアップロード、サイン、ダウンロードします。
![スクリーンショット 2020-12-09 13.27.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/2d3c8eaf-b786-5f42-8aea-72e9568c13ec.png)

- Configuration > Certificateに戻りInstall Certificateからダウンロードした証明書をインストールします。
![スクリーンショット 2020-12-09 13.32.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/1f2fb93e-007c-64df-36ba-58407f5d8a2e.png)

- なお、VBONDだけはこのGUIからの証明書インストールどうしてもできなかったので、SSH-SCPでコマンドラインで行いました。

```
scp -i ./vbondkey.pem admin@<vbond-ip>/home/admin/vbond.crt
ssh -i ./vbondkey.pem admin@<vbond-ip>
vbond#request certificate install /home/admin/vbond.crt
```
---
<a id="#9"></a>
#9. IPv6のみで繋げてみた

- 手元のルータインスタンスをIPv6オンリーの環境で起動して今回のコントローラと接続します。
- WAN側インタフェースにIPv4アドレスが無い状態でIPv6アドレスでの接続に自動的に切り替わります。

![スクリーンショット 2020-12-09 13.48.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/f6f90d43-b801-08f6-a448-3defb99ae7d0.png)

<a id="#10"></a>
#10. 参考文献
- [Github-CiscoDevnet](https://github.com/CiscoDevNet)
- [AWS-CLIインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)
- [Terraformインストール](https://learn.hashicorp.com/tutorials/terraform/install-cli)
- [SD-WANコントローラ構築手順](https://www.cisco.com/c/en/us/td/docs/routers/sdwan/configuration/sdwan-xe-gs-book/cisco-sd-wan-overlay-network-bringup.html)

# おわりに
IPv6対応のコントローラを利用すると、IPoEなどのIPv6のみの回線でもルータは自動的にIPv6アドレスを取得し、VBONDのFQDNのDNS登録が行われていれば、ゼロタッチでのコントローラ接続ができるようになります。
Ciscoクラウドによる正式サポートの体制を順次整えている状況です。来年度には社内体制をアップデート、みなさまへウェビナーや説明会等でご報告できると思います。

SD-WAN絡みの投稿もつくった
https://qiita.com/KoheiYamashita1/items/df798022b2697464e2d8

アドベントカレンダーのトップページはこちら
https://qiita.com/advent-calendar/2020/cisco
https://qiita.com/advent-calendar/2020/cisco2