Terraformでサクッと!AWS⇔OCI間 Site‑to‑Site VPN 接続手順

何だこのアイキャッチwwwww
最初に
勤務先のブログで、AWS と OCI の VPN 接続をするって記事を書いたのですが、マネコンでの作業内容でした (ちなみにまだマーケティング部門のチェック中で公開されてない)
2025/08/12追記:マーケ部門のチェックも終わって公開されました!
OCI AWS 連携|VPN接続手順を画像付きで詳しく解説
手作業でポチポチ作るのは初心者の方々には構成要素などが理解できるので良いのですが、運用する立場だと面倒なので、IaC 化するか!って事で Terraform で作る事にしました。
以下どなたかの参考になれば幸いです。
手順概要
今回は AWS と OCI それぞれで作業をします。大きく5つのパートに分かれます
- AWS 側の手順
- OCI 側の手順
- AWS 側の手順 2回目
- 接続確認
- お片付け
VPN 接続で利用する、グローバルIP などを途中で準備するので AWS 側で2回目の作業が発生しています。
なお構築で利用する Terraform のファイル類は以下のリポジトリで公開済です。
AWS 側の手順
最初に AWS 側から作業を進めていきます。
AWS だと対向相手の接続機器( Customer Gateway )を途中で変更することが出来るため、AWS から作業をします。
AWS:CloudShellの環境準備
今回 Terraform を使って環境構築をします。
以前は Cloud9 も使えましたが、新規ユーザーだと利用出来ないので、CloudShell に Terraform をインストールして構築作業を進めます。
なお、Terraform 提供元の HashiCorp 社にてドキュメントも公開されていますので、それを参考にインストールしました。
# dnf プラグインをインストール
sudo dnf install -y dnf-plugins-core
# HashiCorp リポジトリを追加
sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
# Terraform をインストール
sudo dnf install -y terraform
# バージョン確認
terraform --version
2025/07/27時点では v1.12.2がインストールされました。

AWS:設定ファイルの準備
VPN 接続する際にはそれぞれ接続相手のグローバルIPアドレスを指定する必要があります。また接続方法によっては IPSec の事前共有キーなどを手動指定する場合もあります。
今回はそういった接続に必要な情報を上記 Github リポジトリから取得し、編集をしていきます。
# Github リポジトリを Clone
git clone https://github.com/maijun2/aws-oci-vpn-terraform.git
# ディレクトリを移動
cd aws-oci-vpn-terraform/aws
# サンプルのファイルを元に設定ファイルを作成
cp terraform.tfvars.example terraform.tfvars
AWS:設定ファイルの編集
出来上がった terraform.tfvars を編集するのですが、編集方法はいくつかあります。
vi とか nano 等エディタを利用してもよいですし、CloudShell からファイルをダウンロードしローカルで編集後にアップロードする方法もよしですしお寿司。
私は慣れた vi で編集しました。
デプロイ先のリージョン
aws_region = "ap-northeast-1"
# Customer Gateway の 名前
customer_gateway_name = "cgw-for-oci"
# Customer Gateway の (初回はダミー) IP アドレス
customer_gateway_ip = "8.8.8.8"
# Customer Gateway の BGP ASN。Oracleは31898
customer_gateway_bgp_asn = 31898
# Site-to-Site VPN 接続設定の名前
vpn_connection_name = "vpn-to-oci"
# PSK(英数字のみ、ピリオド・アンダースコアは使わない)
pre_shared_key = "MySecretKey123"
# ※ 以下はデフォルトがあるので不要
# transit_gateway_asn
# tunnel1_inside_cidr
# tunnel2_inside_cidr
# phase1_encryption_algorithms
# phase1_integrity_algorithms
# phase1_dh_group_numbers
# phase2_encryption_algorithms
# phase2_integrity_algorithms
# phase2_dh_group_numbers
# ike_versions
~
なお、Customer Gateway の IP アドレスは初回はダミーです。
序盤でも記載しましたが、OCI 側で VPN 接続を作成後にグローバル IP アドレスが準備されます。
その OCI で準備された IP アドレスを後でこのダミー箇所を更新して利用します。リージョン、PSK や 作成される AWS の各種リソース類の名称は適宜ご自身の環境に置き換えてください。
AWS:Terraform でデプロイ
設定ファイルの準備が終わったのでデプロイしていきます。
terraform init
terraform plan
terraform apply
apply のときには途中で「本当に実行しちゃってよいの?」と聞かれるので yes と入力して進めます。

あとは待つだけ!
数分待つと作成完了します。

AWS のマネージメントコンソールなどで Customer Gateway や Transit Gateway、Site-to-Site VPN 接続が作成されているか確認してください。
AWS:準備されたグローバル IP アドレスの情報をメモする
Terraform で作成された Site-to-Site VPN 接続ですが、グローバル IP アドレスが準備されます。

この IP アドレスを OCI 側には CPE として登録するのでメモしておきます。
vpn_tunnel1_address = "52.69.61.22"
OCI 側の手順
AWS 側で前準備が終わったので、次は OCI 側の作業です。
ちなみに今回私は Oracle の学習環境 Oracle Mylern にてラボ環境を立ち上げてそこで設定しました。

OCI:コードエディタで環境準備
OCI は AWS 同様に CloudShell があり作業ができますが、コード編集が出来るコード・エディタも利用できます。そこで環境準備をしていきます。

見た目がほんと VScode ですね。

OCI:設定ファイルの準備
先ほど使った Github リポジトリ をまた利用し、設定ファイルを準備します。
まずは、コード・エディタでターミナルを開きます。

リポジトリをクローンして設定ファイルをまたサンプルからコピーします。
# Github リポジトリを Clone
git clone https://github.com/maijun2/aws-oci-vpn-terraform.git
# ディレクトリを移動
cd aws-oci-vpn-terraform/oci
# サンプルのファイルを元に設定ファイルを作成
cp terraform.tfvars.example terraform.tfvars
左側にあるメニューのエクスプローラーを展開すると、ファイルが一覧で表示されます。

OCI:設定ファイルの編集
AWS 同様に terraform.tfvars を編集するのですが、OCI の場合いくつか変更箇所があります。
# 認証情報
tenancy_ocid = "テナンシーのOCIDを書く"
compartment_id = "コンパートメントのOCIDを書く"
oci_region = "リージョンを指定する"
# AWS 側 VPC の CIDR など、OCI 側で経路を張りたいネットワークを指定
static_routes = ["10.0.0.0/16"]
# AWS 側エンドポイント (先ほど取得した tunnel1_address)
aws_vpn_tunnel1_address = "AWS側のVPN接続で使うグローバルIPを指定する"
# BGP/PSK
# aws_transit_gateway_asn = 64512 # default のままなら不要
# oracle_customer_bgp_asn = 64512 # default のままなら不要
pre_shared_key = "ipsec接続の際の事前共有キーを書く"
# ipsec_display_name は default のままでOK
# ─────────────────────────
# トンネル内部インターフェイス IP
# ─────────────────────────
tunnel1_customer_interface_ip = "169.254.21.1/30"
tunnel1_oracle_interface_ip = "169.254.21.2/30"
テナンシーの OCID とコンパートメントの OCID を調べて書く必要がありますね。
テナンシーの OCID は以下コマンドで調べる事ができます。
$ oci iam tenancy get --tenancy-id $(oci iam compartment list --compartment-id-in-subtree true --all | jq -r '.data[0]."compartment-id"')

またコンパートメントの OCID をコマンドで調べようと思ったのですが、利用者が多くコンパートメントだらけで訳わからなかったので、コンソール画面から確認しました。
メニューからアイデンティティとセキュリティ > コンパートメントを選択して、自身が利用するコンパートメントの部分をクリックするとコンパートメントの OCID が取得できます。

リージョンについてはターミナルに記載されている内容からコピペできますが、今回の Oracle MyLearn ではリージョンごとに使える環境も限定されています。
私は今回、Oracle Cloud Infrastructure Foundations 2025 (JP) の教材からラボ環境を立ち上げたので、アッシュバーンを指定しました。

次に、AWS 側の接続先を指定します。先ほどメモしたIPアドレスを設定ファイルに記述します。
# AWS 側エンドポイント (先ほど取得した tunnel1_address)
aws_vpn_tunnel1_address = "52.69.61.22"
最後に、事前共有キー( PSK )も指定します。
pre_shared_key = "MySecretKey123"
設定ファイルの準備が終わりました。
# 認証情報
tenancy_ocid = "ocid1.tenancy.oc1..aaaaaaaaukvw5677joefjfaygfjxcwjnbqbr4m3hmp2ytnln2fucluumedca"
compartment_id = "ocid1.compartment.oc1..aaaaaaaankcniq6p336pbqc2dxfh4h3stba3nfux2ynxn2kqvjv5bq2hk7tq"
oci_region = "us-ashburn-1"
# AWS 側 VPC の CIDR など、OCI 側で経路を張りたいネットワークを指定
static_routes = ["10.0.0.0/16"]
# AWS 側エンドポイント (先ほど取得した tunnel1_address)
aws_vpn_tunnel1_address = "52.69.61.22"
# BGP/PSK
# aws_transit_gateway_asn = 64512 # default のままなら不要
# oracle_customer_bgp_asn = 64512 # default のままなら不要
pre_shared_key = "MySecretKey123"
# ipsec_display_name は default のままでOK
# ─────────────────────────
# トンネル内部インターフェイス IP
# ─────────────────────────
tunnel1_customer_interface_ip = "169.254.21.1/30"
tunnel1_oracle_interface_ip = "169.254.21.2/30"
OCI:Terraform でデプロイ
設定ファイルの準備が終わったのでデプロイしていきます。
terraform init
terraform plan
terraform apply
AWS の時と同様に途中で作成確認されますので、yesを押して待機。
あとは待つだけ!
数分待つと作成完了します。

OCI のマネージメントコンソールなどで Dynamic Routing Gateway や CPE、サイト間 VPN が作成されているか確認してください。
OCI:準備されたグローバル IP アドレスの情報をメモする
Terraform で作成された サイト間 VPN ですが、グローバル IP アドレスが準備されます。

この IP アドレスを AWS 側に新しい Customer Gateway として登録して更新作業をします。よってこのIPアドレスをメモしておきます。
oci_vpn_public_ip = "141.148.19.229"
AWS 側の手順 2回目
OCI 側でグローバル IP アドレスが準備できたので、Customer Gateway を書き換えて Site-to-Site VPN 接続も更新しましょう。
AWS:設定ファイルの編集
先ほど編集した terraform.tfvars の一部分を書き換えます。ダミーで書いていた部分を書き換えですね!
# Customer Gateway の (初回はダミー) IP アドレス
customer_gateway_ip = "141.148.19.229"
適宜エディタなどで書き換えて保存してください。
AWS:Terraform でデプロイ
設定ファイルの書き換えが終わったのでまたデプロイしていきます。
terraform plan
terraform apply
また途中で作成確認されますので、yesを押して待機。
あとは待つだけなのですが、今回は結構待ちます。
その間にカスタマーゲートウェイなどが作成されているか?マネージメントコンソールで確認すると OCI で発行されたグローバル IP アドレスにて新しく登録されるのがわかります。

7分ぐらい待つと terraform apply も終わりました。(長い)

接続確認
AWS、OCI それぞれ設定が終わりました。
VPN 接続がうまく出来ているか確認します。
AWS 側での確認
Terraform で 作成した Site-to-Site VPN 接続を選択します。
トンネルの詳細を見るとステータスもアップしてますね。

カスタマーゲートウェイもダミー分が削除済になってました。

OCI 側での確認
OCI でも Terraform で 作成したサイト間 VPN を選択します。

トンネル情報の詳細を見ると無事に接続されてましたね。

あとは適宜ネットワークにアタッチしたり、経路情報を設定すれば AWS と OCI で繋がります。
お片付け🧹
接続確認も終わって使わなくなったらお片付けしましょう。
お片付けも Terraform でサクッと削除できます。
AWS、OCI それぞれで以下destroyします。
terraform destroy
いつものように「本当に処理しちゃってよいの?」と聞かれるので yes を入力して続行です漢!
少し待つとサクッと削除されます。

📝 学びとまとめ
実は今回の内容って、「 Oracle MyLearn で新しい教材環境が出たので何が出来るのか?」という調べる事がきっかけです。結構いろんなことが出来るのがわかりました > OCI の学習環境
初心者向けの教材環境でも VPN 接続の設定が出来るって判ったので検証したのですが、サクッと出来て何よりです。
クラウドだと使い捨てな環境で確認が出来るので良いですね!
興味がある方はぜひ手を動かしながら、接続設定などしてみてください。
この記事が、今後どなたかのお役に立てれば幸いです!
Discussion