質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1909閲覧

【AWS・EC2】プライベートサブネット内で構築したAPIをブラウザorコンソールから呼び出せない。

lawsoncoffee

総合スコア46

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

1グッド

0クリップ

投稿2022/06/13 11:28

以下の構成で、awsの環境構築をしています(aws初心者なので表現がおかしいかもですがご容赦ください)。

①1つのVPC内に、プライベートサブネットとパブリックサブネットを置く。 ②パブリックサブネット内について ・ルートテーブルとインターネットゲートウェイ、ルートテーブルとパブリックサブネットを紐付けて、パブリックサブネットがインターネットと通信できるようにした。 ・セキュリティグループのインバウンドは、SSH、HTTPS、HTTPを全て0.0.0.0/0で設定。 ・パブリックサブネットはフロントエンド用(Next.js)とするため、パブリックサブネット内でEC2をインスタンス起動して、ターミナルからEC2にアクセスして、Nginxを使用して、webサーバーを構築。 ・自作のソースコードを持ってきて、npm startし、ブラウザからhttp:// IPアドレスで、接続&ブラウザ表示を確認済。 ③プライベートサブネット内について ・プライベートサブネットはバックエンド用(nestJSでAPI、DBはPostgreSQL)とするため、EC2とRDSを構築。 ・セキュリティグループのインバウンドは、 SSH、HTTPS、HTTPをそれぞれ、フロントエンド側のセキュリティグループとバックエンド側のセキュリティグループを許可& PostgreSQLをバックエンド側のセキュリティグループのみ許可 ・こちらも、パブリックサブネット内のEC2からプライベートサブネット内のEC2にアクセスして、自作のソースコードを持ってきて、npm startが無事でき&DBにテーブルなどが作成できたことをコンソール上で確認。

と、ここまではできました。
が、フロントエンド・バックエンド共にnpm startで起動させているのですが、ブラウザ上でAPIが呼び出せませんでした。
ただ、ブラウザ上でAPIエラーも発生していなかったので、パブリックサブネット上のEC2からAPIを以下のコマンドで叩いてみたのですが、こちらも以下のエラーが返ってきました。

叩いたコマンド: curl -I "http://【プライベート IPv4 アドレス】/api/post/userId/null エラー: curl: (7) Failed to connect to 【プライベート IPv4 アドレス】 port 80 after 1 ms: Connection refused

上記エラーを検索したところ、awsの以下のサイトに本エラーに関する記述があり、
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-linux-resolve-ssh-connection-errors/
確認したのですが、「ホストはインスタンスに到達したが、SSH ポートでリッスンしているサービスがなかった。」という原因があるのではという記載からバックエンドのnestJSの方がAPIを叩ける状態になっていないのでは?と思いました。

ここで伺いたいのですが、
A)パブリックサブネット内のEC2からプライベートサブネット内のnestJSのソースコードが動いているか確認する手段があれば教えていただきたいです。(現状、コンソール上でnpm startが成功したというステータスしかわからないため)
B)APIコールできない他の理由があるようであれば、こちらもご教授お願いしたいです。

よろしくお願いします。

tokuppee👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lawsoncoffee

2022/06/13 12:48

NATGatewayは、私の理解だと、プライベートサブネットからインターネットに接続するためのものと認識してます。今回は、パブリックサブネットからプライベートサブネットにアクセスすることなので、NATGatewayとは逆方向を実現したいです。
yu_1985

2022/06/13 12:54

それはプライベートサブネットからインターネットへのアクセスに必要なものなので、今回は関係がありません。
guest

回答1

0

ベストアンサー

まず、プライベートサブネット内にブラウザからアクセスできないのは、インターネットに繋がっていないので当然です。
それをしたいならプロキシかなにかを挟む必要があります。
一般的にはAWS上ではELB(大抵はALB)を使用します。

curlでパブリックサブネットのEC2からAPIのプライベートIPにリクエスト送って失敗しているのは、npm startで使っているポートが80番ではないからではないでしょうか。
デフォルトでは3000とかだったかと思いますし、オプションで変えてるならその番号です。

そもそも、アプリのフロントとバックエンドをどういう構成にしようとしているのでしょうか。
クライアントから直接APIにアクセスさせたいなら、構成としてALBがほぼ必須になります。

投稿2022/06/13 12:54

yu_1985

総合スコア7427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lawsoncoffee

2022/06/13 13:49 編集

ご回答ありがとうございます。 >curlでパブリックサブネットのEC2からAPIのプライベートIPにリクエスト送って失敗しているのは、npm startで使っているポートが80番ではないからではないでしょうか。 ポート番号として8000を使用していたので、一時的にセキュリティグループのインバウンドにカスタムTCP/8000を加えて再度試したところ、200が返ってきました。nestJSのソースコードは動いていたようです。 >アプリのフロントとバックエンドをどういう構成にしようとしているのでしょうか。 フロントエンドとバックエンドを分け、フロントエンドからAPIで叩いてデータを取得したかったので、 バックエンド側(API+DB)は、フロントエンドのwebサーバーからだけ通信できれば良いと考えていました。 そのため、バックエンド側(API+DB)をプライベートサブネット内に配置し、プライベートサブネットのセキュリティーグループのインバウンドにて、HTTP(S)にフロントエンド側のセキュリティグループを指定すれば、ブラウザ上であってもアプリのフロントからは、APIを叩けるのではと考えていました(そして、このアプリのフロント以外からは叩けなければセキュリティレベルが高いかなと)。 が、この目論見がそもそも間違っていたようですね。ALBについて調べてみようと思います
yu_1985

2022/06/13 17:08

フロントエンドという言葉の意味を勘違いしていないでしょうか。 そこにあるのはクライアント側で動くプログラムで、フロントのサーバーとは単にクライアントで動くプログラムを置いているだけなのでは。 バックエンドのAPIはクライアントからアクセスできなくてはならず、ネットワーク的な制限をかけてしまうとクライアントからアクセスできなくなり思うように動作はしないはずです。 そこではない方法でセキュリティを担保する必要があります。
lawsoncoffee

2022/06/14 10:54

ありがとうございます。理解できました。 バックエンドのAPIはクライアントからアクセスしつつ、セキュリティ観点はまた、別で考えてみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問