CloudFrontのVPC Origin機能を試してみる！

こんにちは、ふくちです。

当記事は、re:Invent近辺のAWSアップデートを試してみる！ Advent Calendar 2024の1日目記事となっております！

https://qiita.com/advent-calendar/2024/try-aws-updates-around-reinvent

# アップデート概要
[2024年11月21日、Amazon CloudFrontがVPCオリジンに対応](https://aws.amazon.com/about-aws/whats-new/2024/11/amazon-cloudfront-vpc-origins/)したのと発表がありました！

これによって、CloudFront経由でのみアクセスできるプライベートサブネット内に、ALB, NLB, EC2を配置できるようになりました！

要するに、これまではこんな感じの構成にしていたのを↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/ffd1f280-ee35-52fe-587d-7e72134c0396.png)

こんな感じにできるということですね！↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/eec0ed6e-fd06-2333-bd9e-fef1c7ae24fe.png)

これによるメリットは、大きく2つあると考えています。
1. コスト削減
→ALBやEC2がパブリックIPを持つ必要がなくなるので、お財布に優しくなります
2. セキュリティ
→パブリックIPを持たないので、よりセキュアな環境を保つことができる

これからのスタンダードな構成になりそうな機能なので、しっかり触っておくことにしました！

# やってみた
実際に作るのは、先程の構成図と同じものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/eec0ed6e-fd06-2333-bd9e-fef1c7ae24fe.png)

以下の新規ドキュメントを参考に、作業を進めます。

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-vpc-origins.html

## 前提条件
VPC, ALB, EC2を作成し、アクティブステータスにしておきます。

また、注意点としては、
- マルチアカウントには非対応(2024/12/01時点)なので、VPCとCloudFrontは**同じリージョンに作成**する必要がある
- **インターネットゲートウェイが必要**(サブネットへのルーティングには使用しないが、VPCがインターネットからのトラフィックを受信するために必要)
- プライベートサブネットにはIPv4アドレスが必要
- VPCプライベートオリジンのセキュリティグループにおいて、**CloudFrontマネージドプレフィックスリストを明示的に許可**
→どうやら、ALBのセキュリティグループにはCloudFrontが作成するPrivate Origin用のENIを設定すれば良いみたいです！

などが挙げられます。
インターネットゲートウェイなんかは、知っておかないと躓いてしまいそうなポイントなので要注意ですね。

### VPC作成
VPC内にはプライベートサブネットのみ作成し、インターネットゲートウェイもアタッチだけしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/b74b68ab-e792-87ee-59d1-e3df9caa2239.png)

### EC2作成
ApatcheだけインストールしたEC2へアクセスします。CloudFront経由で下記にアクセスできたら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/5f7b6745-c297-3540-6efd-0cfcae263c6f.png)

### ALB作成
内部向けに作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/d7a5c5af-178a-470d-1c40-57258422597a.png)

ALBにアタッチするセキュリティグループはこんな感じで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/7240ac3f-9707-a5c6-8992-846581d8074e.png)

## CloudFrontの設定
画面左の一覧から、VPCオリジンを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/c93ac193-4de2-6259-d4f8-e2ce267a852b.png)

作成へと進み、オリジンARNには先ほど作成したALBを指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/4c287395-f8df-0308-efbf-9e3ee7c42faf.png)

これでVPCオリジンの作成が完了しました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/2babbc0a-948d-3c6c-b5ec-3f15b6f162b1.png)

続いて、ディストリビューションの作成を実施。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/0b9c6800-8ce2-c4c7-3f93-e3f98c24fbbf.png)

オリジン選択のところで、先程作成した**VPCオリジンを選択**しましょう！
※ALBを選択しないように注意！(一敗)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/fcc36347-494f-769e-9150-21aa6b99e903.png)

そして払い出されたディストリビューションドメイン名にアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/32e1f162-1222-99a2-7f7c-039a7453a649.png)

これで接続できる！…と思いきや504エラー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/31cf673e-bc09-6fa1-60fb-729fe3377fc7.png)

ALBのリソースマップを確認するとリクエストがタイムアウトしているとのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/cb2a1ecc-f3de-447d-f40b-a52a8e9e6062.png)

これは私が完全に勘違いしていたことなのですが、先ほど作成したセキュリティグループ(CloudFrontのプレフィックスリストを明示的に追加したもの)をEC2にアタッチしてしまっていたんですよね。。。

ALBからのアクセスを受け付ける必要があるのだから、それ用にセキュリティグループを変更してあげました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/72426bb4-5d62-a5e0-07d7-4f304be48169.png)

これで無事アクセス成功しました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/3291bd76-3511-4975-ce80-444d4c1ad055.png)

***

※VPCオリジンにEC2を選択した場合の注意点
ディストリビューション作成時や、ディストリビューションに追加でオリジンを設定する場合、VPC origin domainのところに、EC2のプライベートIP DNS名を手動でコピペする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/a9a59238-7523-a0f6-6cf1-5514beef57d9.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/5b745c7e-e6b3-a194-5a8c-fdfdece50fa7.png)

ALBは自動で出てくれるのですが、EC2だけ「なに設定すればいいんだっけ？」とならないように注意が必要です。

***

試しに、パブリックサブネットにあるALBに対してもVPCオリジンが設定できるのか試してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/15dd2135-1c8b-ed04-b3e6-6079cc580b7d.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/31685ae2-eea3-244a-6380-b9e46c5a6b17.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/63930d1a-9fea-a51b-83c8-5b5f96c53cf6.png)

**デプロイ出来ましたね…**

ディストリビューションでももちろん設定可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/90775c24-c7e9-55d7-b342-89803c202058.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/19125080-7077-b3de-21be-1d99093c4581.png)

これ、普通にALBをオリジンとするのとはなにか違うんでしょうかね…ちょっとそこまでは調べきれませんでした。

また時間があれば調べてみようと思います！

# まとめ
VPCオリジン自体は簡単に作成できました！

ただ、それ以外の部分(EC2やらALBやら)で躓いてしまうことが多かったので、もっと環境触らないといけないなとなりました…

皆さんも是非試してみてください！