AWS PrivateLinkが登場 EC2やELBでどのように使うか

#AWS Private link について

先日 AWS Private linkという機能が発表されました。
https://aws.amazon.com/jp/blogs/aws/new-aws-privatelink-endpoints-kinesis-ec2-systems-manager-and-elb-apis-in-your-vpc/

これまでの方式(DynamoDB,S3)はエンドポイントのゲートウェイ経由で各サービスのAPIに接続する形でしたが
新しい方式ではエンドポイントがENIに紐付き、VPCのプライベートIPを持つかたちになります。
この方式のメリットとしては
・セキュリティグループでエンドポイントへのアクセスを管理できるようになる
・エンドポイントにDirect Connectを介してアクセスすることができる
というのが大きいかなと思います。

## Private linkに対応するサービス
今回のタイミングで、 以下のサービスが新たにVPCの中から使えるようになりました。
その他のサービスもComing Soonでサポート予定とのこと。

* Kinesis
* Service Catalog
* Amazon EC2
* EC2 Systems Manager 
* Elastic Load Balancing

## EC2やELBでの使いどころ
Kinesisの対応はわかりやすいです。
プライベートなEC2からKinesisにデータプッシュできるとか最高やないか。
でもEC2やELBのエンドポイントって？と私は思ってしまったのでした。
例えば、EC2なら別VPCのパブリックなEC2にプライベートに接続？とかよく分からないことを考え初めてしまった。

基本に立ち返ってドキュメントを確認しました。
新しい方式(インターフェースVPCエンドポイント)についてはまだ日本語のドキュメントはありませんが
原文のドキュメントは以下のURLから参照できます。
http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpce-interface.html

ページ下部のAccessing an AWS Service Through an Interface EndpointにELBの
エンドポイントにAWS CLIからアクセスする例がありました。

```
aws elbv2 describe-load-balancers --endpoint-url https://vpce-0f89a33420c193abc-bluzidnv.elasticloadbalancing.us-east-1.vpce.amazonaws.com/
```

単純にAWS CLIやSDKからAPI操作する際に使えば良いイメージでしょうか。
言われてみれば冒頭のBlogのタイトルも **～Amazon EC2 APIs, and ELB APIs in your VPC** でした。

#EC2でやってみる
まずは単純にプライベートなEC2でAWS CLIを操作してみます。
当然ですが、接続エラーになりました。

```
$aws ec2 describe-availability-zones

HTTPSConnectionPool(host='ec2.ap-northeast-1.amazonaws.com', port=443): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<botocore.awsrequest.AWSHTTPSConnection object at 0x7f002bf53e10>, 'Connection to ec2.ap-northeast-1.amazonaws.com timed out. (connect timeout=60)'))
```
##PrivateLinkの作成
コンソールのVPCのメニューからエンドポイント → Create Endpoint と進みます。
S3とDynamodbのエンドポイントしか選択できない場合は、一度コンソールの言語設定を英語にすると
以下のような画面が表示されました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/b2a06139-7d47-b494-35cf-9ab1271ff9a6.png)

**Service Name:** com.amazonaws.ap-northeast-1.ec2 を選択

**VPC, subnet, SecurityGroup:**それぞれ任意のものを指定します。
SecurityGroupでは443のインバウンドを許可する必要があります。

**Enable for this endpoint:**
PrivateLinkのエンドポイントはVPCのIPアドレスを使用するため、VPCのプライベートDNSを使用して
AWSサービスのDNS名を上書きすることができます。
チェックを入れると「ec2.ap-northeast-1.amazonaws.com」のVPC内のルックアップが、
作成するエンドポイントのIPアドレスに解決されます。

上記を指定したら、画面下部のCreate endpointを押下します。

##動作確認
先ほどと同じく、プライベートなEC2からAWS CLIを実行します。

```js
$ aws ec2 describe-availability-zones
{
    "AvailabilityZones": [
        {
            "State": "available",
            "ZoneName": "ap-northeast-1a",
            "Messages": []
            "RegionName": "ap-northeast-1"
        },
        {
            "State": "available",
            "ZoneName": "ap-northeast-1c",
            "Messages": [],
            "RegionName": "ap-northeast-1"
        }
    ]
}

```
Enable for this endpointにチェックを入れているので全く同じコマンドで実行することができました。
プライベートDNS名を有効にしない(チェックを入れない)場合は --endpoint-url で
エンドポイント固有に割り当てられているDNS名を指定すると接続することができます。

```js
$ aws ec2 describe-availability-zones --endpoint-url https://vpce-xxxxxxxxxx-xxxxxx.ec2.ap-northeast-1.vpce.amazonaws.com
{
    "AvailabilityZones": [
        {
            "State": "available",
            "ZoneName": "ap-northeast-1a",
            "Messages": [],
            "RegionName": "ap-northeast-1"
        },
        {
            "State": "available",
            "ZoneName": "ap-northeast-1c",
            "Messages": [],
            "RegionName": "ap-northeast-1"
        }
    ]
}
```
基本的な内容かもしれませんが、参考になれば幸いです。
以上です。