やりたいこと
以下の構成でブラウザ上のreactからALBを経由してrails-apiにリクエストをお送りたいと思っています。
フロントエンド:react
バックエンド:rails
インフラ:AWS下記図
Route53を用いて独自ドメインを使用し、ALBを用いて、ブラウザからALBまでの通信はSSL化しています。
EC2にdockerをインストールして、docker-composeでreact、rails、nginxを起動しています。
※こちらの質問の中で、アドバイスを頂きつつ試行錯誤した際に発生した新しい別の問題?なので、こちらに新規に質問させていただきます。
https://teratail.com/questions/336342
問題
ALBのヘルスチェックで403で弾かれてしまいます。ヘルスチェックでは3001ポートの/gymsにアクセスして200のステータスが返ってくるかを確認しています。
![
EC2のdockerのnginxのログにも以下のように403が出ています。
しかし、ブラウザからポート3001の/gymsにアクセスすると以下のように正常に表示されます。
また、ポート80へのヘルスチェックは問題なく通過しています。
なぜALBのヘルスチェックでポート3001のときのみ403で弾かれてしまうのか、知見がある方いらっしゃいましたら、アドバイスいただけないでしょうか?
どうぞよろしくお願いいたします。
以下に参考ファイルを記載します。
docker-compose.yml
version: "3" services: app: build: context: ./api/ dockerfile: Dockerfile env_file: - ./api/environments/db.env command: bundle exec puma -C config/puma.rb -e production volumes: - ./api:/webapp - public-data:/webapp/public - tmp-data:/webapp/tmp - log-data:/webapp/log web: build: context: ./api/containers/nginx dockerfile: Dockerfile volumes: - public-data:/webapp/public - tmp-data:/webapp/tmp ports: - 3001:80 depends_on: - app front: build: context: ./front/ dockerfile: Dockerfile volumes: - ./front:/usr/src/app command: sh -c "cd react_front && npm start " ports: - "80:3000" volumes: public-data: tmp-data: log-data: db-data:
application.rb
require_relative 'boot' require 'rails' # Pick the frameworks you want: require 'active_model/railtie' require 'active_job/railtie' require 'active_record/railtie' require 'active_storage/engine' require 'action_controller/railtie' require 'action_mailer/railtie' require 'action_mailbox/engine' require 'action_text/engine' require 'action_view/railtie' require 'action_cable/engine' # require "sprockets/railtie" require 'rails/test_unit/railtie' # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. Bundler.require(*Rails.groups) module Myapp class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 6.1 # Configuration for the application, engines, and railties goes here. # # These settings can be overridden in specific environments using the files # in config/environments, which are processed later. # # config.time_zone = "Central Time (US & Canada)" # config.eager_load_paths << Rails.root.join("extras") # Only loads a smaller set of middleware suitable for API only apps. # Middleware like session, flash, cookies can be added back manually. # Skip views, helpers and assets when generating a new resource. config.api_only = true config.middleware.insert_before 0, Rack::Cors do allow do origins 'http://localhost', 'https://独自ドメイン' resource '*', headers: :any, methods: %i[get post patch delete options], credentials: true end end config.hosts << '.example.com' config.hosts << '独自ドメイン' config.hosts << 'localhost' # セッションメソッドを有効にする config.middleware.use ActionDispatch::Cookies config.middleware.use ActionDispatch::Session::CookieStore config.middleware.use ActionDispatch::ContentSecurityPolicy::Middleware config.time_zone = 'Tokyo' config.active_record.default_timezone = :local config.action_dispatch.default_headers = { 'Access-Control-Allow-Credentials' => 'true', 'Access-Control-Allow-Origin' => if Rails.env.production? 'https://独自ドメイン' else 'http://localhost' end, 'Access-Control-Request-Method' => '*' } end end
nginx.conf
# Nginxが受け取ったリクエストをバックエンドのpumaに送信 upstream webapp { # ソケット通信したいのでpuma.sockを指定 server unix:///webapp/tmp/sockets/puma.sock; } server { listen 80; # ドメインもしくはIPを指定 server_name 独自ドメイン; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; # ドキュメントルートの指定 root /webapp/public; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; try_files $uri/index.html $uri @webapp; keepalive_timeout 5; # リバースプロキシ関連の設定 location @webapp { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://webapp; } } コード
追加1
vscode からcurlでヘルスチェックをしているのと同じurlにgetリクエストを送ると、以下のように正常にレスポンスがありました。
このことから、ALBのヘルスチェックの設定の仕方に原因があるのかなと思い、この点を重点的に調査中です。
curl -I でヘッダー情報を取得したもの
あなたの回答
tips
プレビュー