Oracle Cloud 仮想インスタンスを cli で作成してInternetからSSHアクセス

# はじめに

Oracle Cloud の勉強の一環で、公式のチュートリアルを基に進めていきます。公式のチュートリアルでは日本語、かつ、GUI操作の内容となっています。わかりやすく書かれているので、基本は[こちら](https://community.oracle.com/docs/DOC-1019313)を参照していただけるとよいと思います。

このQiitaの記事は、上記のチュートリアルを CLI であえて実施した備忘録として書きます。
CLI の理由は、GUIと比べて再現性や再実行性が高いのと、**なんとなくかっこいいから**



# 今回のテーマ

Instance を作成
https://community.oracle.com/docs/DOC-1019204



# 前提作業

## oci cliの導入

oci cli と jq コマンドを使用可能なこと。次のQiita記事で導入した手順を書いています
https://qiita.com/sugimount/items/63a8cfe1163030ae8804



## 公開鍵/秘密鍵の作成

Instance接続用に公開鍵/秘密鍵を作成します。

keyの種類はRSDで、鍵長は2048bit で作成します (Default)

```
ssh-keygen -b 2048 -t rsa
```



`~/.ssh` に公開鍵/秘密鍵が作成されたことを確認します。

```
> ls -la ~/.ssh
total 4
drwx------ 1 sugi sugi  512 Feb  2 22:35 ./
drwxr-xr-x 1 sugi sugi  512 Feb  2 22:24 ../
-rw------- 1 sugi sugi 1675 Feb  2 22:35 id_rsa
-rw-r--r-- 1 sugi sugi  394 Feb  2 22:35 id_rsa.pub
```





# Instanceの作成

oci コマンドでInstanceを作成する前に、[前回](https://qiita.com/sugimount/items/8d077f785a8fe1dc7971)作成したVCNの OICD を変数に格納します。

```
set vcn_ocid (oci network vcn list | jq -r '.data | map(select(.["display-name"] == "TutorialVCN"))[].id')
```



subnet の OCID も変数に格納します

```
set subnet1_ocid (oci network subnet list --vcn-id $vcn_ocid | jq -r '.data | map(select(.["display-name"] == "tutorial_subnet1"))[].id')
```



次に、作成するInstanceのImageの OCID を取得します。以下のコマンドで、Oracle Linux  7.6 の Image 一覧の中から、最も最近に作成されたImageのOCIDを変数に格納します。
oci compute image list コマンドを実行した結果を目視で確認して、`GPU` という文字が含まれていないものの中から選択します

```
oci compute image list --sort-by TIMECREATED --sort-order DESC | jq -r '.data | map(select( .["operating-system"] == "Oracle Linux" and .["operating-system-version"] == "7.6"))'
set oraclelinux76_ocid (echo ocid1.image.oc1.iad.aaaaaaaawufnve5jxze4xf7orejupw5iq3pms6cuadzjc7klojix6vmk42va)
```

memo ocid取得コマンド

```
oci compute image list --operating-system "Canonical Ubuntu" --operating-system-version "18.04 Minimal" --sort-by TIMECREATED --sort-order DESC | jq -r ".data[0].id"
```


Instanceを作成します。hostnameにアンダーバーは付与できないので、アンダーバーから、ハイフンに変更しています
混乱しやすい一部のパラメータの説明を書きます
`--assign-public-ip` これを true にすると、作成したInstanceに紐づく VNIC に Public IP (Internet からアクセス可能なグローバルIP) が付与されます。
ただ、これは Ephemeral Public IP となるため、Reserved Public IP を付与したい場合は別の方法で設定する必要があります。
今回は、Reserved Public IP を使用したいため、false としてインスタンスを作成します。

``` 
oci compute instance launch \
--availability-domain AJtg:US-ASHBURN-AD-1 \
--fault-domain FAULT-DOMAIN-1 \
--shape VM.Standard2.1 \
--display-name ins_oralinux_1 \
--hostname-label ins-oralinux-1 \
--image-id $oraclelinux76_ocid \
--subnet-id $subnet1_ocid \
--assign-public-ip false \
--private-ip 172.16.1.2 \
--ssh-authorized-keys-file ~/.ssh/id_rsa.pub
```



作成したinstance の OCID を取得します

```
set instance1_ocid (oci compute instance list --display-name ins_oralinux_1 --lifecycle-state RUNNING | jq -r '.data[0].id')
```



memo instance の削除

```
oci compute instance terminate --instance-id $instance1_ocid --force
```



# Reserved Public IP の作成

まずは、作成したInstanceのVNIC OCID を取得し変数へ格納します

```
set instance1_vnic_ocid (oci compute instance list-vnics --instance-id $instance1_ocid | jq -r '.data[0].id')
```



VNIC に付与されている Private IP の OCID を取得し変数へ格納します

```
set instance1_privateip_ocid (oci network private-ip list --vnic-id $instance1_vnic_ocid | jq -r '.data[0].id')
```



Reserved Public IP の作成

```
oci network public-ip create --lifetime RESERVED --display-name tutorial_pubip1 --private-ip-id $instance1_privateip_ocid
```



作成した Reserved Public IP のOCID を変数に格納します

```
set publicip_ocid (oci network public-ip list --scope REGION | jq -r '.data | map(select(.["display-name"] == "tutorial_pubip1"))[0].id')
```







# SSHでアクセス

作成したインスタンスに付与されている Public IP 宛にアクセスを行います

```
ssh -i ~/id_rsa opc@129.213.70.149
```



実行例

```
> ssh -i ~/.ssh/id_rsa opc@129.213.70.149
[opc@ins-oralinux-1 ~]$
```



# Instanceの諸々を確認してみた

Oracle Linux を始めて触るため、諸々を確認します
Linuxのバージョン確認

```
[opc@ins-oralinux-1 ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.6 (Maipo)
```



Interfaceの確認。もちろん Public IP は付与されていなく、Private IP が見えています

```
[opc@ins-oralinux-1 ~]$ ip -d a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
    link/ether 02:00:17:02:d0:81 brd ff:ff:ff:ff:ff:ff promiscuity 0 numtxqueues 4 numrxqueues 4 gso_max_size 65536 gso_max_segs 65535
    inet 172.16.1.2/24 brd 172.16.1.255 scope global dynamic ens3
       valid_lft 81426sec preferred_lft 81426sec
```



Routing Table の確認。

- Default Routeは、172.16.1.1
- 仕様で書かれている通り、`169.254.0.0/16` あての通信はStaticRouteが設定されている

```
[opc@ins-oralinux-1 ~]$ ip r
default via 172.16.1.1 dev ens3
169.254.0.0/16 dev ens3 proto static scope link
169.254.0.0/16 dev ens3 scope link metric 1002
172.16.1.0/24 dev ens3 proto kernel scope link src 172.16.1.2
```



Mountの確認


```
[opc@ins-oralinux-1 ~]$ df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  7.2G     0  7.2G   0% /dev
tmpfs          tmpfs     7.3G     0  7.3G   0% /dev/shm
tmpfs          tmpfs     7.3G  8.6M  7.3G   1% /run
tmpfs          tmpfs     7.3G     0  7.3G   0% /sys/fs/cgroup
/dev/sda3      xfs        39G  2.1G   37G   6% /
/dev/sda1      vfat      200M  9.6M  191M   5% /boot/efi
tmpfs          tmpfs     1.5G     0  1.5G   0% /run/user/1000
```



CPUの確認

Linux からは、CPUが2個見えています。 InstanceのShapeは、VM.Standard2.1を選んでいて、これはOCPU(Oracle Compute Units) が1なので、Instanceには1個の物理CPUコアを割り当てており、Hyper-threading 後の2個の論理CPUとして見えています。

```
[opc@ins-oralinux-1 ~]$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel(R) Xeon(R) Platinum 8167M CPU @ 2.00GHz
stepping        : 4
microcode       : 0x1
cpu MHz         : 1995.309
cache size      : 16384 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2
x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti ssbd ibrs ibpb tpr_shadow vnmi flexpriority ept fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f rdseed adx smap avx512cd xsaveopt xsavec xgetbv1 xsaves arat
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf
bogomips        : 3990.61
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel(R) Xeon(R) Platinum 8167M CPU @ 2.00GHz
stepping        : 4
microcode       : 0x1
cpu MHz         : 1995.309
cache size      : 16384 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 1
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2
x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti ssbd ibrs ibpb tpr_shadow vnmi flexpriority ept fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f rdseed adx smap avx512cd xsaveopt xsavec xgetbv1 xsaves arat
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf
bogomips        : 3990.61
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:
```



Memoryの確認

```
[opc@ins-oralinux-1 ~]$ free -m
              total        used        free      shared  buff/cache   available
Mem:          14763         231       13878           8         653       14214
Swap:          8191           0        8191
```



block device の確認
約46.6GBの Boot Volume を使用していることを OCI 上で確認出来ていて、Root領域、SWAP領域、Boot領域の3種類で分割されています
TRAN (転送タイプ) は表示されていないのね。local通信なのかな

```
[root@ins-oralinux-1 ~]# lsblk --pairs
NAME="sda" MAJ:MIN="8:0" RM="0" SIZE="46.6G" RO="0" TYPE="disk" MOUNTPOINT=""
NAME="sda2" MAJ:MIN="8:2" RM="0" SIZE="8G" RO="0" TYPE="part" MOUNTPOINT="[SWAP]"
NAME="sda3" MAJ:MIN="8:3" RM="0" SIZE="38.4G" RO="0" TYPE="part" MOUNTPOINT="/"
NAME="sda1" MAJ:MIN="8:1" RM="0" SIZE="200M" RO="0" TYPE="part" MOUNTPOINT="/boot/efi"

[root@ins-oralinux-1 ~]# lsblk -tS
NAME ALIGNMENT MIN-IO  OPT-IO PHY-SEC LOG-SEC ROTA SCHED       RQ-SIZE  RA WSAME NAME HCTL       TYPE VENDOR   MODEL             REV TRAN
sda          0   4096 1048576    4096     512    1 mq-deadline     256 128   32M sda  2:0:0:1    disk ORACLE   BlockVolume      1.0

[root@ins-oralinux-1 ~]# lsblk -f
NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
sda
├─sda2 swap         10f7b32d-47ad-4fa1-96ea-2e38bef56f17 [SWAP]
├─sda3 xfs          5dfe1823-ab77-4d85-a0e9-3c4602c5f518 /
└─sda1 vfat         4A01-26AE                            /boot/efi
```



fstab の確認

```
[root@ins-oralinux-1 ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Tue Jan 15 22:54:24 2019
#
# 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
#
UUID=5dfe1823-ab77-4d85-a0e9-3c4602c5f518 /                       xfs     defaults,_netdev,_netdev 0 0
UUID=4A01-26AE          /boot/efi               vfat    defaults,uid=0,gid=0,umask=0077,shortname=winnt,_netdev,_netdev,x-initrd.mount 0
0
UUID=10f7b32d-47ad-4fa1-96ea-2e38bef56f17 swap                    swap    defaults,_netdev,x-initrd.mount 0 0
######################################
## ORACLE CLOUD INFRASTRUCTURE CUSTOMERS
##
## If you are adding an iSCSI remote block volume to this file you MUST
## include the '_netdev' mount option or your instance will become
## unavailable after the next reboot.
## SCSI device names are not stable across reboots; please use the device UUID instead of /dev path.
##
## Example:
## UUID="94c5aade-8bb1-4d55-ad0c-388bb8aa716a"   /data1    xfs       defaults,noatime,_netdev      0      2
##
## More information:
## https://docs.us-phoenix-1.oraclecloud.com/Content/Block/Tasks/connectingtoavolume.htm
```



cloud-init の設定ファイル確認
growpart がコメントアウトされている？

```
[root@ins-oralinux-1 ~]# cat /etc/cloud/cloud.cfg
users:
 - default

disable_root: 1
ssh_pwauth:   0

mount_default_fields: [~, ~, 'auto', 'defaults,nofail', '0', '2']
resize_rootfs_tmp: /dev
ssh_deletekeys:   0
ssh_genkeytypes:  ~
syslog_fix_perms: ~

datasource_list: ['OpenStack']
datasource:
  OpenStack:
    metadata_urls: ['http://169.254.169.254']
    timeout: 10
    max_wait: 20

cloud_init_modules:
 - migrator
 - bootcmd
 - write-files
# The growpart module is disabled by default. To enable automatic boot volume resizing, uncomment
# the below entry for '- growpart' and reboot. All the dependent packages for the growpart
# module to work such as cloud-utils-growpart and gdisk are already included in the image.
#- growpart
 - resizefs
 - rsyslog
 - users-groups
 - ssh

cloud_config_modules:
 - mounts
 - locale
 - set-passwords
 - yum-add-repo
 - package-update-upgrade-install
 - timezone
 - puppet
 - chef
 - salt-minion
 - mcollective
 - disable-ec2-metadata
 - runcmd

cloud_final_modules:
 - rightscale_userdata
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - scripts-user
 - ssh-authkey-fingerprints
 - keys-to-console
 - phone-home
 - final-message

system_info:
  default_user:
    name: opc
    lock_passwd: true
    gecos: Oracle Public Cloud User
    groups: [wheel, adm, systemd-journal]
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]
    shell: /bin/bash
  distro: rhel
  paths:
    cloud_dir: /var/lib/cloud
    templates_dir: /etc/cloud/templates
  ssh_svcname: sshd

# vim:syntax=yaml
```



# 削除時の注意

Instanceを削除したときには、それに関連するVNICは削除されますが、Reserved Public IP は削除されません。こちらも忘れずに削除するようにしましょう。



# 参考URL

チュートリアル一覧

https://community.oracle.com/docs/DOC-1019313