EC2からS3へVPCエンドポイント（インターフェース型）経由でアクセスすることを試す

# はじめに
本記事は以下記事を実際にやってみたことを記録した記事です

https://qiita.com/AWS11077/items/8332bd476124bc534c52

この構成を作って、S3にアクセスしてみます。この画像は転載なのでIPは違うかもしれません。他は同じだと思いますが、自分の解釈が入っているの少し違うかもしれません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131136/e9deb607-446a-cf7a-f9c1-cd3be4a2b4b8.png)

# 環境構築
# S3作成
なんか適当に作っておきましょう

## VPC作成
VPC名: `test-vpc-endpoint-interface-type`
後の設定は画像の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131136/8f0960cb-9f16-4951-f8d4-07c72c3220e3.png)

## セキュリティグループの作成
### PublicサブネットのEC2インスタンスのセキュリティグループの作成
- セキュリティグループ名: `test-vpc-endpoint-interface-type-public-ec2-sg`
- VPC: `test-vpc-endpoint-interface-type`
- 説明 : `test-vpc-endpoint-interface-type-public-ec2-sg`
- インバウンドルール:
  - SSH（ポート22）: すべてのインバウンドトラフィック（0.0.0.0/0）を許可 ※お仕事ではアクセス元は制限しようね
- アウトバウンドルール:
  - すべてのアウトバウンドトラフィック（0.0.0.0/0）を許可

### PrivateサブネットのEC2インスタンスのセキュリティグループの作成
- セキュリティグループ名: `test-vpc-endpoint-interface-type-private-ec2-sg`
- VPC: `test-vpc-endpoint-interface-type`
- 説明: `test-vpc-endpoint-interface-type-private-ec2-sg`
- インバウンドルール:
  - SSH（ポート22）: `test-vpc-endpoint-interface-type-public-ec2-sg`セキュリティグループからのアクセスを許可
  <!-- これは不要かもしれないー＞不要だった -->
  <!-- - HTTPS（ポート443）: `test-vpc-endpoint-interface-type-private-eni-sg`セキュリティグループからのアクセスを許可 -->
- アウトバウンドルール:
  - すべてのアウトバウンドトラフィック（0.0.0.0/0）を許可　※お仕事では制御がいるのかも


### PrivateサブネットのVPCエンドポイントのセキュリティグループの作成
- セキュリティグループ名: `test-vpc-endpoint-interface-type-private-eni-sg`
- VPC: `test-vpc-endpoint-interface-type`
- インバウンドルール:
  - HTTPS（ポート443）: `test-vpc-endpoint-interface-type-private-ec2-sg`セキュリティグループからのアクセスを許可

- アウトバウンドルール:
  - すべてのアウトバウンドトラフィック（0.0.0.0/0）を許可　※お仕事では制御がいるのかも


## IAMロールの作成とアタッチ

1. IAMコンソールで「ロール」を作成し、EC2を選択。
2. **AmazonS3FullAccess**ポリシーをアタッチ。
3. ロール名`ec2toS3AccessTest`を付けてロールを作成。

## EC2インスタンスの作成と設定

## PublicサブネットにEC2を作成
- 名前: `test-vpc-endpoint-interface-type-public-ec2`
- Amazon マシンイメージ (AMI): `Amazon Linux 2023 AMI `
- アーキテクチャ: `64ビット(x86)`
- インスタンスタイプ: `t2.micro`
- キーペア: `任意`
- VPC: `test-vpc-endpoint-interface-type-vpc`
- サブネット: `test-vpc-endpoint-interface-type-subnet-public1-ap-northeast-1a`
- パブリック IP の自動割り当て: `有効化`
- ファイアウォール (セキュリティグループ): `test-vpc-endpoint-interface-type-public-ec2-sg` ※既存のセキュリティグループです

EC2を作成したら
インスタンス一覧でインスタンス選択→アクション→セキュリティ→IAMロールを変更→`ec2toS3AccessTest`を選択→IAMロールの更新をクリック
※本来はこっちは不要だが動作検証したいのでロールを適用しておく

## PrivateサブネットにEC2を作成
- 名前: `test-vpc-endpoint-interface-type-private-ec2`
- Amazon マシンイメージ (AMI): `Amazon Linux 2023 AMI `
- アーキテクチャ: `64ビット(x86)`
- インスタンスタイプ: `t2.micro`
- キーペア: `任意`
- VPC: `test-vpc-endpoint-interface-type-vpc`
- サブネット: `test-vpc-endpoint-interface-type-subnet-private1-ap-northeast-1a`
- パブリック IP の自動割り当て: `無効化`
- ファイアウォール (セキュリティグループ): `test-vpc-endpoint-interface-type-private-ec2-sg` ※既存のセキュリティグループです

EC2を作成したら
インスタンス一覧でインスタンス選択→アクション→セキュリティ→IAMロールを変更→`ec2toS3AccessTest`を選択→IAMロールの更新をクリック

## VPCエンドポイント（インターフェース型）の作成（S3アクセス用）

**VPCコンソール**で「**エンドポイント**」を選択し、「**エンドポイントの作成**」を選択

- 名前タグ - オプション: `test-vpc-endpoint-interface-type`
- サービスカテゴリ: `AWSのサービス`
- サービス: `com.amazonaws.ap-northeast-1.s3 amazon Interface`
- VPC: `test-vpc-endpoint-interface-type-vpc`
- サブネット: `ap-northease-1a(apne1-az4) test-vpc-endpoint-interface-type-subnet-private1-ap-northeast-1a`
- セキュリティグループ: `test-vpc-endpoint-interface-type-private-eni-sg`
- ポリシー: `フルアクセス`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131136/b06a7e69-4505-6a70-1544-89de9a77f20d.png)

※セキュリティグループの選択が画像ではわからないが、`test-vpc-endpoint-interface-type-private-eni-sg`を選択してね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131136/1f17897f-db85-e66a-40fe-449229fb5d1b.png)

※しばらくはステータスが保留中になるかもしれない。使用可能になるまで待とう

エンドポイントのDNS名を確認する。`*.vpce-0fb14fa18f4a834bc-nlgbi1a2.s3.ap-northeast-1.vpce.amazonaws.com`となってました。これが大事

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131136/6faad122-c9d5-a5ee-a1d2-6cb15e4e09fe.png)


## 動作確認

PC-> パブリックサブネットのEC2 ->  プライベートサブネットのEC2にsshログインします

```bash
ssh EC2のパブリックIP
[ec2-user@ip-10-0-14-11 ~]$ aws s3 ls
2024-11-09 08:54:39 cf-templates-yjmgyq7q01ge-ap-northeast-1
2024-11-12 13:57:53 cfn-lambda-mattermost
```

エンドポイントを指定してない場合パブリックアクセスしているらしい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131136/d6394eae-17df-c024-40c4-dff45496a6f4.png)



次にプライベートサブネットからS3にアクセスしてみる
```bash
ssh EC2のプライベートIP

# ここはprivateサブネットのEC２で行います。

# --regionつけないと動かないみたい。他のネット記事にも書いてあった。となるとEC2から実行するプログラムでawsコマンドを実行している場合は動かなくなる恐れはある。ラムダは影響ないと書いてあったがやはり検証は必要。なお、このコマンドをpublicのEC2で実行するとフリーズする
[ec2-user@ip-10-0-138-204 ~]$ aws s3 ls
^C

# --regionつけると動いた 
[ec2-user@ip-10-0-138-204 ~]$ aws s3 ls --region ap-northeast-1 --endpoint-url https://bucket.vpce-0fb14fa18f4a834bc-nlgbi1a2.s3.ap-northeast-1.vpce.amazonaws.com
2024-11-09 08:54:39 cf-templates-yjmgyq7q01ge-ap-northeast-1
2024-11-12 13:57:53 cfn-lambda-mattermost


# nslookup　VPCエンドポイントの画面で表示されているIPとAddressが一致
[ec2-user@ip-10-0-138-204 ~]$ nslookup vpce-0fb14fa18f4a834bc-nlgbi1a2.s3.ap-northeast-1.vpce.amazonaws.com
Server:         10.0.0.2
Address:        10.0.0.2#53

Non-authoritative answer:
Name:   vpce-0fb14fa18f4a834bc-nlgbi1a2.s3.ap-northeast-1.vpce.amazonaws.com
Address: 10.0.136.199


# バケットの中までみたい
[ec2-user@ip-10-0-138-204 ~]$ aws s3 ls s3://test-codepipeline-zangief --region ap-northeast-1 --endpoint-url https://bucket.vpce-0fb14fa18f4a834bc-nlgbi1a2.s3.ap-northeast-1.vpce.amazonaws.com       
                           PRE deploy-artifacts/
                           PRE test-codepipeline-za/
2024-09-24 12:31:44          4 test.txt

# curl
[ec2-user@ip-10-0-138-204 ~]$ curl -v https://bucket.vpce-0fb14fa18f4a834bc-nlgbi1a2.s3.ap-northeast-1.vpce.amazonaws.com
* Host bucket.vpce-0fb14fa18f4a834bc-nlgbi1a2.s3.ap-northeast-1.vpce.amazonaws.com:443 was resolved.
* IPv6: (none)
* IPv4: 10.0.136.199 # これがプライベートIPらしく、プライベート接続だと思うことにする
*   Trying 10.0.136.199:443...
* Connected to bucket.vpce-0fb14fa18f4a834bc-nlgbi1a2.s3.ap-northeast-1.vpce.amazonaws.com (10.0.136.199) port 443
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/pki/tls/certs/ca-bundle.crt
*  CApath: none
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-CHACHA20-POLY1305 / prime256v1 / rsaEncryption
* ALPN: server did not agree on a protocol. Uses default.
* Server certificate:
*  subject: CN=s3.ap-northeast-1.amazonaws.com
*  start date: Nov 12 00:00:00 2024 GMT
*  expire date: Dec 11 23:59:59 2025 GMT
*  subjectAltName: host "bucket.vpce-0fb14fa18f4a834bc-nlgbi1a2.s3.ap-northeast-1.vpce.amazonaws.com" matched cert's "bucket.vpce-0fb14fa18f4a834bc-nlgbi1a2.s3.ap-northeast-1.vpce.amazonaws.com"      
*  issuer: C=US; O=Amazon; CN=Amazon RSA 2048 M02
*  SSL certificate verify ok.
*   Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 2: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* using HTTP/1.x
> GET / HTTP/1.1
> Host: bucket.vpce-0fb14fa18f4a834bc-nlgbi1a2.s3.ap-northeast-1.vpce.amazonaws.com
> User-Agent: curl/8.5.0
> Accept: */*
>
< HTTP/1.1 307 Temporary Redirect
< x-amz-id-2: Hsb8HGdPNavLnWseZE1EI1sK9IfcLJkgAweYTJH5iqz+ipI0LX3lAOl9Q44pfihLty71kElbv44=
< x-amz-request-id: 85T3176T174RFFNZ
< Date: Tue, 12 Nov 2024 15:44:50 GMT
< Location: https://aws.amazon.com/s3/
< Content-Length: 0
< Server: AmazonS3
<
* Connection #0 to host bucket.vpce-0fb14fa18f4a834bc-nlgbi1a2.s3.ap-northeast-1.vpce.amazonaws.com left intact
[ec2-user@ip-10-0-138-204 ~]$

```

## curlの結果をAIに聞いてみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131136/1bbcb103-6147-257c-c583-fd5c214871be.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131136/951bd3ed-a794-f3a6-c17f-4e9a46e78072.png)

# 終わったら
すぐ消そうね
- EC2
- VPCエンドポイント

他は課金されないと思う