AWS
elb
Beanstalk
PrivateLink

Network Load Balancer Privatelink の閉域網をBeanstalkで簡単作成

NLB Privatelink (VPC Interface Endpoint) の閉域網をBeanstalkで簡単作成してみます

この構成を考えた理由

  • AWSへの閉域網アクセスのリクエストが意外に多い
  • でも、AWSへの閉域網接続を検討する場合こんな悩みが
    • APN パートナーが提供する Direct Connect は確実だけどイニシャルとランニングコストが若干高め
    • AWS のVPN 接続を使う手もあるがクラウドHUBとして動くので、異なる組織を収容するマルチテナントには向かない
    • Network ACL で制御する方法もあるがステートレスのため設定が若干複雑

NLB Privatelink (VPC Interface Endpoint) を利用した場合に解決できること

  • VPC peering を利用した場合、オンプレミス拠点からの Direct Access・VPC VPN接続 を経由しての多段の接続ができないが、PrivatelinkはVPN接続する先のVPC IPプレフィックス内に接続ポイントが作成されるので接続ができそう
  • Twice NATが実装されるためサービスを提供側のVPCとアドレスが重複したサービス利用側VPCでも接続が可能
  • オンプレミス拠点からの Direct Connect 接続を経由したPrivatelinkエンドポイントへの接続が可能(さすがに自分環境では Direct Connect 環境が用意できず未検証。。)
    • (12月22日現在でこの構成で接続できるのは Direct Connect のみとの事。マネージド VPN経由でもPrivatelinkへ接続できるようなアップデートを心待ちにしています)
    • (Sep 25, 2018 更新 PrivateLink で AWS VPN を経由したアクセスがサポートされました!)

1. NLBとBeanstalk Web Tierを作成します

  • EB CLIの環境設定や eb init でのEB環境設定は完了しているものとします
  • 検証用に下記のEB環境を使用
  • ELBはNLBで作成するため「--elb-type network」を指定します
  • ELBはInternalに設定するので「--vpc.elbpublic」は外しています
  • VPC IDや各種subnetのIDはご自身の環境に合わせてください
eb-create.ps1
eb create eb-privatelink `
--elb-type network `
--cname eb-privatelink-oreg `
--tags project=eb-privatelink `
--vpc.id vpc-0a1d806e `
--vpc.ec2subnets subnet-97aa55cf,subnet-d7d47fa1 `
--vpc.elbsubnets subnet-97aa55cf,subnet-d7d47fa1 `
--vpc.dbsubnets subnet-cc097594,subnet-710c0107 `
--vpc.securitygroups sg-1d12c87b `
--instance_profile aws-elasticbeanstalk-ec2-role `
--instance_type t2.small `
--vpc.publicip `
--tier webserver `
--timeout 30

2. エンドポイントサービスの作成(サービス提供側)

 Beanstaklで作成したNLBが表示されるのでPrivatelinkのサービスを作成します
VPC_Privatelink.PNG

3. ホワイトリストにプリンシパルを追加する(サービス提供側)

 エンドポイントサービスを利用するAWSアカウントを登録します
  arn:aws:iam::サービスを利用するAWSアカウントID:root
princepal.PNG

4. エンドポイントサービスのサービス名を確認します(サービス提供側)

endpoint_service_name.PNG

5. エンドポイントサービスするAWSアカウントでエンドポイントを作成します(サービス利用側)

「サービスを名前で検索」を選択して4.でコピーしたサービス名を入力します
create_endpoint.PNG

6. エンドポイントを作成するVPCとセキュリティグループを選択します(サービス利用側)

select_endpoint_VPC.PNG

7. エンドポイントサービスで接続するエンドポイントを承認します(サービス提供側)

承諾の保留中 → 利用可能 になるまで少し待ちます
endpoint_approval.PNG

8. エンドポイントのDNS名を確認します(サービス利用側)

PrivateLinkのDNS名はSplit-horizonで解決されるので一番上のDNS名でOKです
endpoint_dns.PNG

9. エンドポイントを作成したAWSアカウントで起動したWorkspacesでサービスへアクセスします(サービス利用側)

workspaces.PNG

R53のプライベートゾーン レコードセットにエンドポイントDNS名のCNAMEを分かりやすい名前で登録するとアクセスが楽になります(サービス利用側)

試しにマネージド VPN接続のオンプレ環境からアクセスしてみた

  • PrivteLink サービス提供側 と サービス利用側 のVPC IPプレフィックスは同じ
  • エンドポイントを作成したサービス利用側VPCに作成したVGWとオンプレ環境のpfSenseをIPSec接続
  • R53プライベートゾーンにエンドポイントDNS名を登録
  • workspaces に付帯しているSinpleAD DNSをオンプレ拠点のリゾルバとして参照
  • SinpleADやエンドポイントのセキュリティグループにオンプレ拠点IPプレフィックスが接続元の通信を許可設定 Beanstalk-Privatelink.png

オンプレ拠点からエンドポイントDNS名の名前解決はできているが、エンドポイントへのHTTP接続はできなかった。
resolve-dns.PNG

この構成が可能になると、VPN閉域網でのサービス提供の選択肢が広がるので早く実現してほしいです。
(Sep 25, 2018 更新 PrivateLink で AWS VPN を経由したアクセスがサポートされました!)