AWS CLIによるVPC Endpoint設定

# はじめに
AWS Hands-on for Beginners でハンズオンしてみたものをアウトプットする資料として記事にまとめました。

**【Network編#1】AWS上にセキュアなプライベートネットワーク空間を作成する**

# 構成図
![net^N1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3501605/0ee4d020-e9bc-21f5-0a0f-b0415ac8d0c2.png)

VPCEndpointの**Gateway型**と**Interface型**を構築し、SSMとS3に接続を試すシンプルな構成図です。

# ハンズオンの流れ

ハンズオンのざっくりとした全体の流れは、以下の通りです。

①WEBインスタンスを構築し、SSM接続を許可するIAMロールを付与します。
②SSM接続の確認をします。
③Internalインスタンスを立て、SSM接続を許可するIAMロールを付与します。
④ルートテーブルを編集し、**NATゲートウェイ経由**でプライベートサブネット内からSSMへ接続をします。
★Private Route Table
| 送信先　　       |       ターゲット  | 
|:-----------------|------------------:|
| 10.0.0.0/16      |             local |  
| 0.0.0.0/0        |            nat-gateway |  

⑤ルートテーブルを編集し、Internal→SSM接続ができない状態にします。
★Private Route Table
| 送信先　　       |       ターゲット  | 
|:-----------------|------------------:|
| 10.0.0.0/16      |             local |  
 
⑥VPCEndpointを**Interface型**で作り、Internal→SSMへ接続します。
![img_int_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3501605/49c08699-fe61-9f00-2ac2-25112b7a610d.png)

⑦S3バケットを作成します。

⑧VPCEndpointを**Gateway型**で作ります。
![img_gtw_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3501605/d9e8344c-931d-7b7e-d103-ca1ea7e64ef8.png)

⑨ルートテーブルを編集します。
★Private Route Table
| 送信先　　       |       ターゲット  | 
|:-----------------|------------------:|
| 10.0.0.0/16      |             local |  
| S3        |            vpce-xxxx |  

⑩InternalのSSMから、`aws s3 ls --region ap-northeast-1`で出力を確認します。


IAMロールには以下のポリシーを付与します。
* AmazonS3ReadOnlyAccess
* AmazonSSMFullAccess
* AmazonSSMManagedInstanceCore（※）
※ハンズオン動画では紹介ありませんでしたが、こちらを付与していないとSSMの接続ができませんでした。

# Hands-onメモ
AWS CLIで構築したので、メモとして構築手順を記載します。
* VPCの作成、EC2の作成のCLI構築手順については、
以前の記事[【AWS CLIでスケーラブルウェブサイトを構築する】](https://qiita.com/kokichi8/items/fedb84896a286b70cc23)を参照ください。
* 以前の記事に記載のないCLI手順については、以下に記載します。

## 

## EIPの割り当て
```
aws ec2 allocate-address
```
出力は以下になります。
```
{
    "PublicIp": "xx.xx.xx.xx",
    "AllocationId": "eipalloc-xxxx",
    "PublicIpv4Pool": "amazon",
    "NetworkBorderGroup": "ap-northeast-1",
    "Domain": "vpc"
}
```
`AllocationId`を、NATゲートウェイ作成時に指定します。

## NATゲートウェイの作成
```
aws ec2 create-nat-gateway \
--allocation-id eipalloc-xxxx \
--subnet-id subnet-xxxx \
--tag-specifications 'ResourceType=natgateway,Tags=[{Key=Name,Value=Handson-B}]' \
--output json
```
EIPの付与、サブネットIDの指定、タグの割り当て、出力結果の指定をします。
出力は以下になります。
```
{
    "ClientToken": "xxxx-xxxx-xxxx-xxxx-xxxx",
    "NatGateway": {
        "CreateTime": "2023-08-xxT04:48:28+00:00",
        "NatGatewayAddresses": [
            {
                "AllocationId": "eipalloc-xxxx",
                "IsPrimary": true,
                "Status": "associating"
            }
        ],
        "NatGatewayId": "nat-xxxx",
        "State": "pending",
        "SubnetId": "subnet-xxxx",
        "VpcId": "vpc-xxxx",
        "Tags": [
            {
                "Key": "Name",
                "Value": "Handson-B"
            }
        ],
        "ConnectivityType": "public"
    }
}
```
## VPCエンドポイントの作成

```
aws ec2 create-vpc-endpoint \
    --vpc-endpoint-type Interface \
    --vpc-id vpc-xxxx  \
    --subnet-ids subnet-xxxx \
    --security-group-ids sg-xxxx \
    --service-name com.amazonaws.ap-northeast-1.ssm 

```
出力は以下のようになります。
```
{
    "VpcEndpoint": {
        "VpcEndpointId": "vpce-xxxx",
        "VpcEndpointType": "Interface",
        "VpcId": "vpc-xxxx",
        "ServiceName": "com.amazonaws.ap-northeast-1.ssm",
        "State": "pending",
        "RouteTableIds": [],
        "SubnetIds": [
            "subnet-xxxx"
        ],
        "Groups": [
            {
                "GroupId": "sg-xxxx",
                "GroupName": "Handson-B-ssm"
            }
        ],
        "IpAddressType": "ipv4",
        "DnsOptions": {
            "DnsRecordIpType": "ipv4"
        },
        "PrivateDnsEnabled": true,
        "RequesterManaged": false,
        "NetworkInterfaceIds": [
            "eni-xxxx"
        ],
        "DnsEntries": [
            {
                "DnsName": "vpce-xxxx-4cgcwtqq.ssm.ap-northeast-1.vpce.amazonaws.com",
                "HostedZoneId": "Z2E726K9Y6RL4W"
            },
            {
                "DnsName": "vpce-xxxx-4cgcwtqq-ap-northeast-1c.ssm.ap-northeast-1.vpce.amazonaws.com",
                "HostedZoneId": "Z2E726K9Y6RL4W"
            },
            {
                "DnsName": "ssm.ap-northeast-1.amazonaws.com",
                "HostedZoneId": "ZONEIDPENDING"
            }
        ],
        "CreationTimestamp": "2023-08-xxT02:38:35.644000+00:00",
        "OwnerId": "066576575514"
    }
}
```
タグ付けをします。
```
 aws ec2 create-tags --resources vpce-xxxx --tags Key=Name,Value=ssm-cli
```

# まとめ

* VPC Endpoint、AWS PrivateLinkを使うことで、VPCからIGW、NatGWを経由せずにVPC外サービスと直接通信が可能になる
* Gateway型とInterface型に分かれる
* Gateway型はS3やDynamoDBと接続
* Interface型はSSM、Clourwatchなどのサポートされているサービスと接続
*