2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CloudFrontを利用してパブリックIPv4のないEC2に接続する

Last updated at Posted at 2024-12-04

はじめに

AWSからCloudFrontにVPC originsという機能が実装されましたので、早速試してみました。私の業務ではEC2を立てて様々なサービスを検証用にホストすることが多く、SSL/TLS通信をさせるためだけにEC2の手前にACMと連携したELBを立てたり、EIPを使ったりしています。この部分を今回の機能で置き換えできれば、ELBやEIP分のコストを削減できそうなので試してみました。

先に結論

ELBやEC2をパブリックサブネットに配置することなく、CloudFrontを通じてEC2上のサービスにアクセスできました。ホストしているサービスがCloudFrontのタイムアウト等の制限にかからないものであれば代用できそうです。

構成

今回は以下の環境で試してみました。EC2からのアウトバウンド用にNAT Gatewayを既に立てていますが、今回の検証には使用しません。EC2上にはDifyを立ててポート80でListenさせています。図には記載していませんが、IGWがVPCにアタッチされている必要があります。私の環境はSubnet自体が他のアカウントにあり、Resource Access Managerで共有されていますが、この環境でもVPC originsは問題なく使えました。
overview.png

手順

  1. CloudFrontからの接続先となるVPCとEC2とSSL/TLS通信用のACMを用意します。この手順は割愛します。
  2. CloudFrontコンソールからVPC Originsを作ります。
    1. 各項目を埋めて、「VPCオリジンを作成」を押下します。
      1. Name: ターゲットを識別しやすい名称にすると良さそうです。今回はdify-instanceにしました。
      2. オリジンARN: リストの候補ではELBは出てきましたが、EC2は出てきませんでした。EC2コンソールからARNをコピーしてそのままペーストします。
      3. プロトコル: 今回は対象インスタンス上でHTTP(80)のみListenしているので、HTTPを選択します。
  3. CloudFrontディストリビューションを作成します。
    1. オリジン
      1. Origin domain: 2で作成したVPC Originがリストに表示されるので、選択します。
      2. VPC origin domain: EC2のプライベートドメイン名(例:ip-xx-xx-xx-xx.ap-northeast-1.compute.internal)を入力します。この値はEC2コンソールから確認できます。
      3. その他の項目は任意です。今回はデフォルト設定としました。
    2. キャッシュビヘイビア
      1. ビューワープロトコルポリシー: HTTPSのみとしたいのでRedirect HTTP to HTTPSにします。
      2. 許可された HTTP メソッド: 全て許可のGET, HEAD, OPTIONS, PUT, POST, PATCH, DELETEにします。
      3. キャッシュポリシー: キャッシュさせたくないのでCache policy and origin request policy (recommended)CachingDisabledを選択します。オリジンリクエストポリシーはAllViewerを設定します。
    3. 基本設定
      1. 今回は代替ドメイン名Custom SSL certificateだけ設定しました。
    4. その他
      1. IP制限をしたい場合はWAFも設定してください。今回は割愛しています。
  4. SecurityGroupの設定を行います。
    1. VPCコンソールのSecurityGroup画面を確認するとCloudFrontと名のついたSecurityGroupが作成されていました。説明を確認すると「CloudFront configured SecurityGroup」と書かれていたのでVPC origins作成時に作られたようです。このSecurityGroupからのインバウンド許可ルールをEC2側のSecurityGroupに追加します。EC2上のサービスが80でListenしているのでポート80でこのソースSecurityGroupを許可します。

設定完了後は無事アクセスを確認できました。
スクリーンショット 2024-11-25 17.03.27.png

気をつけるポイント

  • EC2側でListenしていないポートを設定しないようにします。試しにEC2側でListenしていないHTTPSをVPC origin側でmatch-viewerを使って設定してみたところHTTPS通信は504エラーになりました。
    image.png

  • VPC originの場合、Response timeoutとKeepalive timeoutは変更できないようです。
    image.png

  • VPC originはCloudFrontに紐づけてしまうと変更ができないようです。新規作成して置き換えるか、一度外してから更新する必要があります。
    image.png

最後に

出たてホヤホヤの機能なので、まだ地雷は踏み抜けていないです。今回はDifyで試していますが、この構成でDifyが動作することを保証するものではありませんのでご注意ください。しばらく使ってみて踏んだら記事更新しようと思います。最後まで読んでいただきありがとうございました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?