前提
現在AWSを使用してバックエンド側とフロントエンド側に分けて開発したポートフォリオをデプロイしようとしています。デプロイはこちらの記事を参考にしました
。作業自体は終わってフロントエンド側の表示も上手く表示されているのですが、rails側のコンテナとaxiosを利用した通信を行うことができません。
参考にしたサイトの通りに作ったのでこのような構造になっています。EC2(webサーバ)の部分でdocker-compose upをしています。
(注意事項)*Railsを本番環境で起動すると500エラーが出てしまうため、今回はdevelopment開発でデプロイする方針を取っています。(デバッグの時間がないため)
発生している問題・エラーメッセージ(ドメインは伏せさせていただきます。)
j
1xhr.js:220 GET https://(ドメイン):3001/api/v1/auth/sessions net::ERR_CONNECTION_REFUSED
Reactのaxios通信をする部分の一部
tsx
1export const FetchUser = (userId: any) => { 2 return axios.get(`https://(ドメイン):3001/api/v1/users/${userId}`) 3 .then(res => { 4 return res.data 5 }) 6 .catch((e) => console.error(e)) 7}
docker-compose.yml
yml
1version: "3" 2 3services: 4 # db: 5 # image: mysql:8.0 6 # environment: 7 # MYSQL_ROOT_PASSWORD: password 8 # command: --default-authentication-plugin=mysql_native_password 9 # volumes: 10 # - mysql-data:/var/lib/mysql 11 # - /tmp/dockerdir:/etc/mysql/conf.d/ 12 # ports: 13 # - "3306:3306" 14 # cap_add: 15 # - SYS_NICE 16 api: 17 build: 18 context: ./backend/ 19 dockerfile: Dockerfile 20 # command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000" 21 command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" 22 volumes: 23 - ./backend:/myapp 24 - ./backend/vendor/bundle:/myapp/vendor/bundle 25 environment: 26 TZ: Asia/Tokyo 27 RAILS_ENV: development 28 ports: 29 - "3001:3000" 30 # depends_on: 31 # - db 32 stdin_open: true 33 tty: true 34 env_file: 35 - .env 36 front: 37 build: 38 context: ./frontend/ 39 dockerfile: Dockerfile 40 volumes: 41 - ./frontend/app:/usr/src/app 42 command: sh -c "yarn && yarn start" 43 ports: 44 - "80:3000" 45 # - "4000:3000" 46 environment: 47 - WDS_SOCKET_PORT=0 48# volumes: 49# # mysql-data: 50
試したことや考察など
1 踏み台サーバからアクセスできるか
踏み台サーバから接続確認をしてみました
j
1[ec2-user@ip-(伏せさせていただきます。) ~]$ curl (伏せさせていただきます。):3001/api/v1/users 2[]
これは登録しているuserを全て返すというindexアクションです。そのため、[]が返って来るのは正常な動作です。ですが、なぜか実際のURLから試すとエラーが発生してしまいます。
2 セキュリティーグループの設定に3001を設定
設定したものの、エラーは変わらず。
3 同一ec2(webサーバ)に向けてaxiosを設定
もしかすると、そのアプリケーションが動いているec2のIPアドレスでないと反応しないのではないかと考えて、axiosの通信先を以下のように設定してみました
j
1baseURL: "https://(伏せさせていただきます。):3001/api/v1
ですが、同じようにエラーになってしまいます。
ロードバランサーのパブリックIPアドレス EC2(踏み台サーバ)のIPアドレスからアクセスできるか
1 EC2のグローバルIP(踏み台サーバのもの):3001
*EC2のwebサーバはプライベートIPアドレスしか持っていないのでチェックしませんでした。
こちらを検索バーに入れて検索してみましたが、
j
1このサイトにアクセスできません (一応伏せさせていただきます。)で接続が拒否されました。
となってしまいました。
2 ロードバランサーのグローバルIP:3001
j
1このサイトにアクセスできません(同上)で接続が拒否されました。 2
*一応フロントエンド側にはアクセスできました
このようにどちらもアクセスできませんでした。
考察など
・1のように踏み台サーバにssh接続してアクセスは可能だが、検索バーに「EC2のグローバルIP(踏み台サーバのもの):3001」このような形で入力して検索するとアクセスできないのはなぜか分からない
・もしかすると、何かAWS側での設定ミスがあるかもしれません(しかし、コンテナは両者正常に起動しているし、フロントエンド側にはドメインからアクセス可能)
・まず、そもそもこの構成でaxiosによるコンテナ間の通信は可能なのか
・参考にしたサイトではAPIを叩いていなかったので分かりませんが、APIとReactの通信もルーターに設定しないといけないのでしょうか?
・出せる情報が少なくてすみません。不備があれば追記いたします。なにかしらアドバイスがあればよろしくお願いいたします。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/30 10:21
2022/08/30 10:24
2022/08/30 11:27
2022/08/30 12:12
2022/08/30 12:22
2022/08/30 12:38