RAG型社内チャットボットのVPC構築例

背景や目的


近年、クラウド環境でのアプリケーション開発が一般的になり、AWSを利用した開発プロジェクトはどんどん増えています。セキュリティや運用のしやすさを考慮すると、AWSの仮想ネットワークであるVPC (Virtual Private Cloud) の設計が重要なポイントとなりそうです。

私が担当した最近のAI利用開発で、VPCとパブリックサブネット、プライベートサブネットを使って各Lambda関数を動作させるような環境をセットアップしました。
Lambda関数をAPIサーバーとして使う方法など、初めての事も多かったのですが、多くの知見を得ることができたので、今回ご紹介したいと思います。

実現したい事


アプリとしては、AI社内チャットボットです。

社内情報をRAGで回答させるチャットボット画面を提供します。

アーキテクチャ図としては以下の通りです。

今回紹介するのは、VPCと2つのサブネット内の部分となります。

構築手順概要


以下の手順で構築しました。

1.VPCの作成
2.サブネットの作成(パブリック)
3.サブネットの作成(プライベート)
4.VPCエンドポイントの作成1:S3
5.VPCエンドポイントの作成2:DynamoDB
6.VPCエンドポイントの作成3:Lambda

構築1)VPC作成


まず本案件で使うVPCを作成します。デフォルトVPCがあるけども、今回は新サービス用に作成しました。

・AWSにログイン後、VPCメニューに遷移し、「VPC」や左メニューの「お使いのVPC」を押します。(※AWSのアカウント作成や一般手続きは割愛します)

・表示された「お使いのVPC」画面でデフォルトVPCがあるが、今回は新VPCを作成します。「VPCを作成」を押します。

・下表の値でVPCを作成します。ルーティングのためネットワークアドレスは、大まかに利用数を考慮しローカルIPで設定しました。

設定項目
名前タグvpc-ctcrag  ※お好きな名前で設定
IPv4 CIDR ブロック192.168.0.0/24
IPv6 CIDR ブロックなし ※デフォルト
テナンシーデフォルト ※デフォルト

これで、VPC作成は完了です。次はサブネット作成します。

構築2)サブネットの作成(パブリック)


外部アクセスをさせるために、インターネットゲートウェイと通信可能でNATが配置されたパブリックサブネットを作成します。

・サブネットを作成する前に、インターネットアクセスが可能となるようにインターネットゲートウェイ(IGW)を先に作成します。左メニューの「インターネットゲートウェイ」を押します。

・デフォルトのIGWがあるのですが、新しく作成しました。「インターネットゲートウェイの作成」を押します。

・インターネットゲートウェイの作成画面では下表の値を入力し、「インターネットゲートウェイの作成」を押します。

設定項目
名前タグIGW-for-ctcrag ※お好きな名前で設定

・作成したIGWを選択し、「アクション」→「VPCにアタッチ」を押します。

・その画面で上で作成したVPC(vpc-ctcrag)を選択して「インターネットゲートウェイのアタッチ」押します。

・アタッチ後、作成したIGWの状況は「Attached」になったら完了です。

・次はサブネットを作成します。
・左メニューの「サブネット」を押し、表示された画面で「サブネットを作成」を押します。

・下表の値を入力し「サブネットを作成」を押せばサブネット作成は完了です。

設定項目
VPC ID上で作成したvpc-ctcragを選択
サブネット名public-subnet  ※後で解り易いようにこうしておく
IPv6 CIDR ブロックなし ※デフォルト
アベイラビリティーゾーンap-northeast-1a ※お手元の環境に応じて設定
IPv4 サブネット CIDR ブロック192.168.0.0/25  ※ノード数128個分で定義した

・次はNATゲートウェイを作成します。
・左メニュー「NATゲートウェイ」を押し「NATゲートウェイを作成」を押します。

・その画面で下表の値を入力し、途中で「ElasticIPを割り当て」を押し、最後に「NATゲートウェイを作成」を押します。

設定項目
名前NAT-for-ctcrag ※お好きな名前で設定
サブネット上で作成したpublic-subnet
接続タイプパブリック
Elastic IP 割り当て ID18.182.222.143 (eipalloc-*******) ※自動で決定されます

・最後にルートテーブルを作成し、パブリックサブネットを関連付けて、IGW経由でルーティングできるようにします。
・左メニューの「ルートテーブル」押し「ルートテーブルを作成」を押します。

・その画面で下表の値を入力し、「ルートテーブルを作成」を押します。

設定項目
名前ctcrag-public-route-table ※publicサブネット用のテーブルだと分かる名前に
VPC上で作成したvpc-ctcragを選択

・ルートテーブル作成後、それを選択して「アクション」→「サブネットの関連付けを編集」を押します。

・そうすると、下図のように存在するサブネットが表示されるので、今作成したパブリックサブネットにチェックを入れ「関連付けを保存」を押します。

・関連付け完了後、ルートテーブル画面の「明示的なサブネットの関連付け」に対象サブネットが表示されます。確認後、ルートテーブルを選び「アクション」→「ルートを編集」を押します。

・「ルートを編集」の画面には、先ほど指定したこのルートテーブルのVPCが表示されています。このルートテーブルにさらに、IGWへのルートを追加することが次のステップです。

・インターネットと通信できるようにするため、「ルートを追加」を押し、送信先に 0.0.0.0/0(全てのIPv4トラフィック=インターネット全体)を指定します。次に、ターゲットに作成した「インターネットゲートウェイ」を選び、「変更を保存」を押します。

これで、インターネットゲートウェイ経由で外部と通信できるルートを持ったパブリックサブネットが完成したはず、です。先に進みます。

構築3)サブネットの作成(プライベート)


安全に運用するために、アプリを配置するLambdaが属するサブネットをプライベートな配置になるように作成します。

・VPC画面に戻り、左メニューの「サブネット」、「サブネットを作成」を順番に押します。

・下表の値を入力し、「サブネットを作成」を押します。

設定項目
VPC ID上で作成したvpc-ctcragを選択
サブネット名private-subnet ※後で解り易いようにこうしておく
IPv6 CIDR ブロックなし ※デフォルト
アベイラビリティーゾーンap-northeast-1a ※環境に応じて設定
IPv4 サブネット CIDR ブロック192.168.0.128/25  ※ノード数128個分で定義した

・プライベート用サブネット作成が完了したら、次はそれのルートテーブルを作成します。

・このサブネットのルーティングは、VPC内からNATゲートウェイ経由で外部アクセスを可能にするのプライベート用の内容にします。

・左メニューの「ルートテーブル」押し「ルートテーブルを作成」を押します。

・その画面で下表の値を入力し、「ルートテーブルを作成」を押します。

設定項目
名前ctcrag-private-route-table ※privateサブネット用のテーブルだと分かる名前に
VPC上で作成したvpc-ctcragを選択

・作成したルートテーブルをプライベートサブネットを関連付けます。作成したルートテーブルにチェックを入れ「アクション」→「サブネットの関連付けを編集」を押します。

・そうすると、下図のように利用可能なサブネットが表示されるので、今作成したプライベートサブネットを選択し「関連付けを保存」を押します。

・NATルート追加のため、再度ルートテーブルを選び「アクション」→「ルートを編集」を押します。

・「ルートを編集」の画面には、先ほど指定したこのルートテーブルのVPCが表示されています。このルートテーブルにさらに、NATゲートウェイへのルートを追加することが次のステップです。

・NATゲートウェイ経由で外部と通信できるようにするため、「ルートを追加」を押し、送信先に 0.0.0.0/0(全てのIPv4トラフィック=インターネット全体)を指定します。次に、ターゲットに作成した「NATゲートウェイ」を選び、「変更を保存」を押します。

・AWSアーキテクチャ図で示した通りですが、プライベート用ルートテーブルには、S3とDynamoDBへのアクセス情報を定義しておく必要がありそうです。これらはやり方が違うので、構築4・5で紹介します。

これで、プライベートサブネットの設定はこれで完了です。

構築4)VPCエンドポイントの作成1:S3


プライベートサブネット内のLambda関数からS3へ安全にアクセスできるように、S3用のエンドポイントを作成します。

・「VPC」ダッシュボードに移動し、左メニュー「エンドポイント」を押します。

・その画面で「エンドポイントを作成」を押します。

・表示された画面で下表の値を入力し、「エンドポイントを作成」を押します。

設定項目
名前タグS3-endpoint-for-ctcrag ※お好きな名前で設定
タイプAWS のサービス
サービスcom.amazonaws.ap-northeast-1.s3 タイプ=gateway
ネットワーク設定/VPC  上で作成したvpc-ctcragを選択
ルートテーブル先ほど作成したプライベートサブネット用の「ctcrag-private-route-table 」をチェック。
ポリシーフルアクセス

・作成完了後、S3用のVPCエンドポイントID(vpce-0**)が自動的に作成されます。

・S3用VPCエンドポイントのルート確認のため、ルートテーブル画面に戻り、「ctcrag-private-route-table」を選択し「ルート」を押します。ターゲットに該当する「vpce-**」があれば確認完了です(送信先:pl-**は自動設定)。

構築5)VPCエンドポイントの作成2:DynamoDB


同様の理由で、DynamoDB VPCエンドポイントも作成しました。

・エンドポイント画面に戻り、「エンドポイントを作成」を押します。

・表示された画面で下表の値を入力し、「エンドポイントを作成」を押します。

設定項目
名前タグDynamoDB-endpoint-for-ctcrag ※お好きな名前で設定
タイプAWS のサービス
サービスcom.amazonaws.ap-northeast-1.dynamodb タイプ=gateway
ネットワーク設定/VPC上で作成したvpc-ctcragを選択
ルートテーブル先ほど作成したプライベートサブネット用の「ctcrag-private-route-table 」をチェック。 
ポリシーフルアクセス

・作成完了後、DynamoDB用のVPCエンドポイントID(vpce-0**)が自動的に作成されます。

・DynamoDB用VPCエンドポイントのルート確認のため、ルートテーブル画面に戻り、「ctcrag-private-route-table」を選択し「ルート」を押します。ターゲットに該当する「vpce-**」があれば確認完了です(送信先:pl-**は自動設定)。

構築6)VPCエンドポイントの作成3:Lambda


プライベートサブネット内の2つのLambda関数間で、リクエストが届かない問題が発生し、このエンドポイントも作成しました。
(Lambda AからLambda B(API機能)へリクエストする場合はこれが必要でした。)

・エンドポイント画面に戻り、「エンドポイントを作成」を押します。

・表示された画面で下表の値を入力し、VPCとプライベート用サブネットを選択し「エンドポイントを作成」を押します。

設定項目
名前タグlambda-endpoint-for-ctcrag ※お好きな名前で設定
タイプAWS のサービス
サービスcom.amazonaws.ap-northeast-1.lambda タイプ=interface
ネットワーク設定/VPC上で作成したvpc-ctcragを選択
サブネット上で作成した「private-subnet」 ※プライベート用
セキュリティグループsg-**** (デフォルト)  ※ご自身の環境に合わせて下さい。
ポリシーフルアクセス

# 同じプライベートサブネット内にあるにもかかわらず通信できないという不可解な現象に直面し、しばらく試行錯誤しました。IAMポリシー設定なども見直しましたが、解決には至らず行き詰まっていました。そんなときにhiraiさんのこの記事を見つけ、Lambdaエンドポイントを作成することで解決できるかもこと思って、トライしてみて解決できました。hiraiさんありがとうございます。

これで、VPC全体のセットアップは完了です。

完成


チャット画面できました!

大丈夫!動いてます!

まとめ


VPC、2つのサブネット(パブリック・プライベート)、NATゲートウェイやVPCエンドポイントを構築し、AI社内チャットボットの環境を整えました。

VPCにはまだ学ぶべきことが多く、何かお気づきの点やより良い構成があればぜひ 以下の「ご連絡フォーム」からコメントを頂けますとありがたいです。

ಕೊನೆಯವರೆಗೂ ಓದಿದ್ದಕ್ಕಾಗಿ ಧನ್ಯವಾದಗಳು.
(最後まで読んでいただきありがとうございます)

ご連絡フォーム


フィードバックを是非お願いします。
本記事の方法での問題点や、よりよい方法のアイデアを頂けると大変助かります。

この記事に関して

その他のご連絡

DevAIsをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む