💻

Oracle Cloud Infrastructure で遊んでみた

2021/08/30に公開約8,100字

Oracle Cloud Infrastructure で遊んでみた

※ 2021.9.6 IPv6 のところに修正あり

https://www.oracle.com/jp/cloud/

Oracle Cloud Infrastructure で、そこそこのスペックの Arm コアのサーバーが無料で使えると言う話を聞いたのが2021年の5月頃で、試してみようと思ってアカウントを作ったのですが、Tokyo リージョンのリソースが足りないらしく、インスタンスが作れない状態が続いていました。
しかし、最近になって作れるようになったと言う話を聞いて試してみたところ、あっさり 4Core 24GBメモリのインスタンスが作れてしまいました。

今回は、触って見て気がついたことなどをつらつらと書いていきますが、真面目にマニュアルを読んでいないので、おかしなことを書いているかもしれません。

compute instance

コンピュート/インスタンスの画面で、「インスタンスの作成」ボタンを押すと Create compute instance の画面になります。(微妙に日本語化されているところとそうでないところが)
ここで、イメージとシェイプを選択し、sshキーを登録してインスタンスを作ります。
UIの順番は「イメージ」→「Shape」ですが、「Shape」を先に選ぶべきです。(Shapeによって選べるイメージが違うので)

Always Free のプランで使える Shape は、VM.Standard.A1.Flex と VM.Standard.E2.1.Micro の2種類。
VM.Standard.A1.Flex の方が噂の Ampere Altra で、デフォルトは 1CPU 6GBメモリですが、4CPU 24GBメモリまで上げることができます。(2CPU 12GBとかにして複数使えるのかは試していません)
VM.Standard.E2.1.Micro の方は、1/8OCPU, 1GBメモリで増やせませんが、2インスタンスまで無料で作れます。

イメージは、デフォルトが Oracle Linux 7.9 ですが、Ubuntu や CentOS, Windows も選べます。
私は、Ubuntu 20.04 を選択しました。(その後、E2.1.Micro で追加で Oracle Linux 8もインストールしました)

インスタンスを生成するときに、「名前」と言う欄があるのですが、これがそのままホスト名になります。デフォルトは「instance-yyyymmdd-HHMM」のようになっていてるので、好きな名前に変えて置いた方が良いです。

IPv6

デフォルトでは、IPv4 しか有効でないので、IPv6 で通信をしたい場合は以下が必要です。

https://docs.oracle.com/ja-jp/iaas/Content/Network/Concepts/ipv6.htm
https://blog.osakana.net/archives/11139

を参考にしました。

OCI の web 設定画面での作業

  • ネットワーキング >> 仮想クラウド・ネットワーク >> 仮想クラウド・ネットワークの詳細 >> CIDRブロック の画面を開き、「IPv6 CIDRブロックの追加」を押して追加します。
  • サブネットの詳細画面を開き、サブネットの編集を押し、「IPv6 CIDRブロックの有効化」にチェックを入れ、CIDRブロックを指定して変更の保存を押します。
  • サブネット詳細画面のセキュリティ・リストを開き、以下のルールを追加します。
    • イングレス・ルール
      • ソースCIDR: ::/0 IPプロトコル: TCP 宛先ポート範囲: 22 (IPv6 で ssh 接続を受け付けたい場合)
      • ソースCIDR: ::/0 IPプロトコル: IPv6-ICMP タイプ: 2 (なんだっけ?)
    • エグレス・ルール
      • 宛先CIDR: ::/0 IPプロトコル: すべてのプロトコル (IPv6 で外に出たい場合)
  • 仮想クラウド・ネットワークの詳細 の画面の左下からルート表を選び、ルートテーブル選択し、ルート・ルールの追加を押し、以下を追加する
    • プロトコルのバージョン: IPv6 ターゲット・タイプ: インターネット・ゲートウェイ 宛先CIDRブロック: ::/0 ターゲット・インターネット・ゲートウェイ: 選択できるもの
  • インスタンスの詳細画面を開き、左下のメニューから「割り当てられたVNIC」を押すと「アタッチされたVNIC」の画面になるので、vnic を選択して VNICの詳細画面を開きます。左下のIPv6アドレスを選び、IPv6アドレスの割り当て、を実施します。

インスタンスのOS上での作業

Ubuntuの場合はそのままIPv6が使えるようになりました。
※ 実際には、インスタンスを作った後に上記設定をしてもうまくいかなくて、上記設定後にインスタンスを作り直したらうまくいきました。

↓↓↓以下、誤った情報でした↓↓↓

Oracle Linux の場合はデフォルトではIPv6は有効ではないようなので、以下が必要でした。

$ sudo firewall-cmd --add-service=dhcpv6-client
$ sudo dhclient -6

※ 前者は、一度実行すれば再起動後も有効ですが、後者は起動するたびにやる必要があります。参考サイトでは、/var/lib/cloud/scripts/per-boot/01_ipv6 に以下のように書いていました。

01_ipv6
#!/bin/bash
dhclient -6

↑↑↑以上、誤った情報でした↑↑↑ 以下、2021.9.6 追記

上記の後、しばらくしてアクセスしたら Oracle Linux で IPv6 アドレスが割り当てられていない状態になっていました。

  • 誤り1 Oracle Linux の場合はデフォルトではIPv6は有効ではない
  • 誤り2 前者は、一度実行すれば再起動後も有効
    • firewall-cmd は、--permanent オプションをつけないと再起動後は有効ではないので、無効だったはずです。(でも、確かにIPv6アドレス取れてたんだけどなあ・・・)
  • 誤り3
    • OCI の Oracle Linux 8 では、デフォルトで NetworkManager 経由で dhclient6 が動いているので、別途 dhclient -6 を動かす必要はない。

と、言うことで、OCI の Oracle Linux 8 で IPv6 アドレスが割り当てられていない場合、以下を実行して再起動するだけで、IPv6 アドレスが割り当てられると思います。

$ sudo firewall-cmd --permanent --add-service=dhcpv6-client

Minecraft Server を動かす

メモリが24Gもあるので、Minecraft Server も楽々動きます。

https://www.minecraft.net/ja-jp/download/server

から、サーバーのjarファイルをダウンロードします。(この記事を書いているときの最新は、1.17.1 でした)

javaが必要なので、apt でインストールします。(rlwrap もあると便利なので入れておきます。)

$ sudo apt install openjdk-13-jdk-headless rlwrap

適当にディレクトリを掘って、ダウンロードしたserver.jar と、以下のシェルスクリプトを置きます。(メモリは8Gにしてみましたが、規模に応じて適当に)

server.sh
rlwrap java -Xms8192M -Xmx8192M -jar server.jar nogui

一度起動すると、eula.txt ができるので、中の eula=falseeula=true に書き換えると、起動できるようになります。(EULAに同意する、と言う意味です)

終了するときは、/stop と入力します。起動しっぱなしにしたいときは、tmux や screen などの上で実行します。

minecraft は、デフォルトではポート 25565 で LISTEN するので、セキュリティ・リストのイングレスルールに TCP/25565 を通すように設定する必要があります。
(ポートは、server.properties の server-port で変更できます)

シリアルコンソールを使う

IPv6 を試そうと試行錯誤しているときに、ip6tables の設定を失敗してログインできなくなってしまいました。
ssh の接続が通らないので、物理的なマシンであればキーボードとディスプレイが繋がっていればコンソールから復旧ができます。
しかし、cloud にある場合はそうも行かないので、仮想シリアルコンソールのようなものを使います。
OCI の場合、Console connection と言う機能があります。

https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/serialconsole.htm

ただ、この機能は問題が起きてからでは駄目で、事前準備が必要です。

  • コンソールからID/パスワードでログインできるユーザがいる(以下のいずれか)
    • デフォルトのユーザ(ubuntu, opc) に sudo passwd ubuntu 等でパスワードを付ける
    • useradd 等で新たなユーザを追加し、同じようにパスワードをつける
  • コンソールからログインできるユーザが sudo で root 権限が得られるようにする
    • デフォルトのユーザは最初から sudo 権限がある
    • 追加したユーザの場合、Ubuntu なら sudo, Oracle Linux なら wheel グループにユーザを追加しておく

以後は、トラブルが起きてからやることです。

  • インスタンスの詳細画面で、左下のメニューから Console connection を選び、Create console connection を押す
  • 公開キーの貼り付けを選び、使いたい公開鍵を貼り付ける
    • sshキーは ed25519 が使えましたが、この画面では ed25519 は使えませんでした。rsa は使えました。
  • 作成した connection がアクティブになったら、右の縦三つの点から「Copy serial console connection for Linux/Mac」を選び、そのコマンドを実行します。

これで、M2.1.Micro のインスタンスの場合は Ubuntu, Oracle Linux 双方で成功したのですが、A1.Flex の Ubuntu はうまくいきませんでした。
接続はできるのですが、ログインプロンプトが出ません。
接続状態で web から無理矢理再起動すると、以下が出ます。

EFI stub: Booting Linux Kernel...
EFI stub: EFI_RNG_PROTOCOL unavailable, KASLR will be disabled
EFI stub: Using DTB from configuration table
EFI stub: Exiting boot services and installing virtual address map...

何が違うのかと思って調べてみたのですが、systemctl list-units したときに、M2.1.Micro の場合は serial-getty@ttyS0.service が有効なのに対して、A1.Flex では有効になっていません。
試しに、sudo systemctl enable serial-getty@ttyS0 してみましたが、効果はありませんでした。

後は、以下を見て /etc/default/grub をいじってみたのですが、GRUBの画面ではなく KVM の画面が出てきたので、怖くなって元に戻しました。

https://qiita.com/wataash/items/b291cc0643d952d986d8

A1.Flex の Oracle Linux は試していないので、誰か試した人がいたら Console connection が使えたか教えて欲しいです。

cli を使う

いろいろいじってる中で VCN の名前が気に入らなくなってきたので変更したいと思ったのですが、webからはできないようです。
cli を使えばできそうだったので、試してみました。

https://docs.oracle.com/ja-jp/iaas/Content/API/Concepts/cliconcepts.htm

いざと言う時の対応を考えると、cloud ではなく手元に環境を作った方が良いのかもしれませんが、面倒なので Oracle Linux のインスタンスを使います。(最初から oci コマンドが入っている。Mac なら homebrew で brew install oci-cli で入る)
ちなみに、Ubuntu は Debian 系なのでパッケージツールは apt を使いますが、Oracle Linux は Redhat系(?)なので、yum を使います。
準備の方法は、以下に書いてあります。

https://docs.oracle.com/ja-jp/iaas/Content/API/Concepts/apisigningkey.htm
https://docs.oracle.com/ja-jp/iaas/Content/API/Concepts/sdkconfig.htm
  • OCID の確認
    • テナンシのOCID
      • 画面右上のユーザアイコンをクリックし、「テナンシ:テナンシ名」のところをクリックすると表示されるテナンシ詳細画面に表示される
    • ユーザのOCID
      • 画面右上のユーザアイコンをクリックし、「ユーザ設定」のところをクリックすると表示されるユーザ詳細画面に表示される
      • とマニュアルに書いてあるが、ユーザ一覧から oraclecloudidentity/ユーザ名 の方を選んだ。(なぜだか覚えてない)
  • 鍵類の準備
    • マニュアルでは、genrsa 時にパスフレーズをつけることを翠陵しているが、つけると非常に面倒です。
$ mkdir ~/.oci
$ openssl genrsa -out ~/.oci/oci_api_key.pem -aes128 2048
$ chmod go-rwx ~/.oci/oci_api_key.pem
$ openssl rsa -pubout -in ~/.oci/oci_api_key.pem -out ~/.oci/oci_api_key_public.pem
$ cat ~/.oci/oci_api_key_public.pem
  • cat で表示された公開鍵を、アイデンティティ >> ユーザー >> ユーザーの詳細 の左下の APIキーに追加する
    • ユーザーはデフォルトで二人いるが、oraclecloudidentity/ユーザ名 の方を使いました
    • API キーを貼り付けると、フィンガープリントが表示されるので控えておく。(openssl rsa -pubout -outform DER -in ~/.oci/oci_api_key.pem | openssl md5 -c でも見られる)
  • 以下の内容で ~/.oci/config を作成する
~/.oci/config
[DEFAULT]
user=<ユーザのOCID>
fingerprint=<APIキーのフィンガープリント>
key_file=~/.oci/oci_api_key.pem
tenancy=<テナンシーのOCID>
region=ap-tokyo-1
  • oci setup repair-file-permissions --file ~/.oci/config または chmod go-rw ~/.oci/config する

これで、普通に使えるようになります。

  • oci iam compartment list
    • コンパートメントの一覧。jquery で帰ってくるので、一部を取り出したいときは jq を使う(テナンシのOCIDは上で調べたものなので、直接Tに入れても良い)
$ T=`oci iam compartment list | jq -r '.data[0]."compartment-id"'`
  • oci network vcn list -c $T
    • vcn の一覧を表示する
    • 以下で、vcn の ID を取得する(vcnが複数ある場合はもちろん data[0] とは限らない。)
$ VCNID=`oci network vcn list -c $T | jq -r '.data[0].id'`
  • oci network vcn update --vcn-id $VCNID --display-name <新しい名前>
    • vcn の名前を変える
    • subnet も同様のやり方で名前を変更できる
    • 変更できるのは display-name だけなので、dns-label は変更できない

以上、触って見て気がついたことを適当に書いてみました。

GCPやAWSに比べるとOCIは後発なので、4Core 24G無料はインパクトがあると思います。(有料で契約しているVPSと比べると凄いお得感)
しかし、webのインターフェイスは結構おかしくなるし、日本語も訳語がばらばらだったりする(これは、英語で使えと言う話かもしれない)など、常用するにはまだ問題もあるように感じました。
また触っていて気がついたことがあったら書こうと思います。

Discussion

ログインするとコメントできます