【OCI クラウド移行ガイド】 AWSとOCIをVPNで接続してみた 

# OCIクラウド移行ガイドとは

オンプレミスやAWSなど、複数のプラットフォームからOracle Cloud Infrastructureへの移行プロジェクトに取り組んでいるクラウドエンジニア（@araidon,@kazunishi,@yama6）による、OCI移行手順をまとめたシリーズ記事です。
各回、サンプルワークロードから対象サービスを取り上げ、移行手順をガイドいたします。

# 移行したいサンプルワークロード

日々の業務でよく目にするサービスを中心に、サンプルワークロードとしてまとめてみました。このシリーズでは、主にAWSからの移行を取り上げます。
このワークロードは、ユーザがログインして、Web上で写真を共有するWebサービスをイメージしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/1c9074f1-d4df-e201-1274-0b92d49837e1.png)

# 移行するサービス：Amazon VPC内のリソース群

今回は、移行したいサービスの準備作業として、Amazon VPCとOCI VCNをVPN接続します。
VPN接続を準備することで、セキュアにAmazon VPC内に存在するリソースをOCI VCN内に移行することができます。
例えば、以前書いた、Amazon AuroraからMDSへの移行では、プライベートサブネットに存在するDB同士でレプリケーションを貼っていますが、このようにプライベート接続でのデータ通信が可能になります。

https://qiita.com/yama6/items/fada67bcba046286d8ad


# 移行イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/4a234b8e-7be7-6df7-4edd-e0a4aebedcc7.png)

それぞれのクラウドでネットワークから作成し、必要なリソースを作成していきます。
リソースを作成し、ネットワークが接続できたら、疎通確認のため、AWSからOCIのCompute インスタンスへのssh接続、OCIからAWSのComputeインスタンスへのssh接続を行ってみます。

# 前提条件
・AWSアカウントとOCIアカウントを契約していること
・本記事で扱うサービスに権限が付与されているユーザを使用すること

# 移行手順
1. AWSネットワークの作成
1. AWS インスタンスの作成
1. OCI ネットワークの作成
1. VPC：VPN接続の設定
1. OCI：OCI ネットワークの設定とインスタンスの作成
1. クラウド疎通確認


# 1. AWS ネットワークの作成
:::note warn
前提条件として、VPCが作成済みで、疎通確認ができているパブリックサブネットとプライベートサブネットにインスタンスがそれぞれある場合、冗長なガイドかもしれません。OCIとの接続部分に注目して読み進めてください。
:::

# 1-1. VPC：VPCの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/ad13b495-f5e6-9380-8e1f-e9e5147df509.png)

入力項目は下記のとおりです。
|パラメータ  |値  
|---|---
|名前タグ  |toOCI（任意）
|IPv4 CIDR  |10.1.0.0/16（任意）

:::note warn
CIDRは任意ですが、OCI側と被らないアドレス範囲で作成する必要があります。
:::

入力後、「VPCを作成」ボタンを押下してください。

# 1-2. VPC：カスタマーゲートウェイの作成
AWSコンソール画面左のVPCダッシュボードから、仮想プライベートネットワーク(VPN)にスクロールしてください。そこから、カスタマーゲートウェイを選択します。
「カスタマーゲートウェイの作成」ボタンを押下し、作成画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/3957653a-e834-9e5a-6a1d-d7e99ebe433c.png)

入力項目は下記のとおりです。
|パラメータ  |値  
|---|---
|名前タグ  |toOCI-cgw（任意）
|IPv4 CIDR  |1.1.1.1（任意）

ここで入力するはダミーアドレスになりますので、任意です。
本ガイドでは、Oracle Cloud Infrastructure ドキュメントの下記手順に従って"1.1.1.1"を入力しています。また、カスタマーゲートウェイ作成時、以前は、ルーティングの項目で静的または動的が選択できましたが、現在のUIではなくなっています。今回は、静的ルーティングを前提に接続していきます。

https://docs.oracle.com/ja-jp/iaas/Content/Network/Tasks/vpn_to_aws.htm

入力後、「カスタマーゲートウェイを作成」ボタンを押下してください。

# 1-3. VPC：仮想プライベートゲートウェイの作成

次に、仮想プライベートゲートウェイを作成します。
仮想プライベートゲートウェイの画面から、「仮想プライベートゲートウェイ」ボタンを押下して作成画面に遷移してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/99d89d50-894d-8f5a-35cd-cb74fa46314f.png)
入力項目は下記のとおりです。
|パラメータ  |値  
|---|---
|名前タグ  |toOCI-vgw（任意）

入力後、「仮想プライベートゲートウェイ」ボタンを押下してください。

# 1-4. VPC：仮想プライベートゲートウェイのアタッチ
次に、この仮想プライベートゲートウェイを、先ほど作成したVPCに紐づけます。
仮想プライベートゲートウェイの一覧画面から、作成した仮想プライベートゲートウェイを選択し、画面右上のアクションボタンを押下してください。リストが表示されるので、「VPCへアタッチ」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/b64d3946-da4c-6871-5b40-abdbc72142b8.png)

使用可能なVPCのリストを押下し、先ほど作成したVPC "toOCI"を選択したあと、VPCへアタッチボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/5c5667ca-c1bd-9103-90f6-885b8afae178.png)

しばらくすると、状態が"Attached"となります。

# 1-5. VPC：VPN接続の作成

AWSコンソール画面左のVPCダッシュボードから、「Site-to-site VPN接続」を選択します。
VPN接続の一覧画面から、「VPN接続を作成する」ボタンを押下して作成画面に遷移してください。

入力項目は下記のとおりです。
|パラメータ  |値  
|---|---
|名前タグ  |toOCI-vpn（任意）
|ターゲットゲートウェイのタイプ  |仮想プライベートゲートウェイ
|仮想プライベートゲートウェイ  |toOCI-vgw　を選択
|カスタマーゲートウェイ ID  |toOCI-cgw　を選択
|ルーティングオプション  |静的　を選択
|静的 IP プレフィックス  |10.2.0.0/16 *

*このIPアドレスが、のちにOCIで作成するVCNのCIDRとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/d8288d01-a369-c8e0-db50-a927bc83a474.png)

「トンネル1オプション」の▶ボタンをクリックし、オプション項目を設定します。
設定には、下記記事の「商用クラウドでサポートされているパラメータ」を参考にしました。

https://docs.oracle.com/ja-jp/iaas/Content/Network/Reference/supportedIPsecparams.htm#ariaid-title2

入力項目は下記のとおりです。

|パラメータ  |値  
|---|---
|トンネル 1 の詳細オプション  |トンネル 1 オプションを編集する を選択
|フェーズ 1 暗号化アルゴリズム  |AES-256
|フェーズ 2 暗号化アルゴリズム  |AES-256
|フェーズ 1 整合性アルゴリズム  |SHA-2 384 
|フェーズ 2 整合性アルゴリズム  |SHA-2 256
|フェーズ 1 DH グループ番号  |20
|フェーズ 2 DH グループ番号  |5
|IKE バージョン  |ikev1
|フェーズ 1 の有効期間 (秒)  |28800
|フェーズ 2 の有効期間 (秒)  |3600
|DPD タイムアウトアクション  |再起動
|設定画面  |　👇
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/05e0b381-d578-35b4-3e71-a288bcd9ac7c.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/8ceb2b1a-70be-7a69-335c-09c1d460de5b.png)
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/6cf58b14-e161-aa23-0196-011a49027a82.png)|


上記にない項目は空欄もしくはデフォルト値、トンネル 2 オプションはデフォルト値のままでOKです。

:::note warn
このVPN接続を作成すると、1時間当たり0.05USDの課金が発生します。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/a990c950-04dd-ab4c-40db-c8411190d6e0.png)

しばらくすると、状態が"pending"から"Available"になります。

# 1-6. VPC：VPN設定ファイルの確認

「設定をダウンロードする」ボタンを押下します。
ボタンを押下すると、ポップアップ画面が表示されます。
ベンダー欄で"Generic"を選択し、ダウンロードボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/cc588b83-3974-bee6-b074-5efdb8dbf828.png)

ダウンロードされたテキストファイルを確認します。
このあと、OCI側の設定で、このテキストファイルの値を使用します。

Pre-Shared Key
```
IPSec Tunnel #1
================================================================================
#1: Internet Key Exchange Configuration

Configure the IKE SA as follows:
Please note, these sample configurations are for the minimum requirement of AES128, SHA1, and DH Group 2.
Category "VPN" connections in the GovCloud region have a minimum requirement of AES128, SHA2, and DH Group 14.
You will need to modify these sample configuration files to take advantage of AES256, SHA256, or other DH groups like 2, 14-18, 22, 23, and 24.
NOTE: If you customized tunnel options when creating or modifying your VPN connection, you may need to modify these sample configurations to match the custom settings for your tunnels.

Higher parameters are only available for VPNs of category "VPN," and not for "VPN-Classic".
The address of the external interface for your customer gateway must be a static address.
Your customer gateway may reside behind a device performing network address translation (NAT).
To ensure that NAT traversal (NAT-T) can function, you must adjust your firewall !rules to unblock UDP port 4500.
If not behind NAT, and you are not using an Accelerated VPN, we recommend disabling NAT-T. If you are using an Accelerated VPN, make sure that NAT-T is enabled.
  - IKE version              : IKEv1
  - Authentication Method    : Pre-Shared Key
  - Pre-Shared Key           : <この値を使用します>
  - Authentication Algorithm : sha1
  - Encryption Algorithm     : aes-128-cbc
  - Lifetime                 : 28800 seconds
  - Phase 1 Negotiation Mode : main
  - Diffie-Hellman           : Group 2
```

Outside IP Addresses : Virtual Private Gateway
```
#3: Tunnel Interface Configuration

Your Customer Gateway must be configured with a tunnel interface that is
associated with the IPSec tunnel. All traffic transmitted to the tunnel
interface is encrypted and transmitted to the Virtual Private Gateway.



The Customer Gateway and Virtual Private Gateway each have two addresses that relate
to this IPSec tunnel. Each contains an outside address, upon which encrypted
traffic is exchanged. Each also contain an inside address associated with
the tunnel interface.

The Customer Gateway outside IP address was provided when the Customer Gateway
was created. Changing the IP address requires the creation of a new
Customer Gateway.

The Customer Gateway inside IP address should be configured on your tunnel
interface.

Outside IP Addresses:
  - Customer Gateway 		        : 1.1.1.1
  - Virtual Private Gateway	        : <この値を使用します>

Inside IP Addresses
  - Customer Gateway         		: XXX.XXX.XXX.XXX/30
  - Virtual Private Gateway             : XXX.XXX.XXX.XXX/30

Configure your tunnel to fragment at the optimal size:
  - Tunnel interface MTU     : 1436 bytes
```

:::note warn
Pre-Shared Keyの中に、 _ （アンダースコア）が入っている場合、OCI側で値を設定することができません。その場合、次の章に進んでPre-Shared Keyの変更を行ってください。入っていない方は、1-8. VPC：サブネットの作成 に進んでください。
:::

# 1-7. VPC：Pre-Shared Key の 変更

Pre-Shared Keyの中に、 _ （アンダースコア）が入っている場合、この値を変更します。
まず、「トンネルの詳細」タブを切替え、Tunnel1の外部IPアドレスを確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/99bb431c-0069-343f-2c74-150e42c52189.png)
次に、 VPNトンネルオプションを変更 を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/acc7bd77-c410-2d4c-9570-72888b901f5a.png)
VPN トンネル外部 IP アドレス欄で、確認した外部IPアドレスを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/ee8e272e-5edd-dbfb-5f0b-1ab7055fd74f.png)

選択後、詳細が表示されます。
事前共有キーがテキストボックスで編集できるため、そこから _（アンダースコア）の文字を削除してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/913979ed-a879-829f-501b-82d6454acbf9.png)

最後に、「変更を保存」ボタンを押下すると、再び状態が "Modifying" になります。
しばらくして"Available"になったら、変更完了です。

# 1-8. VPC：サブネットの作成
疎通確認用にリソースを用意します。まずは、パブリックサブネットと、プライベートサブネットを作成します。
作成前にVPCの詳細画面から、リソースマップを確認すると、VPCとデフォルトのルートテーブルのみ作成されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/4e46aa20-68d7-b95a-a687-d82150e9dc1f.png)
ここにまずサブネットを作成していきます。

サブネット作成画面から、下記を入力し、作成します。

|パラメータ  |パブリックサブネット  |プライベートサブネット
|---|---|---|
|VPC ID  |toOCIを選択|toOCIを選択
|サブネット名  |toOCI-pub（任意）|toOCI-pri（任意）
|IPv4 subnet CIDR block  |10.1.3.0/24|10.1.1.0/24

# 1-9. インターネットゲートウェイ の 作成

パブリックサブネット用に、インターネットゲートウェイを作成します。
|パラメータ  |値
|---|---
|名前タグ  |toOCI-igw（任意）

作成後、インターネットゲートウェイを先ほど作成したVPCアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/5a4288c0-afac-c4ff-4233-3a30534d6906.png)

# 1-10. ルートテーブル の 作成

パブリックサブネット用に、ルートテーブルを作成します。
|パラメータ  |値
|---|---
|名前タグ  |toOCI-route（任意）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/0c206c39-9478-4adf-2434-1ab8a4eb33ec.png)

ここで作成したルートテーブルを選択し、「サブネットの関連付け」タブから、「サブネットの関連付けを編集」ボタンを押下します。
toOCI-pub を選択し、「関連付けを保存」ボタンを押下します。
明示的なサブネットの関連付けにtoOCI-pubが設定されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/20f13ece-1a0e-7468-7a01-847dd9219846.png)

「ルート」タブから、ルートを編集ボタンを押下します。
先ほど作成したインターネットゲートウェイをルートに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/502e1efc-6f6d-8eb1-b65e-e6d0e2e33673.png)

VPCの詳細画面からリソースマップを確認すると、サブネットごとにルートテーブルが紐づき、パブリックサブネット用のサブネットにはインターネットゲートウェイが接続されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/05e38d3c-07b6-b179-9cda-ae382bd0b02d.png)

# 1-11. プライベートゲートウェイの紐づけ

プライベートサブネットに紐づくデフォルト・ルートテーブルに、プライベートゲートウェイを紐づけます。
下記を入力し、「変更を保存」ボタンを押下します。
|パラメータ  |値
|---|---
|送信先  |10.2.0.0/16 *
|ターゲット  |先ほど作成した仮想プライベートゲートウェイを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/d9d09547-5030-28f5-95dd-3875eb53ad63.png)

*送信先は、このあと作成するOCIのVCNのIPアドレスです。

:::note warn
ここで、さきほど作成した仮想プライベートゲートウェイは表現されないのか？という疑問が湧きますが、現状リソースマップに仮想プライベートゲートウェイは対応していないそうです。
https://dev.classmethod.jp/articles/vpc-resource-map/
:::

# 2. AWS インスタンスの作成
# 2-1. AWS 踏み台用EC2インスタンスの作成
詳細な手順は割愛しますが、先ほど作成したパブリックサブネットにEC2インスタンスを作成します。
作成後、セキュリティグループを作成し、インバウンドルールでソース"0.0.0.0/0"を許可します。
セキュリティグループを作成したインスタンスに紐づけます。

# 2-2. AWS VPN用EC2インスタンスの作成
詳細な手順は割愛しますが、先ほど作成したプライベートサブネットにEC2インスタンスを作成します。
作成後、セキュリティグループを作成し、インバウンドルールで下記ソースを許可します。
セキュリティグループを作成したインスタンスに紐づけます。

|タイプ  |プロトコル|ポート範囲|ソース|説明
|---|---|---|---|---|
|すべての ICMP - IPv4|ICMP|すべて|10.2.0.0/16| OCIからのping
|SSH|TCP|22|10.1.3.0/24| AWS パブリックサブネットからのssh
|SSH|TCP|22|10.2.0.0/16| OCIからのssh

# 2-3. AWS VPN用EC2インスタンスまでの疎通確認
AWS CloudShellから、踏み台用インスタンスを経由し、 AWS VPN用EC2インスタンスまでの疎通を確認します。

# 2-3-1. AWS VPN用EC2インスタンスまでの疎通確認
AWS CloudShellを開き、アクション⇒ファイルのアップロードから、踏み台用インスタンス、VPN用インスタンス双方のpemキーをアップロードします。
まずは踏み台用インスタンスに接続します。詳細は割愛しますが、EC2の詳細画面から「接続」ボタンを押下すると、ssh接続用のコマンドが出てくるので、それを使うと便利です。

```
[cloudshell-user@ip-10-6-77-116 ~]$ ssh -i "test-pub-key.pem" ec2-user@X.XXX.XXX.XXX
The authenticity of host 'X.XXX.XXX.XXX (X.XXX.XXX.XXX)' can't be established.
ECDSA key fingerprint is SHA256:+X1ezosBLJV7AHrbPfN9hVVl3JAJbq3J/c2zOaZO1JA.
ECDSA key fingerprint is MD5:39:4b:62:60:84:5f:e7:fa:93:c5:84:b4:b0:db:ba:4c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'X.XXX.XXX.XXX' (ECDSA) to the list of known hosts.

A newer release of "Amazon Linux" is available.
  Version 2023.2.20231002:
Run "/usr/bin/dnf check-release-update" for full release and version update info
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
```

このあと踏み台サーバからVPN接続用のインスタンスへ接続したいわけなのですが、cloudshell上にアップロードしたpemキーは踏み台サーバに置く必要があります。
一度CloudShellに戻り、下記コマンドを実行します。

```
scp -i (踏み台サーバのpemキー名) （VPN接続用インスタンスのpemキー名） ec2-user@踏み台サーバのパブリックIPアドレス:/home/ec2-user
```
再度踏み台サーバにログインし、lsコマンドでpemキーが確認できたら、cloudShellから踏み台サーバに接続したときと同じ手順で、VPN用EC2インスタンスに接続します。
```
[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ ssh -i "ec2-test-key.pem" ec2-user@10.1.1.66
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
```
これでAWS内のインスタンス疎通確認は完了です。

# 3. OCI ネットワークの作成
ネットワークを作成する前に、AWSとOCIのネットワークリソースがどのように対応するのか見ていきましょう。
|AWS  |OCI
|---|---
|VPC  |VCN
|カスタマーゲートウェイ(cgw)  |顧客構内機器(CPE)
|仮想プライベートゲートウェイ(vgw)  |動的ルーティング・ゲートウェイ(DRG)
|VPN接続（Site-to-site VPN接続）  |IPSec接続

基本的には、AWSで作成したように、上記リソースをOCIでも作成していきます。

# 3-1. VCN：VCNの作成
VCNの作成画面から作成します。
下記を入力し、作成ボタンを押下します。
|パラメータ  |値
|---|---
|名前  |toAWS（任意）
|IPv4 CIDR blocks  |10.2.0.0/16
|設定画面  |　👇
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/bf836ad5-e968-632b-8f5a-75053d1dc73d.png) |

# 3-2. VCN：顧客構内機器(CPE)の作成
ネットワーキング>顧客構内機器>CPEの作成 から、顧客構内機器(CPE)を作成していきます。
下記を入力し、作成ボタンを押下します。

|パラメータ  |値
|---|---
|名前  |toAWS-cpe（任意）
|IPアドレス |1-6. VPC：VPN設定ファイルの確認で確認したOutside IP Addresses.Virtual Private GatewayのIPアドレスを入力 *
|Cpe vendor information|Other|
|設定画面  |　👇
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/9d7c3638-24d7-6249-b451-35c5ec386ac9.png)|

*スクショの入力値は例です。設定ファイルの値を入力してください。

# 3-3. VCN：動的ルーティング・ゲートウェイの作成
ネットワーキング>動的ルーティング・ゲートウェイ>動的ルーティング・ゲートウェイの作成 から、動的ルーティング・ゲートウェイを作成していきます。
下記を入力し、作成ボタンを押下します。

|パラメータ  |値
|---|---
|名前  |toAWS-drg（任意）
|設定画面  |　👇
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/ad35ea94-4b7e-7fb6-78f7-16249222ff40.png)|

# 3-4. VCN：DRGとVCNの紐づけ

作成したDRGの画面から、「仮想クラウド・ネットワーク・アタッチメントの作成」ボタンを押下します。下記を入力し、作成ボタンを押下します。
|パラメータ  |値
|---|---
|名前  |drg-attached（任意）
|（コンパートメント名）の仮想クラウド・ネットワーク  |3-1で作成したVCN
|設定画面  |　👇
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/4303d54a-b112-c6e3-cf5a-4bba95ef8650.png)

これで作成したVCNにDRGが紐づけられました。


# 3-5. VCN：IPSec接続の作成
ネットワーキング>サイト間VPN>IPSec接続の作成 から、IPSec接続を作成していきます。
下記を入力し、作成ボタンを押下します。

|パラメータ  |値
|---|---
|名前  |toAWS-IPSec（任意）
|(コンパートメント名)の顧客構内機器|toAWS-cpe を選択(3-2で作成したもの)
|(コンパートメント名)の動的ルーティング・ゲートウェイ|toAWS-drg を選択(3-3で作成したもの)
|オンプレミス・ネットワークへのルート|10.1.0.0/16 (AWS VPCのCIDR)
|設定画面  |　👇
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/d20a26b9-9226-0c12-910b-d89a347e3015.png)|
|トンネル1|　
|名前|　toAWS-Tunnel1（任意）
|カスタム共有シークレットの指定|　チェック
|共有シークレット|　1-6. VPC：VPN設定ファイルの確認で確認したPre-Shared Keyの値を入力 *
|IKEバージョン|IKEv1
|ルーティング・タイプ|静的ルーティング
|IPv4トンネル内インタフェース - CPE|(空欄)
|IPv4トンネル内インタフェース- Oracle|(空欄)
|IPv6の有効化|(空欄)
|トンネル2|　
|名前|　toAWS-Tunnel2（任意）
|共有シークレットの指定|チェックなし
|ルーティング・タイプ|静的ルーティング
|IPv4トンネル内インタフェース - CPE|(空欄)
|IPv4トンネル内インタフェース- Oracle|(空欄)
|IPv6の有効化|(空欄)
|設定画面  |　👇
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/b71c7a11-394b-f10b-eb80-d928fa1cb12c.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/2b256ef9-6f28-94f0-ec0c-757c890bfeb5.png)

# 3-6. VCN：IPSec接続 トンネル1のIPアドレス確認
IPSec接続の作成後、リソース画面でトンネル1のOracle VPN IPアドレスを確認してください。
この値が、でダミーで入力した1.1.1.1に代わり、正式な値になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/2c768d0a-200e-3a1d-7966-bcc12ef0cc05.png)

# 4. VPC：VPN接続の設定
OCIでトンネル1のOracle VPN IPアドレスができたら、AWSのコンソール画面に戻り、VPN接続の設定を行います。

# 4-1. VPC：カスタマーゲートウェイの再作成
下記の値を入力し、カスタマーゲートウェイを再作成します。

|パラメータ  |値
|---|---
|名前  |toOCI-cgw（任意）
|IPアドレス|トンネル1のOracle VPN IPアドレス(3-6で確認したもの)
|設定画面  |　👇
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/403499eb-f422-a3b5-2eac-8657d301fb51.png)

# 4-2. VPC：VPN接続の変更
VPN接続の画面に遷移します。
トンネルの詳細タブを見ると、トンネル1のステータスがまだDown状態であることがわかります。
アクションから「VPN接続の変更」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/8d85bcf4-7864-72b6-8281-9529e045612a.png)

現在、ダミーで作成した1.1.1.1がカスタマーゲートウェイとして登録されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/123eaa3f-7410-259a-49d7-965599e7b19b.png)

これを、4-1で作成したカスタマーゲートウェイに変更します。
リストから、4-1で作成したカスタマーゲートウェイを選択し、「変更を保存」ボタンを押下してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/8e56c232-79b4-0d40-a34a-75bbafeef863.png)


状態がModifyingからAvailableになるまでしばらく待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/09a91957-f0ba-246f-9a4d-a13fded3d166.png)

しばらくすると、状態がAvailableとなり、トンネル1のステータスがUpになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/63bdd6e8-d2f4-3543-5ee5-f8ce7917f9fc.png)

:::note warn
状態がAvailableとなり、トンネル1のステータスがUpになる間、少しタイムラグがあります。
:::

OCIのVPN接続の画面を見ると、IPSecのステータスが「稼働中」となっていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/5320b890-b1c1-afeb-4635-61c3718a484e.png)

これで、AWSとOCI間でVPN接続が完了しました。

# 5. OCI：OCI ネットワークの設定とインスタンスの作成
「2. AWS インスタンスの作成」で行ったように、OCI側でも疎通確認用のインスタンス作成、ネットワーク設定を行っていきます。

# 5-1. VCN：ネットワークリソースの作成
現在、OCI側ではVCNと、VPN接続に関するリソースしか作成していないため、接続確認用のインスタンスがDRGからAWSのEC2にsshできるようリソースを作成、設定していきます。

# 5-1-1. VCN：ルートテーブルの編集
「3-1. VCN：VCNの作成」で作成したVCNを選択し、リソースの「ルート表」を選択してください。
Default Route Table for test-vcnという名前でルート表が作成されているため、これを選択します。
ルート・ルールを追加します。ルート・ルールの追加ボタンを押下し、下記値を入力し、追加します。

|パラメータ  |値
|---|---
|ターゲット・タイプ  |動的ルーティング・ゲートウェイ
|宛先CIDRブロック|10.1.0.0/16
|設定画面  |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/7a7842ac-44b2-70d2-e9e6-a9dec090cb19.png)

# 5-1-2. VCN：セキュリティリストの作成

Default Security List for test-vcnの書き換え、もしくは新規でセキュリティリストを作成します。
イングレスルールは下記の通りで、AWS側のVCN CIDRからの接続許可、OCI側の接続許可を行います。

|ソースCIDR  |IPプロトコル|ソース・ポート範囲|ソース・ポート範囲|宛先ポート範囲
|---|---|---|---|---|
|10.1.0.0/16|TCP|ALL|ALL| AWSからの接続
|10.2.0.0/16|TCP|ALL|ALL| OCI VCNからの接続

# 5-1-3. VCN：プライベートサブネットの作成

このあと、疎通確認用インスタンスがプロビジョニングされるプライベートサブネットを作成します。下記値を入力し、追加します。

|パラメータ  |値
|---|---
|名前  |pri-subnet（任意）
|IPv4 CIDR Block|10.2.1.0/24
|ルート表コンパートメント  |Default Route Table for test-vcn
|セキュリティリスト|5-1-2で作成したセキュリティリストを選択

# 5-1-4. VCN：ネットワークビジュアライザによるネットワークの確認
ここまでのネットワークリソースがどのように接続されているか確認するために、ネットワークビジュアライザが便利です。これを使用すると、VCNと外部リソースの接続、またVCN内のネットワークリソースについて視覚的に確認ができ、設定ミスやエラーが生じた際にエラーハンドリングが行いやすくなります。


https://docs.oracle.com/ja-jp/iaas/Content/Network/Concepts/network_visualizer.htm

ネットワークビジュアライザは、ネットワーキング>ネットワーク・コマンド・センター>ネットワーク・ビジュアライザから表示できます。画像ではIPアドレスをマスクしているのですが、ここまでの設定をネットワークビジュアライザで可視化するとこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/afdf2ca3-4499-fa38-d842-d61c129575d7.png)

VCNからdrgを経由し、IPSecでCPEに通信が設定されていることがわかります。
VCNのオブジェクトをクリックすると、VCN内のリソース（サブネットやルートテーブル、セキュリティリスト）の設定も参照できるので、接続がうまくいかない場合にはこちらを活用してみてください。

# 5-2. Compute VM：インスタンスの作成

プライベートサブネットに、疎通確認用のCompute VMを作成します。
作成方法の詳細は割愛しますが、重要な入力項目、設定項目は下記のとおりです。

|パラメータ  |値
|---|---
|名前  |toAWS-instance（任意）
|イメージ|Oracle Linux 8（イメージ・ビルド: 2023.09.26-0）
|Shape  |VM.Standard.E4.Flex(OCPU、メモリは任意)
|プライマリ・ネットワーク|既存の仮想クラウド・ネットワークを選択>今回作成したVCN
|サブネット|5-1-3で作成したプライベートサブネット
|SSHキーの追加| キー・ペアを自動で生成 > ダウンロードする

# 5-3. Compute VM：インスタンスへの接続確認

今回は、OCI側もCloud Shellでこのインスタンスに接続確認を行います。
AWS側では、AWS CloudShellからプライベートサブネットに対して接続する際、踏み台用のEC2が必要でしたが、OCIのCloud Shellではネットワーク設定でプライベートサブネットに直接通信することができます。
そちらも併せて紹介します。

# 5-3-1. Cloud Shell：起動とネットワーク設定
画面右上の「開発者ツール」アイコンからCloud Shellアイコンを押下します。
デフォルトでは、ネットワークが「パブリック」となっているので、これを先ほど作成したVCNに接続するよう設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/3e11fbd6-b32e-a024-85af-c45587aab660.png)
ネットワーク：パブリックのリストを押下し、「プライベート・ネットワーク定義リスト」を選択します。
下記のように、今回作成したVCN、プライベートサブネットを選択し、作成ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/f372b4cd-e502-9d40-06a5-286f24ba1a37.png)

作成後、リストのアイコンから「アクティブなネットワークとして使用」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/a9670c3c-00fd-3b9f-b11c-df0cc1766755.png)

すると、Cloud Shellがネットワークへの接続を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/c0c9b70c-b3f2-e4b3-f77e-d2a0d35dd169.png)


# 5-3-2. キーの権限付与とインスタンス接続

ネットワークの確認ができたら、Cloud Sehll右側の歯車アイコンを押下し、ファイルのアップロードを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/828c8bf0-f79f-e58c-fd5a-0967adf959de.png)

インスタンス接続用のキー・ペアをアップロードします。

アップロード後、Cloud Shellでキーの権限付与、インスタンスへのssh接続を行います。
下記のようにコマンド操作を実行します。
```
user@cloudshell:~ (ap-tokyo-1)$ ls
Oracle-Linux8.key
user@cloudshell:~ (ap-tokyo-1)$ chmod 600 Oracle-Linux8.key 
user@cloudshell:~ (ap-tokyo-1)$ ls -l
total 12
-rw-------. 1 user oci 1675 Oct  8 06:32 Oracle-Linux8.key
user@cloudshell:~ (ap-tokyo-1)$ ssh -i Oracle-Linux8.key opc@10.2.1.214
FIPS mode initialized
The authenticity of host '10.2.1.214 (10.2.1.214)' can't be established.
ECDSA key fingerprint is SHA256:TWE4eL6tf4dwRzqqcLzN7DWlnCj0UIHB/3kEkdF5oGI.
ECDSA key fingerprint is SHA1:ajs7hKar3ldSVSdDQI1+ohLk1rs.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.2.1.214' (ECDSA) to the list of known hosts.
Activate the web console with: systemctl enable --now cockpit.socket

[opc@toaws-instance ~]$ 
```

# 6. クラウド疎通確認
AWS-OCI間の疎通確認を行います。
# 6-1. OCI⇒AWS
まずは、OCIのCompute VMからAWSのEC2へsshログインしてみましょう。
# 6-1-1. pemキーのアップデートと権限付与
先ほどと同じ方法で、cloud shell上にEC2のpemキーをアップロードします。
さらに、Compute VMにキーを転送します。アップロード後、下記コマンド操作を行ってください。
```
①Compute VM上でauthorized_keysの権限変更
[opc@toaws-instance ~]$ chmod 600 /home/opc/.ssh/authorized_keys
[opc@toaws-instance ~]$ exit
logout
Connection to 10.2.1.214 closed.

②cloud shell上でキーの転送
user@cloudshell:~ (ap-tokyo-1)$ scp -i Oracle-Linux8.key ec2-test-key.pem opc@10.2.1.214:/home/opc
FIPS mode initialized
ec2-test-key.pem                                                                                                                                                                                                                                                                       100% 1678   749.1KB/s   00:00    
③キーがCompute VM上に転送されたか確認
user@cloudshell:~ (ap-tokyo-1)$ ssh -i Oracle-Linux8.key opc@10.2.1.214
FIPS mode initialized
Activate the web console with: systemctl enable --now cockpit.socket
[opc@toaws-instance ~]$ ls
ec2-test-key.pem
[opc@toaws-instance ~]$ 
```

# 6-1-2. OCI Compute VMからAWS EC2へのssh接続

```
[opc@toaws-instance ~]$ ls
ec2-test-key.pem
[opc@toaws-instance ~]$ chmod 400 ec2-test-key.pem
[opc@toaws-instance ~]$ ls -l
total 4
-r--------. 1 opc opc 1678 Oct  8 06:51 ec2-test-key.pem
[opc@toaws-instance ~]$ ssh -i "ec2-test-key.pem" ec2-user@10.1.1.66
The authenticity of host '10.1.1.66 (10.1.1.66)' can't be established.
ECDSA key fingerprint is SHA256:0I6LIiWehF9xrWtdpwuWlHmY0bREXW5bbc59qi+NdFs.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.1.1.66' (ECDSA) to the list of known hosts.
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
Last login: Sat Oct  7 09:35:52 2023 from XXX.XXX.XXX.XXX
[ec2-user@ip-10-1-1-66 ~]$ 
```

「2-3-1. AWS VPN用EC2インスタンスまでの疎通確認」で確認したEC2とプライベートIPアドレスが同等のAmazon Linuxに接続できました！

# 6-2. AWS⇒OCI
最後に、AWSのEC2からOCIのCompute VMへsshログインしてみましょう。
6-1と流れは同じになりますので、説明は省きますが、CloudShellから踏み台インスタンスへキー転送⇒踏み台インスタンスからプライベートサブネット上のEC2へキー転送⇒OCIのCompute VMに接続 という流れになります。
```
[cloudshell-user@ip-10-2-53-193 ~]$ ls
ec2-test-key.pem  oci_api_key.pem  Oracle-Linux8.key  test-pub-key.pem
[cloudshell-user@ip-10-2-53-193 ~]$ scp -i test-pub-key.pem Oracle-Linux8.key ec2-user@XXX.XXX.XXX.XXX:/home/ec2-user/
Oracle-Linux8.key                                                                                                                                                                                                                                        100% 1675   544.9KB/s   00:00    
[cloudshell-user@ip-10-2-53-193 ~]$ ssh -i "test-pub-key.pem" ec2-user@XXX.XXX.XXX.XXX

A newer release of "Amazon Linux" is available.
  Version 2023.2.20231002:
Run "/usr/bin/dnf check-release-update" for full release and version update info
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
[cloudshell-user@ip-10-2-53-193 ~]$ ls
ec2-test-key.pem  oci_api_key.pem  test-pub-key.pem
[cloudshell-user@ip-10-2-53-193 ~]$ clear
[cloudshell-user@ip-10-2-53-193 ~]$ ls
ec2-test-key.pem  oci_api_key.pem  Oracle-Linux8.key  test-pub-key.pem
[cloudshell-user@ip-10-2-53-193 ~]$ scp -i test-pub-key.pem Oracle-Linux8.key ec2-user@XXX.XXX.XXX.XXX:/home/ec2-user/                                                                                                                                                                        
Oracle-Linux8.key                                                                                                                                                                                                                                        100% 1675   544.9KB/s   00:00    
[cloudshell-user@ip-10-2-53-193 ~]$ ssh -i "test-pub-key.pem" ec2-user@XXX.XXX.XXX.XXX

A newer release of "Amazon Linux" is available.
  Version 2023.2.20231002:
Run "/usr/bin/dnf check-release-update" for full release and version update info
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
Last login: Sun Oct  8 06:38:03 2023 from 35.77.103.235
[ec2-user@ip-10-1-3-181 ~]$ ls
Oracle-Linux8.key  ec2-test-key.pem  test_db
[ec2-user@ip-10-1-3-181 ~]$ scp -i ec2-test-key.pem Oracle-Linux8.key ec2-user@10.1.1.66:/home/ec2-user/                                                                                                                                                                                   
Oracle-Linux8.key                                                                                                                                                                                                                                        100% 1675     2.7MB/s   00:00    
[ec2-user@ip-10-1-3-181 ~]$ ssh -i "ec2-test-key.pem" ec2-user@10.1.1.66
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
Last login: Sun Oct  8 06:57:15 2023 from 10.2.1.214
[ec2-user@ip-10-1-1-66 ~]$ ls
Oracle-Linux8.key
[ec2-user@ip-10-1-1-66 ~]$ chmod 600 Oracle-Linux8.key 
[ec2-user@ip-10-1-1-66 ~]$ ls -l
total 4
-rw-------. 1 ec2-user ec2-user 1675 Oct  8 07:06 Oracle-Linux8.key
[ec2-user@ip-10-1-1-66 ~]$ ssh -i Oracle-Linux8.key opc@10.2.1.214
The authenticity of host '10.2.1.214 (10.2.1.214)' can't be established.
ED25519 key fingerprint is SHA256:TFB/XTj1EP/JqnSw7le07xeSYxGvL0EhqyovcdNimGc.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.2.1.214' (ED25519) to the list of known hosts.
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Sun Oct  8 06:52:01 2023 from 10.2.1.123
[opc@toaws-instance ~]$ pwd
/home/opc
[opc@toaws-instance ~]$ cat /etc/os-release
NAME="Oracle Linux Server"
VERSION="8.8"
ID="ol"
ID_LIKE="fedora"
VARIANT="Server"
VARIANT_ID="server"
VERSION_ID="8.8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Oracle Linux Server 8.8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:oracle:linux:8:8:server"
HOME_URL="https://linux.oracle.com/"
BUG_REPORT_URL="https://github.com/oracle/oracle-linux"

ORACLE_BUGZILLA_PRODUCT="Oracle Linux 8"
ORACLE_BUGZILLA_PRODUCT_VERSION=8.8
ORACLE_SUPPORT_PRODUCT="Oracle Linux"
ORACLE_SUPPORT_PRODUCT_VERSION=8.8
[opc@toaws-instance ~]$ 
```
最後にOSを確認するコマンドを打ってみましたが、「5-2. Compute VM：インスタンスの作成」で作成した、Oracle Linux8のComputeVMに接続できました！

# まとめ

疎通確認のため、各クラウドのネットワーク構成やインスタンス作成、またCloud Shell上からの接続まで言及し、思いのほか長編となってしまいましたが、クラウド間のVPN接続手順は比較的シンプルな手順で実行できました。
クラウド間をセキュアに接続し、リソースの移行や、適材適所の考え方に基づいたマルチクラウド構成を実現することができます。

# 参考


https://docs.oracle.com/ja-jp/iaas/Content/Network/Tasks/vpn_to_aws.htm

https://docs.oracle.com/ja-jp/iaas/Content/Network/Reference/supportedIPsecparams.htm#ariaid-title2