OCI Bastion経由でプライベート・サブネット内のOracle Analytics Cloudに接続

本ブログは、下記シリーズ記事の1つです。
- [オラクル・クラウドの個人ブログ](https://qiita.com/letian/items/10152a4fec813c1b7d98)
- [OCI Bastion サービス](https://qiita.com/letian/items/10152a4fec813c1b7d98#bastion-%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9)

# 初めに

プライベート・サブネットにOracle Analytics Cloud (OAC)を作成した場合、OACへのアクセスはプライベート・エンドポイントを介して行います。VPNを設定しない場合、OCI Bastionサービスを利用すると、踏み台サーバを構築せずにOn-Pのクライアントからプライベート・サブネット内のOACに接続できます。OCI Bastionサービスは<font color=blue>無料</font>で利用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/a648a927-0431-e92d-5f40-f8e75410bd60.png)

__検証環境__

OAC アクセス・タイプ：プライベート
OAC エディション：Professional（Enterpriseにも適用する）
クライアントOS：Windows 11
SSHソフト：OpenSSH

__ステップ__
- [1. 事前準備](#1-事前準備)
- [2. Bastionの作成](#2-bastionの作成)
- [3. セッションの作成](#3-セッションの作成)
- [4. NSGにイングレス・ルールを追加する](#4-nsgにイングレスルールを追加する)
- [5. ホストファイルの編集](#5-ホストファイルの編集)
- [6. SSHトンネルの作成](#6-sshトンネルの作成)
- [7. OACに接続する](#7-oacに接続する)
- [付録](#付録)
  - [トラブル・シューティング](#トラブルシューティング)
  - [Bastionの制限](#bastionの制限)

# 1. 事前準備
__OACのアクセス情報を確認__
「インスタンスの詳細」から、<strong>アクセスURL</strong>をコピーし、メモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ac653e59-ef95-c7d7-c075-662eb70fead9.png)

「追加詳細」から、<strong>ホスト名</strong>と<strong>IPアドレス</strong>をコピーし、メモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/10645a31-0e91-45c2-f6dd-7f398f96ebf1.png)

# 2. Bastionの作成
アイデンティティとセキュリティ > 要塞 > 要塞の作成

|項目|内容|
|--|--|
|要塞名|適当な名前を入力|
|ターゲットVCNとサブネット|OACが所属するVCNとサブネットを選択|
|CIDRブロック許可リスト|このテストではCIDRブロックの許可リストを「0.0.0.0/0」に設定しているが、運用時には範囲を絞り込むことが推奨される。例えば、 接続元（クライアント）のIPアドレスのみを許可するように。|

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/b317fbf1-1e63-037a-52df-921cd779b950.png", width="500">

__注意__
OCI Bastionを作成する際には、<strong>ターゲット</strong>のVCNとサブネットを指定する必要がありますが、<strong>Bastion自体</strong>に対しては、<strong>置き場所の指定は不要</strong>です。

Bastionはアクティブの状態になりましたら、「<font color=blue>プライベート・エンドポイントIP</font>」は以下の画面から確認できます。このIPが、ターゲット・サブネット内で自動割り当てられます。次のステップでこのIPをNSGの入力ルールに追加します。 「CIDRブロック許可リスト」を編集したい場合は、「<strong>編集</strong>」ボタンをクリックすればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/25afbdb3-fc7b-3a07-7be5-1916e5bacb72.png)

# 3. セッションの作成
要塞 > セッション > セッションの作成
|項目|内容|
|--|--|
|セッション・タイプ|"<font color=blue>SSHポート転送セッション</font>"を選択|
|ターゲット・ホストに接続する方法|"IPアドレス"を選択 (デフォルト)|
|IPアドレス|OACの「IPアドレス」|
|ポート|<font color=blue>443</font>
|SSHキー|既存のキーファイルを利用するか、新しいキーペアを作成する。|

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/57268190-0525-c182-6886-a80373d96243.png", width="450">

セッションはアクティブの状態になりましたら、次のように、3ドットのメニューをクリックしてSSHコマンドをコピーします。このコマンドは、[「STEP 6. SSHトンネルの作成」](#6-sshトンネルの作成)で使用されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/67baa5f1-1457-f959-68f5-f58d1a6f8ac7.png)
デフォルトでは、セッションは3時間有効ですが、Bastionを作成する際にはこの期間を変更することが可能です。

# 4. NSGにイングレス・ルールを追加する
OACにアクセスするためには、Bastionのプライベート・エンドポイントからのイングレス(TCPポート433)を許可する必要があります。

ネットワーク・セキュリティ・グループ（NSG）を作成する：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/88b0f2ea-2f1f-db9b-517d-062638f0ce9d.png)
※、"<strong>ソースCIDR</strong>"は、Bastionの「プライベート・エンドポイントIP」です（Bastionの情報画面に表示されます）。

OACインスタンスのアクセス制御を編集する：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/6d240caf-dd8b-79c2-1e16-61a3a37dcdd9.png)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/0e404892-045f-b3d5-4565-068d7b294c1c.png", width="500">

# 5. ホストファイルの編集
接続クライアントに、次のファイルを編集します。

__ファイル名__
Windows OS: `C:\Windows\System32\drivers\etc\hosts` 
Linux OS: `/etc/hosts`

追加内容: `127.0.0.1 <OAC_hostname>`
例：`127.0.0.1 oacprivate-nrjlzaw7invm-nt.analytics.ocp.oraclecloud.com`
※、ホスト名の後ろは`/ui/`が要らない。
 
# 6. SSHトンネルの作成
クライアント側でSSHコマンドを実行してトンネルを作成します。この例では、OpenSSHを利用します。まだインストールされていない場合、管理者ユーザーでPowerShellを起動して、以下のコマンドでインストールしてください。
コマンド：`Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'`

__SSHトンネルを作成するコマンド__:
```bash
ssh -i <privateKey> -N -L <localPort>:<Private_IP_of_OAC>:443 -p 22 <bastion_ocid>@host.bastion.ap-tokyo-1.oci.oraclecloud.com
```

* `<privateKey>`を秘密キーのパスとファイル名に置き換える。
　Windowsの例（PowerShell）：`$home\.ssh\id_rsa`
* `<localPort>`を<font color=blue>443</font>に置き換える。
* `<Private_IP_of_OAC>`は自動に実のIPが埋められるので、変更する必要がない。

PowerShllのコマンド例：
```powershell
PS C:\Users\opc> ssh -i $home\.ssh\id_rsa -N -L 443:10.0.0.68:443 -p 22 <bastion_ocid>@host.bastion.ap-tokyo-1.oci.oraclecloud.com

```
※、接続成功の場合、コマンドプロンプトを返さない。

# 7. OACに接続する

クライアントのWebブラウザを開き、OACのURLを入力します。
URLの例: `https://oacprivate-nrjlzaw7invm-nt.analytics.ocp.oraclecloud.com/ui/`
※、インスタンスの詳細画面からコピーできる（`/ui/`がある）。

OCIアカウントのログイン画面が表示されたら、ユーザーとパスワードを入力して、ログインします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ae52fee4-505f-4b05-8152-1c56411f24ab.png", width="450">

ログインした後、OACの初期画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ff689061-6db3-fbfa-924f-bdca3bceb02e.png)


# 付録
## トラブル・シューティング
OACへの接続が失敗した場合、以下の原因は一般的です。ご参考ください。

- OACインスタンスは、まだ起動していない。
- TCP 443ポートは、イングレス・ルールに追加されていない。
- SSHトンネルは未作成か、作成が失敗した。
トンネル作成失敗、或いはタイムアウトの時、以下のメッセージが表示される。
`Connection to host.bastion.ap-tokyo-1.oci.oraclecloud.com closed by remote host.`
- Bastionのセッション期限が切れた（デフォルトは３時間）。
セッション期限が切れた後、SSHトンネルを作成しようとしたら、以下のエラーが発生する。
`<bastion_ocid>@host.bastion.ap-tokyo-1.oci.oraclecloud.com: Permission denied (publickey)`
対策：セッションを再作成する。

## Bastionの制限

|項目|内容|
|--|--|
|最大Bastion数|テナンシ毎に<font color=blue>5つ</font>|
|最大セッション数|Bastionあたり<font color=blue>20</font>セッション|
|最大セッション存続時間|<font color=blue>3時間</font>|
|最小セッション存続時間|30分|
|データ転送制限|データ転送の制限はありません。<br>ただし、SSH接続あたりの接続速度は<font color=blue>16 Mbps</font>に制限されます。|

以上です。


__関連記事__
[Oracle Analytics Cloud に関するFAQ](https://qiita.com/letian/items/eaca95c40a24c9d2027a)