Oracle Cloud Always Free で VM インスタンスを作成する

# はじめに
初投稿です。
インフラ素人ですが Oracle Cloud Always Free で分散 SNS の [Dolphin](https://github.com/syuilo/dolphin) が立ち上げられたので記事を書くことにしました。

 <ins>[2021/6/22 追記] この記事では AMD VM.Standard.E2.1.Micro の VM を作成しています。

 <ins>[2021/6/22 追記] [NAT インスタンスの設定](https://qiita.com/xianon/items/199e6794160e2c6da911#nat-%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A) の項を追記しました。</ins>

# 目標
VM インスタンスの作成と SSH での接続、さらにオブジェクト・ストレージの作成を行います。
今回は分散 SNS の Dolphin をインストールするために必要な構成としていますが、他の一般的なサーバーでも使える構成になると思います。

Always Free では 2 つの VM インスタンス、2 つの Oracle Autonomous Database、<del>10 GB</del> <ins>20 GB</ins> のオブジェクト・ストレージ等が無料で利用できますが、今回は Oracle Autonomous Database は使用せず、代わりに PostgreSQL を使用する前提でインスタンスを建てることとします。
<ins>参考: [Always Freeリソースの詳細](https://docs.cloud.oracle.com/ja-jp/iaas/Content/FreeTier/resourceref.htm)</ins>

VM インスタンスは 2 つまで作成できるので、有効に使うために WEB AP サーバーと DB サーバーに分けて作成します。

# 前提条件
* `ssh`と`ssh-keygen`コマンドが使える端末
* [Oracle Cloud](https://www.oracle.com/jp/cloud/free/)でホームリージョンが東京のアカウントが作成されている

[【OCI】oracle cloud -アカウントの登録編-](https://qiita.com/manaki079/items/d8684f8e15ccf09bdc4e)等を参考にアカウントを作成しておいてください。

# ネットワーキング
## 仮想クラウド・ネットワークの作成
VM インスタンスを作成する前に仮想クラウド・ネットワークを作成します。

今回は WEB サーバーのみ外部に公開(public)し DB サーバーは非公開(private)の構成にします。

[Oracle Cloud Infrastructure コンソール](https://console.ap-tokyo-1.oraclecloud.com/) にサインインし、左上の三本線メニューをクリックして「**ネットワーキング > 仮想クラウド・ネットワーク**」をクリックします。

![ネットワーキング_仮想クラウド・ネットワーク](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/4474711e-44d9-a4c4-3b4a-6e3bf92d54b9.png)

表示されたページの「**VCNの作成**」ボタンをクリックします。
![仮想クラウド・ネットワーク](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/b77e3cdc-bb2f-426b-f332-770fb4120118.png)

表示された入力画面に次のように入力します。
名前は他と区別できればどんな名前でもよいです。

| 項目                                 | 値                |
|:-------------------------------------|:------------------|
| 名前                                 | Dolphin VCN       |
| コンパートメントに作成               | username (ルート) |
| CIDRブロック                         | 10.0.0.0/16       |
| このVCNでDNSホスト名を使用           | ✓                |
| DNSラベル                            | dolphinvcn        |

入力したら「VCNの作成」ボタンをクリックします。

仮想クラウド・ネットワークが作成されました。
![仮想クラウド・ネットワークの詳細](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/2b926dd7-5aac-ef25-a37c-0d832d56015f.png)

続けて関連リソースを作成していきます。
リソースの一覧は同画面の左下の方に表示されています。
![仮想クラウド・ネットワーク_リソース](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/ead4ac7a-f628-4f01-66bb-24317b317a7e.png)

## パブリック・サブネットの作成
まずは WEB サーバー用のパブリック・サブネットを作成するためリソースの「**サブネット**」をクリックし、表示された画面の「**サブネットの作成**」ボタンをクリックします。

表示された入力画面に次のように入力します。

| 項目                           | 値                                    |
|:-------------------------------|:--------------------------------------|
| 名前                           | Public Subnet Dolphin VCN             |
| コンパートメントに作成         | username (ルート)                     |
| サブネット・タイプ             | リージョナル(推奨)                    |
| CIDRブロック                   | 10.0.0.0/24                           |
| ルート表コンパートメント       | Default Route Table for Dolphin VCN   |
| サブネット・アクセス           | パブリック・サブネット                |
| このSUBNETでDNSホスト名を使用  | ✓                                    |
| DNSラベル                      | publicsubnet                          |
| DHCPオプション・コンパートメント | Default DHCP Options for Dolphin VCN  |
| セキュリティ・リスト           | Default Security List for Dolphin VCN |

この設定でプライベート IP アドレスが 10.0.0.0/24 (10.0.0.0 〜 10.0.0.255) の範囲で、外部に公開できるパブリック・サブネットが作成されます。

入力したら「サブネットの作成」ボタンをクリックしてパブリック・サブネットを作成します。

## インターネット・ゲートウェイの作成
パブリック・サブネットではインターネット・ゲートウェイを設定しないとネットワークに接続できないので設定します。

リソースの「**インターネット・ゲートウェイ**」をクリックし、表示された画面の「**インターネット・ゲートウェイの作成**」ボタンをクリックします。

表示された入力画面に次のように入力します。

| 項目                   | 値                           |
|:-----------------------|:-----------------------------|
| 名前                   | Internet Gateway Dolphin VCN |
| コンパートメントに作成 | username (ルート)            |

入力したら「インターネット・ゲートウェイの作成」ボタンをクリックします。

続けてインターネット・ゲートウェイをルート表に追加します。
リソースの「**ルート表**」をクリックし、表示された画面の「**Default Route Table for Dolphin VCN**」をクリックし、表示された画面の「**ルート・ルールの追加**」ボタンをクリックします。

表示された入力画面に次のように入力します。

| 項目                                     | 値                           |
|:-----------------------------------------|:-----------------------------|
| ターゲット・タイプ                       | インターネット・ゲートウェイ |
| 宛先CIDRブロック                         | 0.0.0.0/0                    |
| ターゲット・インターネット・ゲートウェイ | Internet Gateway Dolphin VCN |

入力したら「ルート・ルールの追加」ボタンをクリックしてインターネット・ゲートウェイのルートを追加します。

## WEB サーバー用のネットワーク・セキュリティ・グループの作成
WEB サーバーは 80 と 443 ポートを公開するため、ネットワーク・セキュリティ・グループで公開ポートの設定をします。

WEB サーバー用のネットワーク・セキュリティ・グループを作成するため、リソースの「**ネットワーク・セキュリティ・グループ**」をクリックし、表示された画面の「**ネットワーク・セキュリティ・グループの作成**」ボタンをクリックします。

表示された入力画面に次のように入力します。

| 項目                   | 値                                     |
|:-----------------------|:---------------------------------------|
| 名前                   | WEB Network Security Group Dolphin VCN |
| コンパートメントに作成 | username (ルート)                      |

「次」ボタンをクリックしてセキュリティ・ルールを入力します。

| 項目           | 値         |
|:---------------|:-----------|
| ステートレス   | 未チェック |
| 方向           | イングレス |
| ソース・タイプ | CIDR       |
| ソースCIDR     | 0.0.0.0/0  |
| IPプロトコル   | TCP        |
| ソース・ポート | 空欄       |
| 宛先ポート範囲 | 80,443     |

入力したら「作成」ボタンをクリックして WEB サーバー用のネットワーク・セキュリティ・グループを作成します。

## プライベート・サブネット用のルート表の作成
次に DB サーバー用のプライベート・サブネットの作成をする前に、プライベート・サブネット用のルート表を作成します。

リソースの「**ルート表**」をクリックし、表示された画面の「**ルート表の作成**」ボタンをクリックします。

表示された入力画面に次のように入力します。

| 項目                   | 値                                     |
|:-----------------------|:---------------------------------------|
| 名前                   | Private Subnet Route Table Dolphin VCN |
| コンパートメントに作成 | username (ルート)                      |

入力したら「ルート表の作成」ボタンをクリックしてプライベート・サブネット用のルート表を作成します。

## プライベート・サブネットの作成
DB サーバー用のプライベート・サブネットを作成するためリソースの「**サブネット**」をクリックし、表示された画面の「**サブネットの作成**」ボタンをクリックします。

表示された入力画面に次のように入力します。

| 項目                          | 値                                     |
|:------------------------------|:---------------------------------------|
| 名前                          | Private Subnet Dolphin VCN             |
| コンパートメントに作成        | username (ルート)                      |
| サブネット・タイプ            | リージョナル(推奨)                     |
| CIDRブロック                  | 10.0.1.0/24                            |
| ルート表                      | Private Subnet Route Table Dolphin VCN |
| サブネット・アクセス          | プライベート・サブネット               |
| このSUBNETでDNSホスト名を使用 | ✓                                     |
| DNSラベル                     | privatesubnet                          |
| DHCPオプション                | Default DHCP Options for Dolphin VCN   |
| セキュリティ・リスト          | Default Security List for Dolphin VCN  |

パブリック・サブネットの設定と微妙に異なっているので注意してください。
この設定でプライベート IP アドレスが 10.0.**1**.0/24 (10.0.**1**.0 〜 10.0.**1**.255) の範囲で、外部に公開**できない**プライベート・サブネットが作成されます。

入力したら「サブネットの作成」ボタンをクリックしてプライベート・サブネットを作成します。

## NAT ゲートウェイの作成
 <ins>[2021/6/22 追記]
Always Free の範囲内で NAT ゲートウェイが作成できると思っていたのですが、Always Free では作成できないようです。</ins>

 <ins>代わりに WEB サーバーを NAT インスタンスとすることでインターネット接続する方法が分かったので、この項は飛ばして <a href="https://qiita.com/xianon/items/199e6794160e2c6da911#db-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E7%94%A8%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E4%BD%9C%E6%88%90">次項</a> に進んでください。</ins>

 <ins>この項はそのまま残しておきます。
[追記終わり]</ins>

プライベート・サブネット内のインスタンスはインターネットに公開されないのですが、このままではインターネットに接続ができないためインスタンスの構築に必要なソフトウェアのダウンロードもできません。
内部からインターネットに接続できるように NAT ゲートウェイを作成します。

リソースの「**NATゲートウェイ**」をクリックし、表示された画面の「**NATゲートウェイの作成**」ボタンをクリックします。

表示された入力画面に次のように入力します。

| 項目                   | 値                                 |
|:-----------------------|:-----------------------------------|
| 名前                   | NAT Gateway Dolphin VCN            |
| コンパートメントに作成 | username (ルート)                  |
|                        | エフェメラル・パブリックIPアドレス |

入力したら「NATゲートウェイの作成」ボタンをクリックして NAT ゲートウェイを作成します。

続けて NAT ゲートウェイをプライベート・サブネット用のルート表に追加します。
リソースの「**ルート表**」をクリックし、表示された画面の「**Private Subnet Route Table Dolphin VCN**」をクリックし、表示された画面の「**ルート・ルールの追加**」ボタンをクリックします。

表示された入力画面に次のように入力します。

| 項目                      | 値                      |
|:--------------------------|:------------------------|
| ターゲット・タイプ        | NATゲートウェイ         |
| 宛先CIDRブロック          | 0.0.0.0/0               |
| ターゲットNATゲートウェイ | NAT Gateway Dolphin VCN |

入力したら「ルート・ルールの追加」ボタンをクリックして NAT ゲートウェイのルートを追加します。

## DB サーバー用のネットワーク・セキュリティ・グループの作成
DB サーバーは PostgreSQL の 5432 ポートを公開するため、ネットワーク・セキュリティ・グループで公開ポートの設定をします。

DB サーバー用のネットワーク・セキュリティ・グループを作成するため、リソースの「**ネットワーク・セキュリティ・グループ**」をクリックし、表示された画面の「**ネットワーク・セキュリティ・グループの作成**」ボタンをクリックします。

表示された入力画面に次のように入力します。

| 項目                   | 値                                    |
|:-----------------------|:--------------------------------------|
| 名前                   | DB Network Security Group Dolphin VCN |
| コンパートメントに作成 | username (ルート)                     |

「次」ボタンをクリックしてセキュリティ・ルールを入力します。

| 項目           | 値         |
|:---------------|:-----------|
| ステートレス   | 未チェック |
| 方向           | イングレス |
| ソース・タイプ | CIDR       |
| ソースCIDR     | 0.0.0.0/0  |
| IPプロトコル   | TCP        |
| ソース・ポート | 空欄       |
| 宛先ポート範囲 | 5432       |

入力したら「作成」ボタンをクリックして DB サーバー用のネットワーク・セキュリティ・グループを作成します。

# コンピュート
## SSH 認証のための公開鍵と秘密鍵の作成
インスタンスを作成する際に SSH 公開鍵の登録が必要なため、[Linuxインスタンスでのキー・ペアの管理](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Compute/Tasks/managingkeypairs.htm)等を参考に SSH 公開鍵と秘密鍵を作成します。

ターミナルを起動し、次のコマンドを入力します。
`your_email@example.com`の箇所は適宜変更して入力してください。

```shell:terminal
$ ssh-keygen -t rsa -N "" -b 2048 -C your_email@example.com -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:iaevhEsnkIKkcZjfXHfIawOU6iiAYERNgDxfBSxIH5w your_email@example.com
The key's randomart image is:
+---[RSA 2048]----+
|*=*oo.+o         |
|oB.E.+.. .       |
|B.+.o.o + .      |
|*+ =.. + +       |
|= +oo . S        |
|...... + .       |
| .  + +          |
|   . = .         |
|    . ...        |
+----[SHA256]-----+
```

`~/.ssh/id_rsa`に秘密鍵が作成され、`~/.ssh/id_rsa.pub`に公開鍵が作成されました。

## WEB サーバーのインスタンスの作成
WEB サーバーのインスタンスを作成します。

左上の三本線メニューをクリックして「**コンピュート > インスタンス**」をクリックします。
![コンピュート_インスタンス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/b228aafe-c943-7f4a-558a-31c40d33c42f.png)

表示されたページの「**インスタンスの作成**」ボタンをクリックします。
![インスタンス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/d1ab5f4c-951e-0ded-e676-83edb4fae3ee.png)

表示された入力画面に次のように入力します。

| 項目               | 値                |
|:-------------------|:------------------|
| インスタンスの命名     | Dolphin           |
| コンパートメントに作成 | username (ルート) |

続けて「Configure placement and hardware」の右側にある「編集」をクリックします。

| 項目                                    | 値                     |
|:----------------------------------------|:-----------------------|
| 可用性ドメイン                          | AD 1 [Always Free対象] |
| Choose a fault domain for this instance | 未チェック             |

使用する OS を変更するため「イメージの変更」ボタンをクリックします。
OS は Ubuntu、CentOS、Oracle Linux、Windows Server 等がありますが、Windows Server は Always Free の対象ではありません。
「Always Free対象」と書かれている OS イメージを選択しましょう。

| 項目                       | 値                                               |
|:---------------------------|:-------------------------------------------------|
| オペレーティング・システム | Canonical Ubuntu 20.04 Minimal [Always Free対象] |

「イメージの選択」ボタンをクリックして OS を選択します。

「シェイプの変更」ボタンをクリックします。

| 項目                   | 値                                       |
|:-----------------------|:-----------------------------------------|
| インスタンス・タイプ   | 仮想マシン [Always Free対象]             |
| シェイプ・シリーズ     | 専門とレガシー                           |
| シェイプ名             | VM.Standard.E2.1.Micro [Always Free対象] |

インスタンスのシェイプは VM.Standard.E2.1.Micro (仮想マシン、1コアOCPU、1 GBメモリー、0.48 Gbpsネットワーク帯域幅) のみが Always Free の対象です。
「シェイプの選択」ボタンをクリックしてシェイプを選択します。

続けてネットワーキングの構成の編集をクリックします。

| 項目                                                             | 値                                       |
|:-----------------------------------------------------------------|:-----------------------------------------|
| ネットワーク                                                     | Select existing virtual cloud network    |
| Virtual cloud network                                            | Dolphin VCN                              |
| サブネット                                                       | Select existing subnet                   |
| Subnet                                                           | Public Subnet Dolphin VCN (リージョナル) |
| ネットワーク・セキュリティ・グループを使用してトラフィックを制御 | ✓                                       |
| ネットワーク・セキュリティ・グループ                             | WEB Network Security Group Dolphin VCN   |
| Public IP address                                                | パブリックIPアドレスの割当て             |

ここでパブリック IP アドレスの割当てを選択しないとパブリック IP アドレスが割り当てられず外部に公開できません。
この設定は後から変更できないようなので注意してください。

続けて SSH 公開鍵ファイルを追加します。
先程作成した公開鍵(拡張子 .pub のファイル)を SSH キー・ファイルに設定します。

| 項目                    | 値                |
|:------------------------|:------------------|
| SSHキー・ファイルの選択 | ✓                |
| SSHキー                 | ~/.ssh/id_rsa.pub |

Configure boot volume で次の値を入力します。

| 項目                                             | 値         |
|:-------------------------------------------------|:-----------|
| カスタム・ブート・ボリューム・サイズを指定します | ✓         |
| ブート・ボリューム・サイズ(GB)                   | 50         |
| 転送中暗号化の使用                               | 未チェック |
| 自分が管理するキーでこのボリュームを暗号化       | 未チェック |

「拡張オプションの表示」をクリックして隠れている項目を表示し、「ネットワーキング」をクリックし次の値を入力します。

| 項目     | 値      |
|:---------|:--------|
| ホスト名 | dolphin |

この設定により内部 FQDN が`dolphin.publicsubnet.dolphinvcn.oraclevcn.com`となります。

入力したら「作成」ボタンをクリックして WEB サーバーのインスタンスを作成します。

## DB サーバーのインスタンスの作成
続けて DB サーバーのインスタンスを作成します。

WEB サーバーのインスタンスの作成と同じようにして DB サーバーのインスタンスの値を設定していきます。

| 項目                                                             | 値                                               |
|:-----------------------------------------------------------------|:-------------------------------------------------|
| インスタンスの命名                                               | Dolphin DB                                       |
| コンパートメントに作成                                           | username (ルート)                                |
| 可用性ドメイン                                                   | AD 1 [Always Free対象]                           |
| Choose a fault domain for this instance                          | 未チェック                                       |
| オペレーティング・システム                                       | Canonical Ubuntu 20.04 Minimal [Always Free対象] |
| インスタンス・タイプ                                             | 仮想マシン [Always Free対象]                     |
| シェイプ・シリーズ                                               | 専門とレガシー                                   |
| シェイプ名                                                       | VM.Standard.E2.1.Micro [Always Free対象]         |
| ネットワーク                                                     | Select existing virtual cloud network            |
| Virtual cloud network                                            | Dolphin VCN                                      |
| サブネット                                                       | Select existing subnet                           |
| Subnet                                                           | Private Subnet Dolphin VCN (リージョナル)        |
| ネットワーク・セキュリティ・グループを使用してトラフィックを制御 | ✓                                               |
| ネットワーク・セキュリティ・グループ                             | DB Network Security Group Dolphin VCN            |
| Public IP address                                                | パブリックIPアドレスを割り当てないでください     |
| SSHキー・ファイルの選択                                          | ✓                                               |
| SSHキー                                                          | ~/.ssh/id_rsa.pub                                |
| カスタム・ブート・ボリューム・サイズを指定します                 | ✓                                               |
| ブート・ボリューム・サイズ(GB)                                   | 50                                               |
| 転送中暗号化の使用                                               | 未チェック                                       |
| 自分が管理するキーでこのボリュームを暗号化                       | 未チェック                                       |
| ホスト名                                                         | dolphin-db                                       |

入力したら「作成」ボタンをクリックして DB サーバーのインスタンスを作成します。

## WEB サーバーのインスタンスに SSH 接続
WEB サーバーのインスタンスでは「パブリックIPアドレスの割当て」をしているので外部に公開されています。

左上の三本線メニューをクリックして「**コンピュート > インスタンス**」をクリックして表示されるインスタンス一覧から「Dolphin」インスタンスをクリックしてインスタンスの詳細を表示します。
![インスタンスの詳細](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/35a71f95-1f81-0ead-c0ba-b7e0587ada8e.png)

インスタンス・アクセス情報の下にパブリック IP アドレスが記載されています。
後で使用しますので値を控えておいてください。

作成されたインスタンスでは`root`での SSH 接続は無効にされていて、[Oracle提供のイメージ#Linuxイメージの詳細](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Compute/References/images.htm#one)の「ユーザー」に書かれているように Oracle Linux または CentOS の場合は`opc`、Ubuntu の場合は`ubuntu`ユーザーで SSH 接続できるようになっています。

ターミナルから WEB サーバーのインスタンスに SSH 接続を行なうため、次のコマンドを入力してください。

Oracle Linux または CentOS の場合

```shell:terminal
$ ssh opc@パブリックIPアドレス -i ~/.ssh/id_rsa
```

Ubuntu の場合

```shell:terminal
$ ssh ubuntu@パブリックIPアドレス -i ~/.ssh/id_rsa
```

接続が確認できたら一旦`exit`で切断してください。

毎回このコマンドを打つ代わりに、[.ssh/configファイルでSSH接続を管理する](https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1)等を参考にパブリック IP アドレスや秘密鍵のパスを設定ファイルに記述します。

```config:.ssh/config
Host dolphin
    Hostname パブリックIPアドレス
    User opc または ubuntu
    Port 22
    IdentityFile ~/.ssh/id_rsa
```

これにより、次のコマンドで SSH 接続できるようになります。

```shell:terminal
$ ssh dolphin
```

余談ですが、SSH のポートは仮想クラウド・ネットワークのセキュリティ・リストの「Default Security List for Dolphin VCN」によって許可されています。
SSH 接続のポート番号を変更したい場合は、`iptables`や`firewalld`で該当ポートを開けた上で、セキュリティ・リストの「Default Security List for Dolphin VCN」でも該当ポートを許可してください。

## DB サーバーのインスタンスに SSH 接続
DB サーバーのインスタンスはプライベート・サブネットにあるためパブリック IP アドレスは割り当てられていません。

そのため DB サーバーのインスタンスに SSH 接続するためには先に WEB サーバーのインスタンスに SSH 接続し、そこから DB サーバーのインスタンスに SSH 接続するというように多段 SSH 接続をする必要があります。

DB サーバーのインスタンスにはプライベート IP アドレスまたは内部 FQDN で接続します。

DB サーバーのインスタンスのプライベート IP アドレスと内部 FQDN は「Dolphin DB」インスタンスの詳細に表示されています。
![インスタンスの詳細2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/0a2c9283-00d8-b515-262f-77219c0a55ed.png)

プライベート IP アドレスまたは内部 FQDN は後で使用しますので値を控えておいてください。

多段 SSH 接続をワンライナーで実行する方法があるので[ProxyCommandを使って踏み台(Bastion)経由で直接ssh/scpする](https://dev.classmethod.jp/beginners/direct-ssh-by-proxycommand/)等を参考にして設定ファイルに記述します。

`.ssh/config`ファイルの最後の行に追加してください。

```config:.ssh/config
Host dolphin-db
    HostName プライベートIPアドレス または 内部FQDN
    User opc または ubuntu
    Port 22
    IdentityFile ~/.ssh/id_rsa
    ProxyCommand ssh %r@dolphin -W %h:%p
```

次のコマンドで SSH 接続できるようになります。

```shell:terminal
$ ssh dolphin-db
```

## NAT インスタンスの設定
 <ins>[2021/6/22 この項を追記]

プライベート・サブネット内のインスタンスはインターネットに公開されないのですが、このままではインターネットに接続ができないためインスタンスの構築に必要なソフトウェアのダウンロードもできません。

内部からインターネットに接続できるようにするために NAT ゲートウェイが使用できればよいのですが、Always Free では作成できないようですので WEB サーバーのインスタンスを NAT インスタンスとして設定します。
 <ins>参考 PDF: [NATインスタンスの構成 - Oracle Help Center](https://docs.oracle.com/cd/F34086_01/nat-instance-configuration_jp.pdf)</ins>

[Oracle Cloud Infrastructure コンソール](https://console.ap-tokyo-1.oraclecloud.com/) の左上の三本線メニューをクリックして「**コンピュート > インスタンス**」をクリックして表示されるインスタンス一覧から「Dolphin」インスタンスをクリックしてインスタンスの詳細を表示します。

左下に表示されているリソース一覧から「**アタッチされたVNIC**」をクリックします。

表示された アタッチされたVNIC の右端の…にマウスカーソルを合わせてメニューを表示し、「**VNICの編集**」をクリックします。

「**ソース/宛先チェックのスキップ**」にチェックマークを入れて「**VNICの更新**」をクリックします。

先の[参考 PDF](https://docs.oracle.com/cd/F34086_01/nat-instance-configuration_jp.pdf) によると、

> **注意**: このステップは重要です。実行しない場合、デフォルトで有効化されているセキュリティ機能が原因で、その他のインスタンスはNATゲートウェイを介してトラフィックを送信できません。
> ソース/宛先チェックがある状態でVNICにルート・ターゲットの構成を試行すると、エラー・メッセージが表示されます。

とのことです。

次に、プライベート・サブネット内から外部への通信をパブリック・サブネット内の Dolphin インスタンスにルーティングするように設定します。

再度「Dolphin」インスタンスの詳細を表示します。

プライマリVNICの下にプライベート IP アドレスが記載されていますので値を控えておいてください。

次に、左上の三本線メニューをクリックして「**ネットワーキング > 仮想クラウド・ネットワーク**」をクリックして表示される仮想クラウド・ネットワーク一覧から「Dolphin VCN」をクリックして仮想クラウド・ネットワークの詳細を表示します。

左下に表示されているリソース一覧から「**ルート表**」をクリックし、表示された画面の「**Private Subnet Route Table Dolphin VCN**」をクリックし、表示された画面の「**ルート・ルールの追加**」ボタンをクリックします。

表示された入力画面に次のように入力します。

| 項目                   | 値                                                          |
|:-----------------------|:------------------------------------------------------------|
| プロトコルのバージョン | IPV4                                                        |
| ターゲット・タイプ     | プライベートIP                                              |
| 宛先タイプ             | CIDRブロック                                                |
| 宛先CIDRブロック       | 0.0.0.0/0                                                   |
| ターゲット選択         | 控えておいた Dolphin インスタンスのプライベート IP アドレス |

入力したら「ルート・ルールの追加」ボタンをクリックします。

これでプライベート・サブネット内から外部への通信が Dolphin インスタンスにルーティングされるようになりました。

ですが、このままでは Dolphin インスタンスのファイアウォールによってプライベート・サブネットからの通信が拒否されてしまうため、転送の許可と NAT の設定をします。

「Dolphin」インスタンスに SSH 接続します。

```shell:terminal
$ ssh dolphin
```

NAT のためのパケット転送を有効にします。

```shell:terminal
$ sudo sysctl -w net.ipv4.ip_forward=1
```

ただ、これは一時的な設定で、インスタンスを再起動すると設定が元に戻ってしまいます。
再起動しても有効にするための設定ファイルを作成します。

```shell:terminal
$ sudo sh -c 'echo net.ipv4.ip_forward = 1 > /etc/sysctl.d/98-ip-forward.conf'
```

続けてファイアウォールの設定をしますが、先にネットワークインターフェイス名を取得します。

```shell:terminal
$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 01:23:45:67:89:ab brd ff:ff:ff:ff:ff:ff
```

上記のコマンドを実行し、lo ではない方の名前を控えておきます。
この例では enp0s3 です。

次にファイアウォール設定ファイルのバックアップを取ってから設定を変更します。
2 ヶ所ある enp0s3 の部分は環境に合わせて変更してください。

```shell:terminal
$ sudo cp /etc/iptables/rules.v4 /etc/iptables/rules.v4.bak
```

```shell:terminal
$ sudo sed -i "/^\*filter$/i*nat" /etc/iptables/rules.v4
$ sudo sed -i "/^\*filter$/i:PREROUTING ACCEPT [0:0]" /etc/iptables/rules.v4
$ sudo sed -i "/^\*filter$/i:INPUT ACCEPT [0:0]" /etc/iptables/rules.v4
$ sudo sed -i "/^\*filter$/i:OUTPUT ACCEPT [0:0]" /etc/iptables/rules.v4
$ sudo sed -i "/^\*filter$/i:POSTROUTING ACCEPT [0:0]" /etc/iptables/rules.v4
$ sudo sed -i "/^\*filter$/i-A POSTROUTING -o enp0s3 -j MASQUERADE" /etc/iptables/rules.v4
$ sudo sed -i "/^\*filter$/iCOMMIT" /etc/iptables/rules.v4
$ sudo sed -i "/^-A FORWARD /i-A FORWARD -i enp0s3 -j ACCEPT" /etc/iptables/rules.v4
```

変更したファイアウォールを反映させます。

```shell:terminal
$ sudo netfilter-persistent reload
```

これで NAT インスタンスの設定が完了しました。
「Dolphin DB」インスタンスからインターネット接続できるかどうか確認します。

「Dolphin」インスタンスから`exit`で切断した後、「Dolphin DB」インスタンスに SSH 接続します。

```shell:terminal
$ ssh dolphin-db
```

試しに適当なサイトにアクセスしてみます。

```shell:terminal
$ curl -I https://qiita.com/
```

HTTP/2 200 のような表示が返れば成功です。
プライベート・サブネット内のインスタンスからインターネットに接続できるようになりました。
# オブジェクト・ストレージ
## バケットの作成
Dolphin や Mastodon では画像や動画等のメディアファイルを Amazon S3 に保存できるようになっています。

Oracle Cloud のオブジェクト・ストレージは Amazon S3 と互換性のある API が提供されているため、Amazon S3 の代わりに Oracle Cloud のオブジェクト・ストレージを使用することができます。

オブジェクト・ストレージを作成するため、左上の三本線メニューをクリックして「**オブジェクト・ストレージ > オブジェクト・ストレージ**」をクリックします。
![オブジェクト・ストレージ_オブジェクト・ストレージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/3dd714e3-6f17-5546-d2f8-55eb9ae09420.png)

表示されたページの「**バケットの作成**」ボタンをクリックします。
![バケット一覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/c4f53073-9bd6-ff1e-5a4f-ad03c7ee5d36.png)

表示された入力画面に次のように入力します。

| 項目                         | 値                             |
|:-----------------------------|:-------------------------------|
| バケット名                   | dolphin                        |
| デフォルト・ストレージ層     | 標準                           |
| オブジェクト・イベント       | 未チェック                     |
| オブジェクト・バージョニング | 未チェック                     |
| 暗号化                       | ORACLE管理キーを使用した暗号化 |

作成されたオブジェクト・ストレージは可視性がプライベートになっていますが、Dolphin や Mastodon 等ではメディアの閲覧を制限しないようにする必要があるため、可視性をパブリックに変更します。

「dolphin」バケットの右端の…にマウスカーソルを合わせてメニューを表示し、「**可視性の編集**」をクリックします。
![バケット_可視性の編集](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/7b1d8c1e-590e-29ae-e376-2d11efc6cff9.png)

表示された入力画面に次のように入力します。

| 項目                                                   | 値         |
|:-------------------------------------------------------|:-----------|
| 可視性                                                 | パブリック |
| ユーザーにこのバケットのオブジェクトのリスト表示を許可 | 未チェック |

# アクセス・キーと秘密キーの取得
Amazon S3 として使用するためのアクセス・キーと秘密キーを取得します。

左上の三本線メニューをクリックして「**アイデンティティ > ユーザー**」をクリックします。
![アイデンティティ_ユーザー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/16b4f357-5ccb-feda-eea4-c97c7ccebe96.png)

ユーザーの一覧から「電子メール」が書かれている方のユーザーの名前をクリックします。

左下のリソース一覧から「**顧客秘密キー**」をクリックします。
![ユーザー_リソース](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/2c557bc4-0ad4-29da-2a28-0ff5e2fba3ae.png)

「**秘密キーを生成**」ボタンをクリックして、入力画面に次のように入力します。

| 項目 | 値                          |
|:-----|:----------------------------|
| 名前 | Dolphin Customer Secret Key |

入力したら「秘密キーを生成」ボタンをクリックします。
![秘密キーの生成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/0399079d-2bb5-03bf-97fe-3344f0dced94.png)

生成された秘密キーが表示されているので値を控えておいてください。
この秘密キーは再度表示させることができないので注意してください。

「閉じる」ボタンをクリックします。
![顧客秘密キー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/d1e33803-cb88-9b46-0605-9bf1f34d5226.png)

顧客秘密キーの一覧で名前が「Dolphin Customer Secret Key」のもののアクセス・キーにカーソルを合わせるとアクセス・キーが表示されます。

# エンドポイントの確認
Amazon S3 として使用するためのエンドポイントは、次のように構成されます。

`<ネームスペース>.compat.objectstorage.<リージョン>.oraclecloud.com`

ネームスペースは、「**オブジェクト・ストレージ > オブジェクト・ストレージ**」をクリックし、表示された画面の「dolphin」をクリックして表示されるバケットの詳細ページに記述されています。
![バケットの詳細](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/bd3b5a57-2c08-9c8f-31c8-e59f1615ba38.png)

リージョンは、「**コンピュート > インスタンス**」をクリックし、表示された画面の「Dolphin」をクリックして表示されるインスタンスの詳細ページに記述されています。
![インスタンスの詳細](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535205/35a71f95-1f81-0ead-c0ba-b7e0587ada8e.png)

# まとめ
分散 SNS の Dolphin をインストールするための VM インスタンスの作成と SSH での接続、オブジェクト・ストレージの作成とアクセス・キーと秘密キーの取得、エンドポイントの確認を行ないました。
<br>
Dolphin のインストールに続きます。
[Oracle Cloud Always Free で Dolphin サーバーを立てる](https://qiita.com/xianon/items/7ed6d52ff3b64f5fb26a)