Privatelink の閉域接続環境をBeanstalkで簡単作成

##Privatelink (VPC Interface Endpoint) へ閉域接続する構成をBeanstalkで簡単作成してみます
###この構成を考えた理由
- AWSへの閉域網アクセスのリクエストが意外に多い
- でも、AWSへの閉域網接続を検討する場合こんな悩みが
 -  APN パートナーが提供する Direct Connect は確実だけどイニシャルとランニングコストが若干高め
 -  AWS のVPN 接続を使う手もあるがクラウドHUBとして動くので、異なる組織を収容するマルチテナントには向かない


###Privatelink (VPC Interface Endpoint) を利用した場合に解決できること
- Direct Connect や VPNで接続するVPCの中に接続用エンドポイントが作成されるので、オンプレミス拠点からの接続が可能
- 異なるAWSアカウントのVPC間でも接続できる（クロスアカウント構成)
- PlivateLink エンドポイントと接続先を収容するNetwork Load Blancer（NLB）の間は双方向NATの様な動きをするため、サービスを利用する側のVPCとサービスを提供する側のVPCでアドレス帯が重複していても接続可能

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

- EB CLIの環境設定や eb init でのEB環境設定は完了しているものとします
- 検証用に下記のEB環境を使用
    - Elastic Beanstalk 開発者ガイド
    - AWSマネジメントコンソール を使用した複数コンテナの Docker 環境
    - https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_docker_ecstutorial.html
- ELBはNLBで作成するため「--elb-type network」を指定します
- ELBはInternalに設定するので「--vpc.elbpublic」は外しています
- VPC IDや各種subnetのIDはご自身の環境に合わせてください


```ps1: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.　エンドポイントサービスの作成（サービス提供側）
　Beanstalkで作成したNLBが表示されるのでPrivatelinkのサービスを作成します
![VPC_Privatelink.PNG](https://qiita-image-store.s3.amazonaws.com/0/71534/4768cd59-c305-bc30-6ce1-1c6a7eb10d03.png)
####3.　ホワイトリストにプリンシパルを追加する（サービス提供側）
　エンドポイントサービスを利用するAWSアカウントを登録します
　　arn:aws:iam::サービスを利用するAWSアカウントID:root
![princepal.PNG](https://qiita-image-store.s3.amazonaws.com/0/71534/d8b5a705-104a-fe4c-6d85-0d58a75b0fea.png)

####4.　エンドポイントサービスのサービス名を確認します（サービス提供側）
![endpoint_service_name.PNG](https://qiita-image-store.s3.amazonaws.com/0/71534/0146a43f-7914-6652-4ec1-d8303597341f.png)


####5.　エンドポイントサービスするAWSアカウントでエンドポイントを作成します（サービス利用側）
「サービスを名前で検索」を選択して4.でコピーしたサービス名を入力します
![create_endpoint.PNG](https://qiita-image-store.s3.amazonaws.com/0/71534/a2bc4cdd-977e-8583-3101-3b92eca514f6.png)

####6.　エンドポイントを作成するVPCとセキュリティグループを選択します（サービス利用側）
![select_endpoint_VPC.PNG](https://qiita-image-store.s3.amazonaws.com/0/71534/afdcb4c9-5637-7a0e-b9dc-5a6230fc50f7.png)

####7.　エンドポイントサービスで接続するエンドポイントを承認します（サービス提供側）
承諾の保留中 → 利用可能 になるまで少し待ちます
![endpoint_approval.PNG](https://qiita-image-store.s3.amazonaws.com/0/71534/e1fcc083-ced7-e745-1c0b-ae6d7bd1ff25.png)

####8.　エンドポイントのDNS名を確認します（サービス利用側）
PrivateLinkのDNS名はSplit-horizonで解決されるので一番上のDNS名でOKです
![endpoint_dns.PNG](https://qiita-image-store.s3.amazonaws.com/0/71534/017e40cd-4271-b44a-f16f-2203ffd366a3.png)

####9.　エンドポイントを作成したAWSアカウントで起動したWorkspacesでサービスへアクセスします（サービス利用側）
![workspaces.PNG](https://qiita-image-store.s3.amazonaws.com/0/71534/1783273a-d3a4-5e1f-7079-33ddced3421a.png)

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


###試しにマネージド VPN接続のオンプレ環境からアクセスしてみた
- PrivteLink サービス提供側 と サービス利用側 のVPC IPプレフィックスは同じ
- エンドポイントを作成したサービス利用側VPCに作成したVGWとオンプレ環境のpfSenseをIPSec接続
- R53プライベートゾーンにエンドポイントDNS名を登録
- workspaces に付帯しているSinpleAD DNSをオンプレ拠点のリゾルバとして参照
- SinpleADやエンドポイントのセキュリティグループにオンプレ拠点IPプレフィックスが接続元の通信を許可設定
![Beanstalk-Privatelink.png](https://qiita-image-store.s3.amazonaws.com/0/71534/2665627a-48f0-da2d-c45b-9eb2501ee7e3.png)

オンプレ拠点からエンドポイントDNS名の名前解決はできているが、エンドポイントへのHTTP接続はできなかった。
![resolve-dns.PNG](https://qiita-image-store.s3.amazonaws.com/0/71534/20bd401e-7f0a-9ab8-52aa-7f58c33b5723.png)

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

- 参考文献
- Amazon Web Services ブログ
    - AWS PrivateLinkのアップデート – お客様のアプリケーション&サービス向けのVPCエンドポイント
        - https://aws.amazon.com/jp/blogs/news/aws-privatelink-update-vpc-endpoints-for-your-own-applications-services/
    - AWS PrivateLink で AWS VPN を経由したアクセスをサポート
        - https://aws.amazon.com/jp/about-aws/whats-new/2018/09/aws-privatelink-now-supports-access-over-aws-vpn/ 

- Developers.IO（クラスメソッドさん）
    - https://dev.classmethod.jp/cloud/aws/try-aws-privatelink_2/