On Amazon side:
Create new elastic IP
Select Virtual Private Cloud-Elastic IPs-Allocate new address
Click allocate
I used default VPC if you need to create new VPC,take a look here
Create EC2 instance and assign VPC (default or custom one and subnet)
Allocate Elastic IP to instance-in EC2 select instance-Actions-Associate address
Resource Type-instance-select instance and Private IP
Azure portal
Create Virtual Network Gateway (details here)
Create Local Network Gateway
IP Address:Amazon Elastic IP (created earlier)
Address Space (Amazon VPC subnet to which EC2 instance is assigned)
Once Local network gateway is created go to Connections-Add
Select Virtual Network gateway,local network gateway and shared key
Copy Virtual network gateway IP
find out Azure VM network
Click on Azure VM-Networking to find out subnet name
write down subnet, it will be needed for Powershell script
On AWS EC2 instance install RRAS and configure IPSec VPN.In this case 137.117.170.80 is Azure Virtual Network Gateway IP,10.0.1.0/24 Azure VM subnet and 123456 Secret Key
# Windows Azure Virtual Network # This configuration template applies to Microsoft RRAS running on Windows Server 2012 R2. # It configures an IPSec VPN tunnel connecting your on-premise VPN device with the Azure gateway. # !!! Please notice that we have the following restrictions in our support for RRAS: # !!! 1. Only IKEv2 is currently supported # !!! 2. Only route-based VPN configuration is supported. # !!! 3. Admin priveleges are required in order to run this script Function Invoke-WindowsApi( [string] $dllName, [Type] $returnType, [string] $methodName, [Type[]] $parameterTypes, [Object[]] $parameters ) { ## Begin to build the dynamic assembly $domain = [AppDomain]::CurrentDomain $name = New-Object Reflection.AssemblyName 'PInvokeAssembly' $assembly = $domain.DefineDynamicAssembly($name, 'Run') $module = $assembly.DefineDynamicModule('PInvokeModule') $type = $module.DefineType('PInvokeType', "Public,BeforeFieldInit") $inputParameters = @() for($counter = 1; $counter -le $parameterTypes.Length; $counter++) { $inputParameters += $parameters[$counter - 1] } $method = $type.DefineMethod($methodName, 'Public,HideBySig,Static,PinvokeImpl',$returnType, $parameterTypes) ## Apply the P/Invoke constructor $ctor = [Runtime.InteropServices.DllImportAttribute].GetConstructor([string]) $attr = New-Object Reflection.Emit.CustomAttributeBuilder $ctor, $dllName $method.SetCustomAttribute($attr) ## Create the temporary type, and invoke the method. $realType = $type.CreateType() $ret = $realType.InvokeMember($methodName, 'Public,Static,InvokeMethod', $null, $null, $inputParameters) return $ret } Function Set-PrivateProfileString( $file, $category, $key, $value) { ## Prepare the parameter types and parameter values for the Invoke-WindowsApi script $parameterTypes = [string], [string], [string], [string] $parameters = [string] $category, [string] $key, [string] $value, [string] $file ## Invoke the API [void] (Invoke-WindowsApi "kernel32.dll" ([UInt32]) "WritePrivateProfileString" $parameterTypes $parameters) } # Install RRAS role Import-Module ServerManager Install-WindowsFeature RemoteAccess -IncludeManagementTools Add-WindowsFeature -name Routing -IncludeManagementTools # !!! NOTE: A reboot of the machine might be required here after which the script can be executed again. # Install S2S VPN Import-Module RemoteAccess if ((Get-RemoteAccess).VpnS2SStatus -ne "Installed") { Install-RemoteAccess -VpnType VpnS2S } # Add and configure S2S VPN interface Add-VpnS2SInterface -Protocol IKEv2 -AuthenticationMethod PSKOnly -NumberOfTries 3 -ResponderAuthenticationMethod PSKOnly -Name 137.117.170.80 -Destination 137.117.170.80 -IPv4Subnet @("10.0.1.0/24:100") -SharedSecret 123456 Set-VpnServerIPsecConfiguration -EncryptionType MaximumEncryption Set-VpnS2Sinterface -Name 137.117.170.80 -InitiateConfigPayload $false -Force # Set S2S VPN connection to be persistent by editing the router.pbk file (required admin priveleges) Set-PrivateProfileString $env:windir\System32\ras\router.pbk "137.117.170.80 " "IdleDisconnectSeconds" "0" Set-PrivateProfileString $env:windir\System32\ras\router.pbk "137.117.170.80 " "RedialOnLinkFailure" "1" # Restart the RRAS service Restart-Service RemoteAccess # Dial-in to Azure gateway Connect-VpnS2SInterface -Name 137.117.170.80
Test connection
get-VpnS2Sinterface
Connection from EC2 to Azure