背景や目的
近年、クラウド環境でのアプリケーション開発が一般的になり、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 割り当て ID | 18.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にはまだ学ぶべきことが多く、何かお気づきの点やより良い構成があればぜひ 以下の「ご連絡フォーム」からコメントを頂けますとありがたいです。
ಕೊನೆಯವರೆಗೂ ಓದಿದ್ದಕ್ಕಾಗಿ ಧನ್ಯವಾದಗಳು.
(最後まで読んでいただきありがとうございます)
