jyoten
@jyoten (jyoten to)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

フロントエンドとバックエンドの通信がうまくいかない

フロントエンドとバックエンドの通信がうまくいきません。
例えば新規ユーザーを作成する場合

開発者ツールのコンソールに

POST http://ec2 private ip:8000/api/signup net::ERR_CONNECTION_TIMED_OUT

というようにタイムアウトが表示されます。

直接バックエンド側に入って

curl -X POST http://ec2 private ip:8000/api/admin_login -H "Content-Type: application/json" -d "selected_user:selected_user,email:email,password:password"

このようにカールコマンドで直接apiに命令をしたらapiはうまく機能してくれます。
となるとやはり原因はフロント側にあると思います。

構成はalb→フロントエンド→バックエンド→dbです

セキュリティグループは
alb in:80 out すべて
web in:22,80 out:すべて
app in:22,8000 out すべて
db: in3306 out:すべて
こちらは問題ないと思います。

igwとngwはちゃんと設定しています。

webとappの間は8000番で通信しているので
appの方には8000番を開放しています。
もしセキュリティグループに問題があればご指摘いただけますでしょうか。

フロント側のコード:

const response = await this.$axios.post('http://ec2 privateip:8000/api/signup',{selected_user: this.selected_user,
 email:this.user.email,      
 password:this.user.password
});
if (response.status === 200){
console.log(response.data.message);
this.user.email = '';
this.user.password = '';
}
else{
console.error("Unexpected status code", response.status);
}

バック側のコード:

@app.route('/api/signup', methods=['POST'])
@jwt_required()
@cross_origin()
def signup():
  data = request.json
  selected_user=data.get('selected_user')
  if selected_user:        
    selected_user = str(selected_user)
    hashed_password = generate_password_hash(data['password'], method='sha256')
   
    if selected_user == "User":
      user = User(email=data['email'], password=hashed_password)
    if selected_user == "AdminUser":
      user = AdminUser(email=data['email'], password=hashed_password)
    db.session.add(user)
    db.session.commit()
    return jsonify({'message':'New user created'})

設定は以上になります。

インフラはec2です。
ec2にdockerを入れてアプリを稼働しています。
どこに問題があるでしょうか。
タイムアウトになる理由を知りたいです。

0

3Answer

以下の構成だと仮定してお話します
・WebもAPPも別EC2インスタンス
・APPサーバーとWebサーバーを立ててブラウザからAPIを叩くRESTful API構成

その上でWebページから叩いているAPIエンドポイントですがPrivateIPを指定していますか?
その場合PrivateIPは同じVPC内のみ疎通が可能なものであるため、パブリックIPアドレスまたはパブリックDNSを指定して見てください。
もしWeb3層構造のようなAPPサーバーをWebサーバーからのリクエストのみに閉じ込めたい場合は、フロントエンドのリクエストをサーバーサイドレンダリングのみリクエストを行うような条件分岐またはライフサイクルフックを指定してください(Nuxt/Next.jsを想定してます)

1Like

Your answer might help someone💌