🔓

TerraformでAWS ⇔ Oracle Cloud間のVPN構築

2023/07/13に公開

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で公開しています。

https://github.com/TakumiHaruta/vpn-aws-and-oci

手順

  1. Terraformで各種パラメータを設定し、 terraform init & terraform apply でリソースを構築します。

  2. terraform apply 完了後、AWSマネジメントコンソールでVPN接続画面に行き、作成されているコネクションをdummyから実際のIPが設定されているCusotmer Gatwayに切り替えます。ここだけ手動になってしまうのは、OCI側のVPNの仕様とTerraformのImport cycleによるものです。Statusが Available になった後、Tunnel1の状態が Up になっていればOKです。

  1. 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
  1. 必要であれば、 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の公式ドキュメントに基づいています。

https://docs.oracle.com/en-us/iaas/Content/Network/Tasks/vpn_to_aws.htm

https://www.ateam-oracle.com/post/inter-cloud-private-dns-peering-between-oci-and-aws

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

ADWをPrivate endpoint URLで接続するためのRoute53 Resolverです。アウトバウンドのみ作成し、ルールのターゲットIPにOCI側のResolver Endpointを指定します。

OCI

OCI側では以下のリソースが構築されます。AWSと比べるとTerraformの仕様にクセがあります。

デフォルトのリソース

OCIでデフォルトのリソースを管理するためには、リソース名に default を加えつつ、 manage_default_resource_id でIDを指定します。

https://docs.oracle.com/en-us/iaas/Content/ResourceManager/Tasks/terraform-manage-default-vcn-resources.htm

例えば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でCPEとDRGを接続した後、 oci_core_ipsec_connection_tunnel_management でトンネルの詳細設定を行います。

oci_dns_resolver_endpoint

AWSのRoute53向けに、リスニング用のResolver Endpointを作成します。

課題

  • AWS側のVPN接続の手動変更をなんとかできないか?
    • 素直にやるとImport cycleエラーが発生する
  • (何か思いつき次第追記)

参考

Discussion