はじめに
Ciscoが提供するCML2をAWSで利用できる方法がやっとわかりました。(以前の記事のリベンジ)
最近MACを新調したのですが、まだ仮想化ソフト(VMware)がApple Siliconに対応していないため、つなぎの策でクラウドにて利用する方法を調べてました。。
GCPを利用したやり方がyoutubeに上がっていたので、AWSでも試してみました。
手順の概要
- ローカルPCの仮想化ソフトにてCMLのインストール
- CML2のセットアップ
- CML2のVMエクスポート
- S3バケットへエクスポートしたファイルのアップロード
- インポート
- EC2にてインスタンス起動
- インスタンスにてCML2のセットアップ
環境
ローカル
PC
- MacBook (Retina, 12-inch, 2017)
- CPU : 1.2 GHz デュアルコアIntel Core m3
- Memory : 8 GB 1867 MHz LPDDR3
仮想化ソフト
- VMware Fusion 12.1.0
CML2
- CML-Personal 2.1.1
AWS(利用サービス)
- EC2
- S3
手順
1.CML2の必要ソフトウェアをダウンロード
新規でインストール可能な、現時点での最新版(2.1.1)を利用
- cml2_p_controller-2.1.1-19.el8.x86_64-134.ova
- refplat_p-20201110-fcs.iso
2.VMware FusionにてCML2のインポート
ファイル>インポートをクリック
「既存の仮想マシンを選択」にて「ファイルを選択」からダウンロードしたovaファイルを選択
ovaファイルを選択した状態で「続ける」をクリック
CD/DVD(IDE)にて「CD/DVDドライブを接続」のチェックボックスをON
CD/DVD(IDE)にて「ディスクまたまディスクイメージを選択」からダウンロードしたISOファイルを選択
設定は以上で完了です。
イメージを起動してください。
3.CMLのセットアップと動作確認
CML2の画面が出てきますので、進みます。操作はタブで移動、エンターで決定。
スペック不足の画面が出たら、
カスタマイズの設定のCPUをRequirements以上にしてください。
CPUは物理的な数を超えて選択してもOKでした。(下記ではメモリが足りてませんが、1デバイスの起動は問題なし。)
管理者アカウントの方です。ここではそのままsysadmin。
パスワード入力へはカーソルキーで移動。
4.CMLへGUIアクセス
先程の画面に表示されていた、access the CML from 〜のURLにアクセスします。
証明書の問題でワーニングでますが、詳細設定から
Ciscoサイトから2.X Licenseをクリックし、
Registration Tokenをコピーします。
DASHBOARDからLabを起動し、ADD NODESにて適当にデバイスを起動してみます。
ここではiosvを選択し、start。無事起動しました。
(画像では2台ありますが、スペックの問題で2台起動しませんでした。泣)
確認は終わったので、次はレジスター登録の解除をします。
解除しないとインスタンスでの利用ができません。
TOOLS>Licensingから
5.エクスポート準備
インスタンスにて利用できるようにエクスポートの準備をしていきます。
再度ターミナルからsshにて管理者アカウントへログインします。
SSH設定
sshの有効化。
$ sudo systemctl start sshd
$ sudo systemctl enable sshd
ターミナルからポート1122を指定してsshログインを試す。
ssh sysadmin@192.168.1.49 -p 1122
スナップショットの保存
念のため、ここまでの状態をスナップショットを取っておくと以降で問題が発生しても
スナップショットを取ったタイミングから再開できるので保存しておく。
(実際に次のcdromの操作で想定外がありました。。)
まずは電源を落とします。
$ poweroff
メニューバーの「仮想マシン」>「スナップショット」>「スナップショットをとる」
保存が完了したら、再度仮想マシンを起動する。
cdromのコピー
管理者アカウントでログインします。
$ cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu Jul 30 07:41:59 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl_cml2--controller-root / xfs defaults 0 0
UUID=91f0f033-41d2-4b6a-a3c6-7c3006381034 /boot ext4 defaults 1 2
/dev/mapper/cl_cml2--controller-swap swap swap defaults 0 0
/dev/sr0 /var/local/virl2/refplat/cdrom iso9660 noauto,fscontext=system_u:object_r:virt_content_t:s0 0 2
ISOを読み込んでいるデバイスをアンマウント。
$ sudo umount /dev/sr0
ディレクトリのコピー。
### cdromディレクトリの存在を確認
$ cd /var/local/virl2/refplat/
$ ls
cdrom diff work
### 既存ディレクトリをコピー
$ sudo cp -avr cdrom/ cdrom2/
### fstabの編集
$ sudo vi /etc/fstab
マウント先をコピーしたディレクトリ名に合わせる。
(最終行のパスをコピー先のcdrom2に変える)
#
# /etc/fstab
# Created by anaconda on Thu Jul 30 07:41:59 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl_cml2--controller-root / xfs defaults 0 0
UUID=91f0f033-41d2-4b6a-a3c6-7c3006381034 /boot ext4 defaults 1 2
/dev/mapper/cl_cml2--controller-swap swap swap defaults 0 0
/dev/sr0 /var/local/virl2/refplat/cdrom2 iso9660 noauto,fscontext=system_u:object_r:virt_content_t:s0 0 2
マウント。
$ sudo mount /dev/sr0
mount: /var/local/virl2/refplat/cdrom2: WARNING: device write-protected, mounted read-only.
コピーしたファイルの確認。
$ cd cdrom2
$ ls
パーミッションエラーでディレクトリにアクセスできない場合は、cdrom2のサイズがcdromより大きいことを確認。
コピー元の確認。
$ cd ..
$ cd cdrom
$ ls
cdromの配下にはファイルがないことを確認。
cdrom2からcdromへコピー
$ cd ..
$ cp -avr cdrom2/* cdrom/
※もし"*"で弾かれたら次のエラーが出た場合を実施してください。
問題なくコマンドが通ったら、コピー完了まで時間がかかりますが待ちます。
コマンドが通った場合は、次のエラーが出た場合のステップは飛ばして、アンマウントを行う
cpコマンドがエラー出た場合
cp -avr cdrom2/* cdrom/
がはじかれた場合、アスタリスクなしで実行。
また、少し手直しが必要なので、下記を実施。
$ cp -avr cdrom2/ cdrom/
ファイルがcdromディレクトリ配下にcdrom2もコピーされていると思うので、
cdrom2は以下のファイルをcdrom直下に移し、cdrom2は削除する。
その際、パーミッションエラーが出た場合は、先に権限を修正する。
$ cd cdrom
$ sudo chmod 755 cdrom2
$ sudo mv cdrom2/* .
$ sudo rmdir cdrom2/
$ ls
node-definitions virl-vase-images
$ cd ..
アンマウント
fstabの確認。マウント先がcdrom2となっている。
$ cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu Jul 30 07:41:59 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl_cml2--controller-root / xfs defaults 0 0
UUID=91f0f033-41d2-4b6a-a3c6-7c3006381034 /boot ext4 defaults 1 2
/dev/mapper/cl_cml2--controller-swap swap swap defaults 0 0
/dev/sr0 /var/local/virl2/refplat/cdrom2 iso9660 noauto,fscontext=system_u:object_r:virt_content_t:s0 0 2
アンマウントし、fstabをコメントアウトする。
$ sudo umount /dev/sr0
$ sudo vi /etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu Jul 30 07:41:59 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl_cml2--controller-root / xfs defaults 0 0
UUID=91f0f033-41d2-4b6a-a3c6-7c3006381034 /boot ext4 defaults 1 2
/dev/mapper/cl_cml2--controller-swap swap swap defaults 0 0
#/dev/sr0 /var/local/virl2/refplat/cdrom2 iso9660 noauto,fscontext=system_u:object_r:virt_content_t:s0 0 2
$ cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu Jul 30 07:41:59 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl_cml2--controller-root / xfs defaults 0 0
UUID=91f0f033-41d2-4b6a-a3c6-7c3006381034 /boot ext4 defaults 1 2
/dev/mapper/cl_cml2--controller-swap swap swap defaults 0 0
#/dev/sr0 /var/local/virl2/refplat/cdrom2 iso9660 noauto,fscontext=system_u:object_r:virt_content_t:s0 0 2
ここまでできたら仮想マシンの電源を落とします。
$ poweroff
CD/DVDドライブの接続解除
電源OFF後、メニューバーの「仮想マシン」>「設定」にてCD/DVDを選択
- CD/DVDドライブを接続のチェックボックスを外す
- ISOファイルも自動検出に戻しておく
6.VMエクスポート
ここまで行った仮想マシンをエクスポートしてください。
ここではVMware Fusionを使っており、エクスポート機能がないため、
ovftoolを別途インストールして使用します。
インストール後、ターミナルからCLIにてエクスポートしていきます。
vmxファイルを指定し、出力先のディレクトリを指定。
# /Applications/VMware\ OVF\ Tool/ovftool --acceptAllEulas ¥
/Users/***/Virtual\ Machines.localized/cml2_p_controller-2.1.1-19.el8.x86_64-134.vmwarevm/cml2_p_controller-2.1.1-19.el8.x86_64-134.vmx ¥
/Users/***/ovf/2.1
Opening VMX source: /Users/***/Virtual Machines.localized/cml2_p_controller-2.1.1-19.el8.x86_64-134.vmwarevm/cml2_p_controller-2.1.1-19.el8.x86_64-134.vmx
Opening OVF target: /Users/***/ovf/2.1
Writing OVF package: /Users/***/ovf/2.1/cml2_p_controller-2.1.1-19.el8.x86_64-134/cml2_p_controller-2.1.1-19.el8.x86_64-134.ovf
Transfer Completed
Completed successfully
7.VMインポート
エクスポートしたファイルをAWSのS3へアップロードします。
参考はAWSから。
S3バケットの作成
S3に移動して、バケットからバケットの作成にて新規のバケットを任意の名前で作成します。
もし既存のバケットがあればそれでもOKです。
インポートするユーザーの作成
インポート用のユーザーを作成します。
ユーザー作成の前にユーザーに当てるポリシーを定義しておきます。
IAMからダッシュボードのアクセス管理>ポリシー>ポリシーの作成を選択します。
JSONのタグを選択し、mys3bucketの箇所は利用するバケット名に変換のうえ、下記をペーストします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:CreateBucket",
"s3:DeleteBucket",
"s3:DeleteObject",
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListBucket",
"s3:PutObject"
],
"Resource": ["arn:aws:s3:::mys3bucket","arn:aws:s3:::mys3bucket/*"]
},
{
"Effect": "Allow",
"Action": [
"ec2:CancelConversionTask",
"ec2:CancelExportTask",
"ec2:CreateImage",
"ec2:CreateInstanceExportTask",
"ec2:CreateTags",
"ec2:DeleteTags",
"ec2:DescribeConversionTasks",
"ec2:DescribeExportTasks",
"ec2:DescribeInstanceAttribute",
"ec2:DescribeInstanceStatus",
"ec2:DescribeInstances",
"ec2:DescribeTags",
"ec2:ImportInstance",
"ec2:ImportVolume",
"ec2:StartInstances",
"ec2:StopInstances",
"ec2:TerminateInstances",
"ec2:ImportImage",
"ec2:ImportSnapshot",
"ec2:DescribeImportImageTasks",
"ec2:DescribeImportSnapshotTasks",
"ec2:CancelImportTask"
],
"Resource": "*"
}
]
}
貼り付け後、pre_vmimportという名前で保存しておきます。
また、AWS CLIからロールを作成するための権限も追加する必要があるので、下記のポリシーも作成します。
名前はRoleOperationとしておきます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "OperationRole",
"Effect": "Allow",
"Action": [
"iam:CreateRole",
"iam:DeleteRole",
"iam:PutRolePolicy"
],
"Resource": "*"
}
]
}
続いてユーザーの新規作成です。
IAMからアクセス管理>ユーザー>ユーザーを追加を選択
今回は名前をvmimporterで作成します。
AWS CLIからのアクセスと作成したポリシーを適用するため、下記のチェックボックスをONにします。
- アクセスの種類>プログラムによるアクセス
- 既存のポリシーを直接アタッチを選択し、pre_vmimportとRoleOperation
上記以外は任意で入力して下さい。
続いてAWS CLIから操作できるように下記をターミナルにて実行します。
$ aws configure --profile vmimporter
AWS Access Key ID [None]:********************
AWS Secret Access Key [None]:********************
Default region name [None]:ap-northeast-1
Default output format [None]:json
※アクセスキーとシークレットアクセスキーはIAMのユーザーの認証情報から確認できます。
問題なければ下記のファイルに記載されます。
❯ cat ~/.aws/credentials
[vmimporter]
aws_access_key_id = *************
aws_secret_access_key = *************
ポリシーの作成
PCにてtrust-policy.jsonを作成し、下記をペーストしてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "vmie.amazonaws.com" },
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals":{
"sts:ExternalId": "vmimport"
}
}
}
]
}
❯ aws iam --profile vmimporter create-role --role-name vmimport --assume-role-policy-document file://trust-policy.json
ロールの作成
PCにてrole-policy.jsonを作成し、下記をペーストしてください。
disk-image-file-bucketの箇所は、使用するバケット名を指定してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::disk-image-file-bucket"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::disk-image-file-bucket/*"
]
},
{
"Effect": "Allow",
"Action":[
"ec2:ModifySnapshotAttribute",
"ec2:CopySnapshot",
"ec2:RegisterImage",
"ec2:Describe*"
],
"Resource": "*"
}
]
}
作成したポリシーをロールに適用します。
aws iam --profile vmimporter put-role-policy --role-name vmimport --policy-name vmimport --policy-document file:///Users/***/.aws/work/role-policy.json
8.VMファイルのアップロード
S3のサービスへ移動し、指定のバケットにドラッグ&ドロップでアップロードします。
念のため出力された3ファイルをアップロードしました。
- cml2_p_controller-2.1.1-19.el8.x86_64-134-disk1.vmdk
- cml2_p_controller-2.1.1-19.el8.x86_64-134.mf
- cml2_p_controller-2.1.1-19.el8.x86_64-134.ovf
9.VMインポート
VMをインポートしてAMIを作成していきます。
S3BucketのところはS3バケット名そのもの、もしくはフルパスを記載してください。
S3keyもAMI化するvmdkのファイル名に合わせてください。
ここではバケット名がcml2-vmimportの場合の例です。
[
{
"Description": "CML2",
"Format": "vmdk",
"UserBucket": {
"S3Bucket": "cml2-vmimport",
"S3Key": "cml2_p_controller-2.1.1-19.el8.x86_64-134-disk1.vmdk"
}
}
]
いよいよインポートです。
上記ファイルのファイルパスは必要に応じて変更してください。
# aws ec2 import-image --profile vmimporter --description "CML2" --disk-containers file:///tmp/containers.json
{
"Description": "CML2",
"ImportTaskId": "import-ami-0b8c23b0907505e04",
"Progress": "1",
"SnapshotDetails": [
{
"Description": "CML2",
"DiskImageSize": 0.0,
"Format": "VMDK",
"UserBucket": {
"S3Bucket": "cml2-vmimport",
"S3Key": "cml2_p_controller-2.1.1-19.el8.x86_64-134-disk1.vmdk"
}
}
],
"Status": "active",
"StatusMessage": "pending"
}
実行後、上記のような出力がありますが、statusがcompletedになれば完了です。
が、黙っていても完了の出力はないので、下記コマンドにて適時状況を確認してください。
import-ami-~の箇所はインポート実行時に出力されたImportTaskIdに合わせてください。
# aws ec2 describe-import-image-tasks --import-task-ids import-ami-0b8c23b0907505e04
{
"ImportImageTasks": [
{
"Architecture": "x86_64",
"Description": "CML2",
"ImportTaskId": "import-ami-0b8c23b0907505e04",
"LicenseType": "BYOL",
"Platform": "Linux",
"Progress": "39",
"SnapshotDetails": [
{
"Description": "CML2",
"DeviceName": "/dev/sda1",
"DiskImageSize": 7250082816.0,
"Format": "VMDK",
"Status": "completed",
"UserBucket": {
"S3Bucket": "cml2-vmimport",
"S3Key": "cml2_p_controller-2.1.1-19.el8.x86_64-134-disk1.vmdk"
}
}
],
"Status": "active",
"StatusMessage": "booting",
"Tags": []
}
]
}
progressが100で完了です。
もしキャンセルしたい場合は下記のコマンドを実施。
ここもimport-ami-~は実際の値に合わせてください。
# aws ec2 cancel-import-task --import-task-id import-ami-fg4z7c9h
AMIの確認
EC2のサービスから、イメージ>AMIをクリックするとリストに表示されているかと思います。
10. ポートの開放
EC2のセキュリティポリシーに下記を追加。
- https:443
- ssh:22
- カスタムTCPルール:1122(ssh用)
接続元が変わる場合は都度IPアドレスの追加も忘れずに。
11.インスタンスの起動
先ほどの画面から、起動するAMIを選択し、起動を選択。
ネストされた仮想化は未サポートのため、ここではベアメタルを選択。
今回は一番料金が安いものを選択しました。
- m5zn.metal
他の項目は普通のインスタンス作成と同様でよく、特に注意点はありません。
起動後、sshにてログインしてみましたが、なぜか管理者アカウントではログインできませんでした。。
❯ ssh -i "aws.pem" sysadmin@ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com
The authenticity of host 'ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com (54.249.99.122)' can't be established.
RSA key fingerprint is SHA256:kkyMjZPyspOrMiq/foFhssXTYkFwofxKN1PTaGZSXSU.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com,54.249.99.122' (RSA) to the list of known hosts.
sysadmin@ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com's password:
Permission denied, please try again.
sysadmin@ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com's password:
Permission denied, please try again.
sysadmin@ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com's password:
sysadmin@ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com: Permission denied (password).
ただしadminの方はログイン可能。
❯ ssh -i "aws.pem" admin@ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com
admin@ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com's password:
****
CML2 Console Server
Copyright (c) 2020 Cisco Systems, Inc. and/or its affiliates
****
tab completion works
list available nodes and node labels / IDs with "list"
it's also possible to do a "open /lab_1/n0/0" command
consoles>
そういえばsshdで1122のポートを追加してたの忘れてました。
1122のポート指定でsshすると、ユーザーアカウントはログイン不可、管理者アカウントはログイン可能でした。
ちょっとよくわからず。。
❯ ssh -i "aws.pem" admin@ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com -p 1122
The authenticity of host '[ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com]:1122 ([54.249.99.122]:1122)' can't be established.
ECDSA key fingerprint is SHA256:xMzSwMObC+Af3rcmyqtAeBonZYJF+iVhjF7aYZYvH4o.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com]:1122,[54.249.99.122]:1122' (ECDSA) to the list of known hosts.
admin@ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com's password:
Permission denied, please try again.
admin@ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com's password:
Permission denied, please try again.
admin@ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com's password:
admin@ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
❯ ssh -i "aws.pem" admin@ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com
admin@ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com's password:
****
CML2 Console Server
Copyright (c) 2020 Cisco Systems, Inc. and/or its affiliates
****
tab completion works
list available nodes and node labels / IDs with "list"
it's also possible to do a "open /lab_1/n0/0" command
consoles>
consoles> exit
Connection to ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com closed.
❯ ssh -i "aws.pem" sysadmin@ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com -p 1122
sysadmin@ec2-54-249-99-122.ap-northeast-1.compute.amazonaws.com's password:
Web console: https://cml2-controller.cml.lab:9090/ or https://172.31.8.160:9090/
Last login: Thu Apr 29 21:56:40 2021 from 172.20.10.2
[sysadmin@cml2-controller ~]$
12.httpsにてログイン
EC2のインスタンスの画面から該当インスタンスのグローバルIPアドレスを確認。
あとは最初にログインした通りにwebブラウザからhttpsアクセスで無事完了です!
ライセンスのレジスター登録したらいじり放題です!
ちなみに管理者アカウントにてssh接続した際に表示される
Web console: https://cml2-controller.cml.lab:9090/ or https://172.31.8.160:9090/
にアクセスするとCentosの方のログインになりますので。(必要がある場合はポートの9090をセキュリティポリシーに追加)
最後に
CMLを購入し、ようやくスペックに縛られない環境ができました。(1ヶ月かかった。。。)
ベアメタルはインスタンスの使用料金が(震えるほど)高いので、時間を有効に使ってください!(と自分に言い聞かせ。。)
楽しんだあとはインスタンスの停止を忘れずに!!
終了ではなく停止を忘れずに!!!ややこしいのですが終了はインスタンス自体の削除になっております。
心配な方は終了保護の有効化を有効にしてください。