EC2 Instance Connect Endpointを試してみた

# 背景・目的
最近、EC2を使うことが減りましたが、久しぶりに触れる機会がありました。
以前は、セッションマネージャーで接続していましたが、今回はEC2 Instance Connect Endpointを使ってみます。

# まとめ
下記に特徴をまとめます

|特徴|説明|
|:--|:--|
|概要|踏み台や、VPC がインターネットに直接接続したりする必要はなく、インターネットからインスタンスに安全に接続できる|
|利点|・インスタンスにパブリックIPv4を設定しなくてよい<BR>・VPCにIGWを設定しなくても、インスタンスに接続できる<BR>・IAMポリシーとアクセス許可を使用して、アクセス制御できる<BR>・CloudTrailログが作成される|
|料金|・EC2 Instance Connect エンドポイントの使用に追加コストはかからない<BR>別のAZのインスタンスに接続する場合は、データ転送に追加料金がかかる|
|仕組み|・EC2 Instance Connect エンドポイントは ID を認識する TCP プロキシ<BR>・IAMエンティティの認証情報を使用して、クライアントからエンドポイントへのプライベートトンネルを確立する<BR>・トラフィックはVPC到達する前に認証される|
|AZ間の通信|可能。しかしデータ転送料がかかる|
|向いてないユースケース|・大量データ転送は不向き<BR>スロットリングされる場合がある|
|接続性|・同時接続は20<BR>最大接続時間は1時間|
|制限事項|・サポートしないインスタンスがある。詳細は本文を参照。<BR>・エンドポイントは、VPC,サブネットごとに1つだけ作成可能|


# 概要
下記を基に整理します。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/connect-with-ec2-instance-connect-endpoint.html

> EC2 Instance Connect エンドポイントを使用すると、踏み台ホストを使用したり、仮想プライベートクラウド (VPC) がインターネットに直接接続したりする必要がなく、インターネットからインスタンスに安全に接続できます。

- 踏み台や、VPC がインターネットに直接接続したりする必要はなく、インターネットからインスタンスに安全に接続できる

> 利点
> - インスタンスにパブリック IPv4 アドレスを設定することなく、インスタンスに接続できます。AWS は、実行中のインスタンスと Elastic IP アドレスに関連付けられたパブリック IPv4 アドレスを含む、すべてのパブリック IPv4 アドレスに対して料金を請求します。詳細については、「Amazon VPC の料金」ページの「パブリック IPv4 アドレス」タブを参照してください。

> - VPC にインターネットゲートウェイ経由の直接インターネット接続を必須としなくても、インターネットからインスタンスに接続できます。

> - IAM ポリシーとアクセス許可を使用して、インスタンスに接続する EC2 Instance Connect エンドポイント の作成と使用へのアクセスを制御できます。

> - インスタンスへの接続を試みると、成功または失敗を問わず、すべて CloudTrail にログが作成されます。

- 利点
    - インスタンスにパブリックIPv4を設定しなくてよい
    - VPCにIGWを設定しなくても、インスタンスに接続できる
    - IAMポリシーとアクセス許可を使用して、アクセス制御できる
    - CloudTrailログが作成される


> 料金
EC2 Instance Connect エンドポイントの使用に追加コストはかかりません。EC2 Instance Connect エンドポイント を使用して、別のアベイラビリティーゾーンにあるインスタンスに接続する場合、アベイラビリティーゾーン間のデータ転送に追加料金がかかります。

- EC2 Instance Connect エンドポイントの使用に追加コストはかからない
- 別のAZのインスタンスに接続する場合は、データ転送に追加料金がかかる

## 仕組み
> EC2 Instance Connect エンドポイントは ID を認識する TCP プロキシです。EC2 Instance Connect エンドポイントサービスは、IAM エンティティの認証情報を使用して、コンピュータからエンドポイントへのプライベートトンネルを確立します。トラフィックは VPC に到達する前に認証され、承認されます。

- EC2 Instance Connect エンドポイントは ID を認識する TCP プロキシ
- IAMエンティティの認証情報を使用して、クライアントからエンドポイントへのプライベートトンネルを確立する
- トラフィックはVPC到達する前に認証される

> 追加のセキュリティグループルールを設定すると、インスタンスへのインバウンドトラフィックを制限できます。例えば、インスタンスのインバウンドルールを使用して、EC2 Instance Connect エンドポイントのみから管理ポートへのトラフィックを許可できます。

- 追加のセキュリティグループルールを設定すると、インスタンスへのインバウンドトラフィックを制限できる

> ルートテーブルルールを設定すると、エンドポイントが VPC の任意のサブネットの任意のインスタンスに接続できるようにすることができます。

- ルートテーブルを設定し、エンドポイントがVPCの任意のサブネットの任意のインスタンスに接続できる

> 次の図は、ユーザーが EC2 Instance Connect エンドポイントを使用してインターネットからインスタンスに接続する方法を示しています。まず、サブネット A に [EC2 Instance Connect エンドポイント]を作成します。サブネット内のエンドポイント用のネットワークインターフェイスを作成します。これは VPC 内のインスタンス宛のトラフィックのエントリポイントとして機能します。サブネット B のルートテーブルがサブネット A からのトラフィックを許可している場合、エンドポイントを使用してサブネット B のインスタンスに到達できます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9ec2144e-5e26-eb08-34ad-30aa141af366.png)
※出展：[EC2 Instance Connect エンドポイント を使用したインスタンスへの接続](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/connect-with-ec2-instance-connect-endpoint.html)

## 考慮事項
> EC2 Instance Connect エンドポイント は、特に管理トラフィックのユースケースを対象としており、大量のデータ転送を想定していません。大量のデータ転送はスロットリングされます。

- 大量データ転送は不向き
- スロットリングされる

> インスタンスには IPv4 アドレス (プライベートまたはパブリックのいずれか) が必要です。EC2 Instance Connect エンドポイント は IPv6 アドレスを使用したインスタンスへの接続をサポートしていません。

- IPv4アドレスが必要
- IPv6アドレスはサポートしてない

> (Linux インスタンス) 独自のキーペアを使用すると、任意の Linux AMI を使用できます。その他の場合、インスタンスには EC2 Instance Connect がインストールされている必要があります。どの AMI に EC2 Instance Connect が含まれているか、およびサポートされている他の AMI にインストールする方法については、EC2 Instance Connect のアンインストール を参照してください。

- 独自のキーペアを使用することで任意のLinux AMIを使用することが可能

> セキュリティグループの作成時に、EC2 Instance Connect エンドポイントへの割り当てが可能です。それ以外の場合は、VPC のデフォルトのセキュリティグループを使用します。EC2 Instance Connect エンドポイントのセキュリティグループは、宛先インスタンスへのアウトバウンドトラフィックを許可する必要があります。詳細については、「EC2 Instance Connect Endpoint のセキュリティグループ」を参照してください。

> EC2 Instance Connect エンドポイント を設定し、リクエストをインスタンスにルーティングするときに、クライアントのソース IP アドレスを保持することができます。それ以外の場合、ネットワークインターフェイスの IP アドレスは、すべての受信トラフィックのクライアント IP になります。

- リクエストをインスタンスにルーティングする際、クライアントのソースIPを保持できる

> クライアント IP 保存を有効にする場合、インスタンスのセキュリティグループはクライアントからのトラフィックを許可する必要があります。また、インスタンスは EC2 Instance Connect エンドポイント と同じ VPC にある必要があります。

- クライアントIP保存を有効にする場合、インスタンスのセキュリティグループはクライアントからのトラフィックを許可する必要がある
- インスタンスは、エンドポイントと同じVPCにある必要がある

> クライアント IP 保存を無効にする場合、インスタンスのセキュリティグループは VPC からのトラフィックを許可する必要があります。これがデフォルトです。

> インスタンスタイプが C1、CG1、CG2、G1、HI1、M1、M2、M3、T1 である場合、クライアント IP 保存をサポートしません。クライアント IP の保存を有効にし、EC2 Instance Connect エンドポイントを使用してこれらのインスタンスタイプのいずれかのインスタンスに接続しようとすると、接続は失敗します。

- サポートしないインスタンスがある。2024/10/5 時点では下記が対象
    - C1
    - CG1
    - CG2
    - G1
    - HI1
    - M1
    - M2
    - M3
    - T1

> トラフィックがトランジットゲートウェイを経由してルーティングされる場合、クライアント IP の保存はサポートされません。

- TGW経由しルーティングされる際には、クライアントIPの保存はサポート外

> EC2 Instance Connect Endpoint を作成した場合、AWS Identity and Access Management (IAM) の Amazon EC2 サービスに対して、サービスにリンクされたロールが自動的に作成されます。Amazon EC2 は、サービスにリンクされたロールを使用してアカウントインターフェイスをプロビジョニングします。これは、EC2 Instance Connect Endpoint を作成するときに必要です。詳細については、「EC2 Instance Connect Endpoint のサービスにリンクされたロール」を参照してください。

- エンドポイントを作成した場合、IAMのEC2に対してサービスにリンクされたロールが自動的に作成される

> EC2 Instance Connect Endpoint を VPC およびサブネットごとに 1 つだけ作成できます。詳細については、「EC2 Instance Connect エンドポイントのクォータ」を参照してください。別の EC2 Instance Connect Endpoint を同じ VPC 内の別のアベイラビリティーゾーンに作成する必要がある場合は、まず既存の EC2 Instance Connect Endpoint を削除する必要があります。そうしないと、クォータエラーが発生します。

- エンドポイントは、VPC,サブネットごとに1つだけ作成可能

> 各 EC2 インスタンス接続エンドポイントは、最大 20 の同時接続をサポートできます。

- 同時接続は20

> 確立された TCP 接続の最大持続時間: 1 時間 (3,600 秒)。IAM ポリシーでは最大許容時間を最大 3,600 秒で指定できます。詳細については、「ユーザーに EC2 Instance Connect エンドポイント を使用してインスタンスへ接続するためのアクセス許可」を参照してください。

- 最大接続時間は1時間


# 実践
Instance Connect Endpointで接続したEC2から、インターネットに接続したいため下記のような環境を構築します。また、S3バケットにもVPCeを通して接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/632dec90-aee9-6dfb-dc3c-b1c7587f94cf.png)


## NWを作成
1. VPCで下記の環境を構築します
    - プライベートサブネット
    - パブリックサブネット
    - NATGW
    - IGW
    - VPCエンドポイント（S3）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/50c817f7-a26c-3569-d4e9-5e68b0873426.png)

## セキュリティグループを作成
1. EC2に移動します
1. ナビゲーションペインで「セキュリティグループ」をクリックします

### EC2 Instance Connect Endpointのセキュリティグループ
1. 「セキュリティグループを作成」をクリックします
1. 下記を指定し、「セキュリティグループを作成」をクリックします
    - VPC:作成したVPC
    - インバウンドルール：SSH、ソースはマイIP
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5b9077d7-b2ec-4956-543f-b68ea0a0af2e.png)


### EC2のセキュリティグループ
1. 「セキュリティグループを作成」をクリックします
1. 下記を指定し、「セキュリティグループを作成」をクリックします
    - VPC:作成したVPC
    - インバウンドルール：SSH、上記で作成したエンドポイントのセキュリティグループ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/383c7cd8-6294-885e-d720-0fab099f7d5c.png)


## エンドポイントの作成
1. VPCに移動します
1. ナビゲーションペインで、「エンドポイント」をクリックします
1. 「エンドポイントを作成」をクリックします
1. 下記を入力し、 「エンドポイントを作成」をクリックします
    - ①：サービスカテゴリ：EC2インスタンス接続エンドポイント
    - ②：作成したVPC
    - ③：作成したエンドポイントのセキュリティグループ
    - ④：作成したプライベートサブネット
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4652f47f-80ab-26e5-efc1-292b21a63a13.png)

## EC2のIAMロールを作成
### IAMロール
1. IAMに移動します
1. 下記を指定して「次へ」をクリックします
    - 信頼されたエンティティタイプ:AWSのサービス
    - ユースケース：EC2
1. 「ロールを作成」をクリックします

### IAMポリシー
1. 作成したIAMロールを選択します
1. 「許可」タブをクリックし、「許可を追加」、「インラインポリシーを作成」をクリックします
1. 下記のポリシーを追加します
    ```json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "s3:ListAllMyBuckets",
            "s3:ListBucket",
            "s3:GetObject",
            "s3:PutObject"
          ],
          "Resource": "*"
        }
      ]
    }
    ```
1. ポリシー名を指定し、「ポリシーを作成」をクリックします

## インスタンスを起動
1. EC2に移動します
1. 「インスタンスを起動」をクリックします
1. 下記を指定し、「インスタンスを起動」をクリックします
    - ①：キーペアなし
    - ②：作成したVPC
    - ③：作成したプライベートサブネット
    - ④：パブリックIP無効化
    - ⑤：セキュリティグループ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4b53a912-2e99-1fb2-e881-757b712c76ce.png)
    - インスタンスプロファイル：作成したIAMロールを指定
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/36c84c37-287d-c298-8f22-ad5b45bff1b6.png)


## 接続確認（ログイン）
1. 作成したEC2をクリックします
1. 接続をクリックします
1. 下記を指定して「接続」をクリックします
    - ①：EC2 Instance Connect
    - ②：EC2 Instance Connect エンドポイントを使用して接続する
    - ③：EC2 Instance Connect エンドポイント：作成したエンドポイントを指定
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/90718805-4965-ab4c-1320-1da37c8233ff.png)

1. 接続できました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/abeabd2e-88ef-36c6-27e4-07ee8caaf72e.png)

## S3への接続確認
1. S3への接続について、確認できました
    ```bash
    [ec2-user@XXXXXX ~]$ aws s3 ls
    2023-07-04 14:44:30 XXXXX
    ・・・・
    [ec2-user@XXXXXX ~]$ 
    ```

## 外部への接続確認
1. 確認できました
    ```bash
    [ec2-user@XXXXXX ~]$ curl -I https://www.google.com
    HTTP/2 200 
    content-type: text/html; charset=ISO-8859-1
    ・・・・
    [ec2-user@XXXXXX ~]$ 
    ```

# 考察
今回は、EC2 Instance Connect Endpointを使用して、EC2に接続してみました。
エンドポイントを利用することで、インターネットを介さずにプライベートサブネット内のEC2インスタンスにセキュアに接続できるのが大きな特徴です。従来、プライベートサブネット内のインスタンスにアクセスするには、踏み台サーバを経由したり、VPNを設定したりと、セキュリティと利便性のバランスを考慮した設定が必要でしたが、EC2 Instance Connect Endpointを使うことで、これらの手間を減らしながらもセキュリティを維持できます。

また、セッションマネージャーは、VPCeを複数用意する必要があり手間やコストがかかるため利便性が高いと感じました。
今後も利用して行きたいと思います。

# 参考
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-methods.html