Oracle Cloud で仮想マシンを作ったら色々ハマったので備忘メモ

ITメモ
スポンサーリンク

Oracle Cloud を無期限無料で利用できる「Always Free」プログラムが発表されましたね。

Oracle、Oracle Cloudが無期限無料で利用できる「Always Free」プログラムを発表
米Oracleは、サンフランシスコで開催中の年次イベント「ORACLE OPENWORLD 2019」において、Oracle Cloudを無期限に無料で利用できる「Always Free」と、さらに追加のサービスなどを試すためにの30日間3...

じゃあ試しに使ってみるか、ということで試してみたところ初めから躓いたので備忘メモ。

仮想マシン(VM)の作成に失敗する

2019/09/23時点、Tokyo リージョンだと、どうやっても仮想マシンを作成できませんでした。

インスタンス作成前の事前準備

SSHのキーペアを下記コマンドで作成します。

$ ssh-keygen -t rsa -N “” -b 2048 -C “oracle cloud” -f oracle_cloud

秘密鍵(oracle_cloud)と公開鍵(oracle_cloud.pub)が出来上がる、はず。

(参考)

Managing Key Pairs on Linux Instances
Instances launched using Oracle Linux, CentOS, or Ubuntu images use an SSH key pair instead of a password to authenticat...

インスタンスの作成

まず、Oracle Cloud にアカウントを作成する際、リージョンは「Japan East(Tokyo)」に設定してます。(まあ、何も考えずに日本で作成しますよね・・・)

インスタンスがずっと無料で利用できるのは「Oracle Linux」「CentOS」「Ubuntu」らしいので、ひとまず初期選択されている「Oracle Linux」を利用することに。

オプションで色々と指定できるみたいだけど、とりあえず全てデフォルト設定のまま進めます。

ひとつだけ、事前準備で作成したSSHキーペアの公開鍵(oracle_cloud.pubファイルの中身)は登録が必須のようなので、これを入力してインスタンス作成開始。

「簡単だな」と思ったのも束の間、下記エラーで作成できず。。。

Out of host capacity.

CentOS を選んでも、Ubuntu を選んでも同じエラーで作成できないため、理由は分からないけど、何やらホストの容量を超えちゃってる模様。

仕方が無いのでリージョンを「Australia East(Sydney)」に変更して作成したところ、こちらはスルッと成功。

発表直後で混雑してるのですかね。うむむ。

仮想マシン(VM)へのSSH接続が出来ない。

Oracle LinuxだとSSH接続できない

Oracle Linux 7.7 をインストールしたので、ユーザは「opc」を指定して下記コマンドで接続できるはず。

$ ssh -i oracle_cloud opc@<public ip>

(参考)

Connecting to an Instance
You can connect to a running compute instance by using a Secure Shell (SSH) or Remote Desktop connection.

しかし、下記エラーで接続できず。

Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

んー、よく分からん。ということで、試しに別の仮想マシンを Oracle Linux じゃなくて Ubuntu で作成してみる。(SSHのキーペアは初めに作ったものを使い回し)

Oracleのドキュメントによれば、Ubuntu の場合のユーザは「ubuntu」を指定して接続できるはず。

$ ssh -i oracle_cloud ubuntu@<public ip>

あれ?こちらは接続できる。ログイン後にsudoコマンドを使ったroot権限での作業もすんなり可能。うむむ、ますます分からない。

試しに ubuntu のインスタンスに対して、opcユーザで接続してみると、表示されるエラーメッセージは「Permission denied (publickey)」とOracle Linux の時とはチョット違う。んー、Oracle Linux 側のSSHの設定がおかしいのかな?

解決編

コンソールで接続して状況を確認する

Oracle Linux のインスタンスに登録されているSSHキーがおかしい気もするので、SSHがダメならということで、コンソール接続して設定状況を確認してみる。

コンソール接続の手順

どうやら初めに、インスタンスに対してコンソール接続用の設定をする必要がある模様

インスタンス詳細画面を下の方にスクロールして「コンソール接続」をクリック

コンソール接続の作成を実施。ここでSSH公開鍵を登録する必要があるので、初めに作成した公開鍵(oracle_cloud.pubファイルの中身)を貼り付ける

右側の「・・・」にカーソルを合わせて「SSHを使用して接続」を選択



私が利用しているのはMacOSなので、表示されているコマンドをコピーしてターミナルに貼り付ける

で、コピペしたコマンドをそのまま実行すると下記エラーで失敗。

Permission denied (publickey).

コピペしたコマンドをよく見ると SSHのキー(秘密鍵)の指定が必要そうなので、追加する。(赤字の部分:2箇所あり)

$ ssh -i ~/.ssh/oracle_cloud -o ProxyCommand=’ssh -i ~/.ssh/oracle_cloud -W %h:%p -p 443 ocid1.instanceconsoleconnection.oc1.ap-sydney-1.xxxxx@instance-console.ap-sydney-1.oraclecloud.com’ ocid1.instance.oc1.ap-sydney-1.xxxxx

(Yes/No)を聞かれたら、とりあえず(Yes)を入力して、しばらく待つ。(何も表示が変わらなければEnterキーでも押してみる)

Oracle Linux Server 7.7
Kernel 4.14.35-1902.4.8.el7uek.x86_64 on an x86_64-20190923-1715 login:

こんな感じで「login:」のプロンプトが出てくれば、コンソール接続に成功しているので、インスタンスを再起動する。
(インスタンス詳細画面から「再起動」ボタンをクリック)  

Oracle Linux をメンテナンスモードで起動する

インスタンスを再起動すると、OSの再起動処理がツラツラっと走り始めて、GRUBのブートメニューが表示されるので、すぐにキーボードの↑キーを入力して自動起動プロセスを停止する。(タイミングが難しいので、↑キーを連打しておけばOK、だと思う)

kernel(Oracle Linux Server 7.7)を選択→「e」をタイプしてOSブートの編集モードに入る。

linuxefi で始まる行末に「 init\=/bin/bash」(↓の赤字部分)を追記して Command+x(画面にはCtrl+xって表示されてるけど、MacだとCommand+xみたい)

linuxefi /boot/vmlinuz-4.14.35-1902.4.8.el7uek.x86_64 root=UUID=915fbd\
d1-9aba-4b6d-8714-5c28f1c31d77 ro crashkernel=auto LANG=en_US.UTF-8 console=tty0 console=ttyS0,9600 rd.luks=0 rd.lvm=0 rd.md=0 rd.dm=0 netroot=iscsi:169.254\.0.2:::1:iqn.2015-02.oracle.boot:uefiiscsi_param=node.session.timeo.replacement_timeout=6000 net.ifnames=1 nvme_core.shutdown_timeout=10 ipmi_si.tryacpi=0 ipmi_si.trydmi=0 ipmi_si.trydefaults=0 libiscsi.debug_libiscsi_eh=1 loglevel=4 init\=/bin/bash
initrdefi /boot/initramfs-4.14.35-1902.4.8.el7uek.x86_64.img

これでメンテナンスモードでBashが起動するので、以下のコマンドを実行

SELinuxのポリシーをロード
$ /usr/sbin/load_policy -i
ルートパーティションへの書込権限を取得
$ /bin/mount -o remount, rw /

状況確認

opcユーザに登録されているSSHキー情報の権限なんかがおかしいのかな?とおいうことで、/home/opc/.ssh を確認しようとしたものの、ディレクトリが無い。ユーザの登録状況(/etc/passwd)を確認すると、opc なんてユーザは存在してない。(そもそも一般ユーザが存在してない)
ユーザが居ないんじゃSSHで接続なんてできないよね、ということでユーザを作る。

ユーザ作成

この状況なら作成するユーザは「opc」である必要は無い気もするけど、ひとまず「opc」ユーザを作る。

$ /sbin/useradd opc

パスワードも設定しておく

$ /bin/passwd opc

※パスワードは 英大文字・小文字・数字・記号を含まないとエラーになるので注意

ついでに sudo も実行したいので、/etc/sudoers に下記を追記しておく

opc ALL=(ALL) ALL

あとは SSH接続できるように公開鍵を登録する。

$ su – opc
$ mkdir .ssh
$ chmod 700 .ssh
$ echo ‘公開鍵の内容’ >> .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys

ここまでやったらインスタンスを再起動

$ /usr/sbin/reboot -f

SSH接続 再び

OSが起動したら、ターミナルからSSH接続を再び試してみる。

$ ssh -i oracle_cloud opc@<public ip>

今度はすんなり繋がった。
うーん、ドキュメントに書かれていた「opc」ユーザとは一体。。。

まとめ

SSHで接続後、yum で httpd をインストールして、Webページが表示できるところまでは確認できました。(仮想クラウド・ネットワークのセキュリティリストに「外部からのHTTP(TCPの80ポート)を許可」の設定追加は別途必要)

Oracle のドキュメント通りに操作したのに上手くいかないのは、何とも。
ただ、インターネットで検索しても同じようにハマってる情報は見当たらなかったので、何かインスタンス作成時の手順に見落としがあったのかもしれない。。。
などとモヤモヤは残るものの、ひとまず使えるようになったので、もう少し触ってみることにします。

コメント