Oracle Cloud 小ネタ集

# はじめに
Oracle Cloud を使っていて、これ便利だなーとか、これ注意したほうがいいなーとか、これ小ネタだなー　と気が付いたものを、まとめていきます。
気が付いたタイミングで随時追加していきます。

# Compute
## Oracle Linux を無停止アップデート

Oracle Cloud Infrastructure 上で Oracle Linux のを使用する場合は、追加コスト無しに Oracle Linux Premier Support を受けることが出来ます
Oracle Linux Premier Support には、Oracle Linux を無停止してアップデートを行うための、Oracle Ksplise が含まれています(スゴイ)
Oracle Ksplise を使用すると、再起動無しに OSのセキュリティパッチを適用することが出来るため、運用コストの大幅削減が見込まれます

Document
https://docs.cloud.oracle.com/iaas/Content/Compute/References/images.htm#zero

## OCPUについて
OCPU(Oracle Compute Units)は、Instanceのスペック(Shape)を指定するときに、CPUの個数を表現するものとなっている。
1OCPUは、1物理CPUコア = Hyper-Threading後で2論理CPUコア　となっており、仮想Instanceから見ると、CPUが2個見えている。地味にわかりにくいので、普通に2vCPUって表現してもらったほうが嬉しいなコレ・・・

## 仮想インスタンスへのログイン方法
## Oracle Linux と CentOS
ユーザ：opc
ログイン方法：秘密鍵を使用してSSH接続

memo : opc は、「Oracle Public Cloud User」の略らしい

### Ubuntu
ユーザ：ubuntu
ログイン方法：秘密鍵を使用してSSH接続

### Windows
ユーザ：opc
ログイン方法：パスワードを指定してリモートデスクトップ接続
パスワード：Oracle Cloud のコンソールやAPIを使用して、one-time password を確認。初回ログイン後はパスワード変更するのが推奨

## OCI Utilities

Oracle Cloud 上でLinux仮想インスタンスを稼働する時に、Linuxに入れておくと便利な OCI Utilities という名前のソフトウェアがあります。
Utilities を導入することにより、ブロックボリュームの自動検出、ルートファイルシステムの拡張、セカンダリVNICの設定、インスタンスのPiblicIPの検出、インスタンスのメタデータ表示、といった各種便利な機能を利用することが出来ます。

https://docs.cloud.oracle.com/iaas/Content/Compute/References/ociutilities.htm

## DHCP

仮想インスタンスは、DHCP client は有効にし続ける必要があります。無効にしてしまうとリース期限(24時間)が切れたタイミングでアクセスが出来なくなります。

https://docs.cloud.oracle.com/iaas/Content/Compute/References/bestpracticescompute.htm#four

## NTP

OCI側で無償のNTPサーバを提供しています。基本的にはInternetではなく、OCIのNTPサーバと時刻同期をするのが良いとおもいます。

https://docs.cloud.oracle.com/iaas/Content/Compute/Tasks/configuringntpservice.htm

## DNS
OCI上でInstanceを利用するときは、2種類のDNS構成パターンがあります。

1. Internet and VCN Resolver (default)
2. Custom Resolver

https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/dns.htm

### Internet and VCN Resolver
何も意識しないでInstanceを作成すると、このパターンとなります。
VCN上で提供されている、仮想的なDNSサーバを利用する形となっていて、Internet上のhostnameと、VCN上の内部的なhostnameを名前解決することが出来ます。
LinuxInstanceの /etc/resolv/conf は以下の設定となっており、169.254.169.254 を使用して名前解決を行います。

```
[root@web-1 yum.repos.d]# cat /etc/resolv.conf
; Any changes made to this file will be overwritten whenever the
; DHCP lease is renewed. To persist changes you must update the
; /etc/oci-hostname.conf file. For more information see
;[https://docs.cloud.oracle.com/iaas/Content/Network/Tasks/managingDHCP.htm#notes]
;
; generated by /usr/sbin/dhclient-script
search tutorial.oraclevcn.com subnet2.tutorial.oraclevcn.com
nameserver 169.254.169.254
```

www.google.co.jp を名前解決した例

```
[root@web-2 ~]# dig @169.254.169.254 www.google.co.jp

; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> @169.254.169.254 www.google.co.jp
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52622
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 13, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.google.co.jp.              IN      A

;; ANSWER SECTION:
www.google.co.jp.       300     IN      A       216.58.211.99

;; AUTHORITY SECTION:
.                       514413  IN      NS      e.root-servers.net.
.                       514413  IN      NS      i.root-servers.net.
.                       514413  IN      NS      l.root-servers.net.
.                       514413  IN      NS      m.root-servers.net.
.                       514413  IN      NS      k.root-servers.net.
.                       514413  IN      NS      b.root-servers.net.
.                       514413  IN      NS      d.root-servers.net.
.                       514413  IN      NS      j.root-servers.net.
.                       514413  IN      NS      h.root-servers.net.
.                       514413  IN      NS      a.root-servers.net.
.                       514413  IN      NS      c.root-servers.net.
.                       514413  IN      NS      f.root-servers.net.
.                       514413  IN      NS      g.root-servers.net.

;; Query time: 327 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Sat Feb 09 00:34:42 GMT 2019
;; MSG SIZE  rcvd: 272
```

VCN上のInstanceに紐づいているInternal な　FQDN を名前解決した例

```
[root@web-2 ~]# dig @169.254.169.254 web-1.subnet2.tutorial.oraclevcn.com

; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> @169.254.169.254 web-1.subnet2.tutorial.oraclevcn.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5262
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;web-1.subnet2.tutorial.oraclevcn.com. IN A

;; ANSWER SECTION:
web-1.subnet2.tutorial.oraclevcn.com. 300 IN A  172.16.2.2

;; AUTHORITY SECTION:
subnet2.tutorial.oraclevcn.com. 86400 IN NS     vcn-dns.oraclevcn.com.

;; ADDITIONAL SECTION:
vcn-dns.oraclevcn.com.  82135   IN      A       169.254.169.254

;; Query time: 2 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Sat Feb 09 00:44:40 GMT 2019
;; MSG SIZE  rcvd: 119
```

### Custom Resolver
独自に設定した DNSサーバを指定するパターンとなります。
VCNで、独自にDNSサーバを設定したDHCP Option を作成した後、VCN Subnetを作るときにDHCP Optionを指定することで、Custom Resolver を構成することが出来ます。
例えば、Custom Resolverとして Googleが提供しているDNSサーバ (8.8.8.8) を設定することで、以下の設定とすることが出来ます

```
[opc@testdns ~]$ cat /etc/resolv.conf
; Any changes made to this file will be overwritten whenever the
; DHCP lease is renewed. To persist changes you must update the
; /etc/oci-hostname.conf file. For more information see
;[https://docs.cloud.oracle.com/iaas/Content/Network/Tasks/managingDHCP.htm#notes]
;
; generated by /usr/sbin/dhclient-script
nameserver 8.8.8.8
```


# Networking
## OCIで予約されているネットワーク

次のCIDRは、OCI側で使用されるので付与することはできません。
ブートボリュームおよびブロックボリュームへのiSCSI接続、インスタンスメタデータ、およびその他のサービスに使用されます。

```
169.254.0.0/16
```

https://docs.cloud.oracle.com/iaas/Content/Compute/References/bestpracticescompute.htm

## OCIで予約されているアドレス

Subnetの中で次のIPアドレスは予約されているため、Instanceなどで使用できません。192.168.0.0/24 を例にしています

- 192.168.0.0 (the network address)
- 192.168.0.255 (the broadcast address)
- 192.168.0.1 (the subnet default gateway address)

Gatewayは .1 を使用する形ですね。.254 になじみのある方は注意です。

## Security List の適用先
Security List の適用先は、**Subnet** となっています。AWSには、セキュリティーグループと、ネットワークACLという2種類の概念が存在しており、InstanceとSubnetのパケットフィルターをそれぞれのレイヤーで管理することができます。が、OCIではSubnetのみの管理となっています。
細かいアクセスポリシーの設定は、Instance内の Firewalld や Iptables を使用するとよいと思います

## Default の Security List は Ping(ICMP)が通らない

Default で作成された Security List では、VCN上に作成されたInstance間で Ping(ICMP) を行うことが出来なくなっている。正確に記載すると、ICMPのType3(到達不可能) のみ通信を許可している。typeをallを変更することで、Pingを通すことが出来る

## マルチキャスト不可
マルチキャストは通信できない。マルチキャストが必要なアプリケーションを動かす際には、検討が必要

## Internet Gatewayの地味にハマる仕様

Internet Gateway は、InternetからVCN上のInstanceへ通信を行うためのgatewayとなっています。地味なハマる仕様として、Internet Gateway は NATは行ってくれません。
Public Subnet に紐づいている、Route Table の Default GatewayをInternet Gatewayとしている場合、そのSubnetにInstanceをPublicIP無しで作成すると、Internetと疎通を行うことが出来ません。Internet Gateway は NATを行うことが出来ないためですね。
じゃー NAT Gateway を追加すればいいかというとそれも結構メンドクサイです。Route Table の DefaultGW を Internet Gateway にしているので、NAT GatewayはDefaultGWにすることが出来ないため、適切なStaticRouteの設定は難しいです。
じゃーどうするかというと、Subnetを設計するときに役割を明確にして使い分けを行うとよいと思います。

Subnetの役割
1. Internetからのアクセスを許すSubnet。ここに作成するInstanceはすべてPublicIPを付与する。webサーバなどを配置するFrontend用のSubnetという位置づけ
2. Internetからのアクセスを許さないけど、NATでInternetへ出るSubnet。ここに作成するInstanceはPublicIPは付与しない。データベースなどを配置するSubnet

## IPsec VPN の制限 (?)
OCIのVCN同士でIPsec VPN を接続検証することが出来なかった(少なくとも自分の環境では)
片方のVCNでDRG+IPsec Connectionを作成し、もう片方のVCN上でLibreswanを稼働させてみたが、ヒアを張ることはできたようにみえたものの、PingやSSHなどの通信は通らなかった

# BlockVolume

## Volumeの接続タイプ

OCIのBlockVolumeには2種類の接続タイプが存在しています

- iSCSI方式
- 準仮想化方式

https://docs.cloud.oracle.com/iaas/Content/Block/Concepts/overview.htm#two

### iSCSI方式
メリット
準仮想化方式と比べるとパフォーマンスが良い。Oracle Cloud で掲げられているパフォーマンスのSLAは、こちらのiSCSI方式を選択した時のみ有効になる。

デメリット
InstanceがiSCSIのイニシエータとなる必要があるため、イニシエータに必要な設定や、fstabの設定を行う必要がある。
**iSCSIを経由したfstabの指定は、注意して作成する必要がある。/dev/sdXの番号は再起動するたびに変更になるため、wwidや永続的なpath設定を通じてfstabを設定する必要がある**

https://docs.cloud.oracle.com/iaas/Content/Block/References/consistentdevicepaths.htm

### 準仮想化方式
メリット
OCI上で設定するだけで、Instance上からBlockDeviceが見える (準仮想化された状態)

デメリット
iSCSI方式と比べるとパフォーマンスが落ちる

## Volumeの容量制限
50GB ~ 32TB(32,768 GB) の間で容量を指定する必要がある。また、増減で指定可能な単位は1GB単位で指定する必要がある。

## Volumeが接続可能な制限
Block Volume は、同一のAD(availability-domain)に存在するInstanceにのみ接続可能。他のADや他のRegionには接続することが出来ない。
なお、Block Volume には Fault-Domain の概念は存在していないため、instanceが存在する Fault-Domain は意識しなくても良い

## VolumeのAttach type iSCSI時の注意点
再起動するたびに /dev/sdX の番号が変わる。fstabに記載するときに要注意。要詳細追記

- uuidを使用する
- 永続的なpathを使用する

https://docs.cloud.oracle.com/iaas/Content/Block/References/consistentdevicepaths.htm

検証済みQiita記事
https://qiita.com/sugimount/items/913aab1e1c9759486abc

# Image
## WindowsImageをImportする前にレジストリ設定が必要
WindowsInstanceのタイムゾーンを変更した場合、HWクロックと同期したタイミングでデフォルトのタイムゾーンに戻る。この場合、レジストリを変更する必要がある
https://docs.cloud.oracle.com/iaas/Content/Compute/Tasks/imageimportexport.htm#WinOS

## x7 x5 サーバによって、Imageの互換性がある

Oracle Cloud では、Oracle Server X5とX7の二種類でコンピュートリソースなどを提供しているようです。Compute Host でX7とX5のどちらを利用するかによって、それに対応するImageを使用する必要があります。異なるバージョンでImageを動かしてしまうと、一部の機能が動かないことがあるようです。

https://docs.cloud.oracle.com/iaas/Content/Compute/Tasks/imageimportexport.htm#x7compat

# Archive Storage
## 操作方法全般
OCI上でArchive Storage を利用する際には、Object Storage のメニューで Bucket を作成するときに、 [Archive]を選択して Bucket を作成して扱う。

https://docs.cloud.oracle.com/iaas/Content/Archive/Concepts/archivestorageoverview.htm

# File Storage
NFSv3のみサポートしている。Windowsからアクセスする場合は、NFS Client を Installする必要がある。WindowsOSにバンドルされているため、機能を有効化すればよい。

# Object Storage

## oci cli で File を Uploadするときに、ホームディレクトリでは指定できない

`--file` で指定するパスが以下のようなパスでは正常にアップロード可能

```
oci os object put --bucket-name tutorial-bucket1 --file '/home/sugi/test2/test.txt' --name tutorial-testput.txt 
```

しかし、以下のようにホームディレクトリ経由で指定するとエラーになる (なぜ・・・？)

```
oci os object put --bucket-name tutorial-bucket1 --file '~/test2/test.txt' --name tutorial-testput.txt
```

## Object Storage で疑似的にディレクトリとしてアクセス
詳細は以下

https://qiita.com/sugimount/items/00b01dcb858bed06d758

## Document の Sampleにギブソンやフェンダーが使われているｗ

OracleでDocument作る人にギター好きなエンジニアがいるっぽい

```
 (for example, guitars/fender/stratocaster.jpg, guitars/gibson/lespaul.jpg).
```

https://docs.cloud.oracle.com/iaas/Content/Object/Concepts/objectstorageoverview.htm#resources

# oci cli
## JSON
JSONでパラメータを与えたい時があります。以下作成例

作成済みのInternetGatewayのIDを取得します

```
set ig_ocid (oci network internet-gateway list --display-name "tutorial-int-gw1" --vcn-id $vcn_ocid | jq -r '.data[0].id')
```



RuleのJSON作成

```
mkdir ~/workdir
string trim '
[ 
  {
    "cidrBlock":"0.0.0.0/0",
    "destination": "0.0.0.0/0",
    "destination-type": "CIDR_BLOCK",
    "networkEntityId":"sedstring"
  }
]
' > ~/workdir/routetable_rule.json
sed -i "s/sedstring/$ig_ocid/g" ~/workdir/routetable_rule.json
```



作成したJSONファイルを確認します。oci で対象を list したときに表示される情報を参考にして指定すればやりやすいです。

```
> cat routetable_rule.json
[
  {
    "cidrBlock":"0.0.0.0/0",
    "destination": "0.0.0.0/0",
    "destination-type": "CIDR_BLOCK",
    "networkEntityId":"ocid1.internetgateway.oc1.iad.aaaaaaaaknm4us55oouldxwrk5oi7hmyjeju6vb5wgrixrk5tk6pp76gnkhq"
  }
]
```



作成

```
oci network route-table create --display-name lb_routetable --vcn-id $vcn_ocid --route-rules file:///home/sugi/workdir/routetable_rule.json
```



確認

```
> oci network route-table list --vcn-id $vcn_ocid                                                                                   866ms{
  "data": [
    {
      "compartment-id": "mask",
      "defined-tags": {},
      "display-name": "lb_routetable",
      "freeform-tags": {},
      "id": "ocid1.routetable.oc1.iad.aaaaaaaa7xe6ufwopliid7gqc766gdsd27gdeom6gwooxfek3szsq23tutia",
      "lifecycle-state": "AVAILABLE",
      "route-rules": [           <======== ※ここのJSON形式を参考にしてパラメータファイルを作成するとわかりやすい！
        {
          "cidr-block": "0.0.0.0/0",
          "destination": "0.0.0.0/0",
          "destination-type": "CIDR_BLOCK",
          "network-entity-id": "ocid1.internetgateway.oc1.iad.aaaaaaaaknm4us55oouldxwrk5oi7hmyjeju6vb5wgrixrk5tk6pp76gnkhq"
        }
      ],
      "time-created": "2019-02-09T03:20:25.918000+00:00",
      "vcn-id": "ocid1.vcn.oc1.iad.aaaaaaaamqjvjlxum3t2p727i2akoeltk2z2tk4wxukoqlmbskf27lzollna"
    }
  ]
```



# Fn
## 環境変数設定
valueが何もない config 設定は、設定コマンド自体は成功しても、実際は反映されない

```
fn config func env-app oci-lb-list OCI_PrivateRSAKey_passphrase ""

```


参考
https://qiita.com/feifo/items/5789ee7a724c6cb786a9

# その他
## ServiceLimit
ここにまとめられている

https://docs.cloud.oracle.com/iaas/Content/General/Concepts/servicelimits.htm