TerraformでAWS ⇔ Oracle Cloud間のVPN構築
TL;DR
AWS ⇔ Oracle Cloud(以下、OCI)間でVPNを構築するTerraformテンプレートを開設する記事です。前提として、以下の環境が既にある状態です。
- AWS
- VPCおよびPrivate Subnet
- Private Subnet内にEC2インスタンス
- OCI
- VCNおよびPrivate Subnet
- Private Subnet内にAutonomous Data Warehouse(以下、ADW)
- ServerlessかつPrivate endpoint only
こちらの環境に対して、AWSのEC2インスタンスからOCIのADWへ、VPN経由で接続できるようにします。最終的に以下のような構成になります。
TerraformのテンプレートはGitHubで公開しています。
手順
-
Terraformで各種パラメータを設定し、
terraform init & terraform apply
でリソースを構築します。 -
terraform apply
完了後、AWSマネジメントコンソールでVPN接続画面に行き、作成されているコネクションをdummyから実際のIPが設定されているCusotmer Gatwayに切り替えます。ここだけ手動になってしまうのは、OCI側のVPNの仕様とTerraformのImport cycleによるものです。StatusがAvailable
になった後、Tunnel1の状態がUp
になっていればOKです。
- EC2インスタンスにSSH接続し、
nslookup
コマンドで名前解決できるか確認します。Oracle側のADWのPrivate IPと一致していればOKです。
$ nslookup xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com
Server: 10.0.0.2
Address: 10.0.0.2#53
Non-authoritative answer:
Name: xxxxxxxx.adb.ap-tokyo-1.oraclecloud.com
Address: 172.16.0.71
- 必要であれば、
sqlplus
コマンド等でDB接続確認も実施します。
$ sqlplus ADMIN@dev_low
SQL*Plus: Release 21.0.0.0.0 - Production on Thu Jul 13 00:39:58 2023
Version 21.4.0.0.0
Copyright (c) 1982, 2021, Oracle. All rights reserved.
Enter password:
Last Successful login time: Mon Jul 10 2023 13:46:23 +00:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.20.0.1.0
SQL>
構築のポイント
主にOCIの公式ドキュメントに基づいています。
AWS
AWS側では以下のリソースが構築されます。
aws_vpn_gateway
対象のVPNに対してVPN Gatewayをアタッチします。
aws_customer_gateway
OCI側のIPを設定するCustomer Gatewayは、dummyと正規で2つ作成する必要があります。リソース作成後にVPN接続設定上で、dummyから正規のCustomer Gatewayへ手動で切り替えてください。
aws_vpn_connection
VPN GatewayとCustomer Gatewayを接続するVPNです。Preshared keyはTerraform側で生成したランダム文字列を設定します。このVPNは手動でAWSマネジメントコンソールから手動で変更が加えられるため、terraform destory
実行する際には、あらかじめこのVPNを削除しておいてください。
aws_route53_resolver_endpoint & aws_route53_resolver_rule
- aws_route53_resolver_endpoint | Resources | hashicorp/aws | Terraform Registry
- aws_route53_resolver_rule | Resources | hashicorp/aws | Terraform Registry
ADWをPrivate endpoint URLで接続するためのRoute53 Resolverです。アウトバウンドのみ作成し、ルールのターゲットIPにOCI側のResolver Endpointを指定します。
OCI
OCI側では以下のリソースが構築されます。AWSと比べるとTerraformの仕様にクセがあります。
デフォルトのリソース
OCIでデフォルトのリソースを管理するためには、リソース名に default
を加えつつ、 manage_default_resource_id
でIDを指定します。
例えばSecurity Listの場合は以下のようになります。
resource "oci_core_default_security_list" "main" {
#Required
manage_default_resource_id = data.oci_core_vcn.main.default_security_list_id
egress_security_rules {
#Required
protocol = "all"
destination = "0.0.0.0/0"
}
ingress_security_rules {
#Required
protocol = "all"
source = data.aws_vpc.main.cidr_block
}
ingress_security_rules {
#Required
protocol = "all"
source = data.oci_core_vcn.main.cidr_block
}
}
このデフォルトリソース自体はTerraformのドキュメントには一覧化されていないのでご注意ください。
oci_core_cpe
AWSのCustomer Gatewayにあたるリソースです。
oci_core_drg
AWSのVPN Gatewayにあたるリソースです。
oci_core_ipsec & oci_core_ipsec_connection_tunnel_management
- oci_core_ipsec | Resources | oracle/oci | Terraform Registry
- oci_core_ipsec_connection_tunnel_management | Resources | oracle/oci | Terraform Registry
oci_core_ipsec
でCPEとDRGを接続した後、 oci_core_ipsec_connection_tunnel_management
でトンネルの詳細設定を行います。
oci_dns_resolver_endpoint
AWSのRoute53向けに、リスニング用のResolver Endpointを作成します。
課題
- AWS側のVPN接続の手動変更をなんとかできないか?
- 素直にやるとImport cycleエラーが発生する
- (何か思いつき次第追記)
参考
- VPN Connection to AWS
- Inter-Cloud private DNS peering between OCI and AWS
- Site-to-Site VPN between OCI and AWS | by Majdi Dhissi | Towards AWS
- AWS-OCI間のVPN接続の手順について | Oracle Cloud のことなら Cloudii(クラウディ)
- [OCI]Private DNS Resolverを利用して別のVCNにあるDBシステムにDNS名(FQDN)でアクセスしてみた - Qiita
- Docs overview | oracle/oci | Terraform Registry
Discussion