AWS Lambda で実行されている Ruby Sinatra が RDS Postgres に接続しない
概要
AWS Lambda と RDS の Postgres DB を使用して Ruby Sinatra アプリを実行しようとしています。
アプリはローカル開発環境から RDS データベースに接続できますが、アプリが AWS Lambda で実行されており、RDS データベースにアクセスしようとすると、次のエラー メッセージが表示されます。
ActiveRecord::ConnectionNotEstablished - connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
Is the server running locally and accepting connections on that socket?
:
/var/task/vendor/bundle/ruby/3.2.0/gems/activerecord-7.1.1/lib/active_record/connection_adapters/postgresql_adapter.rb:80:in `rescue in new_client'
どこを見ればよいでしょうか?これは、pg gem が適切にパックされていないことに問題があるのでしょうか?それとも、Lambda 関数と RDS データベースの両方がインターネットからアクセスできる場合でも VPC ですか?
ありがとう!
編集: データベース.yml
default: &default
adapter: postgresql
pool: 5
timeout: 5000
test:
<<: *default
database: test
development:
<<: *default
host: <%= ENV['DATABASE_HOST'] %>
database: <%= ENV['DATABASE_NAME'] %>
username: <%= ENV['DATABASE_USER'] %>
password: <%= ENV['DATABASE_PASSWORD'] %>
解決策
問題は、プログラムが AWS Lambda 関数から実行されるときに、database.yml ファイルの erb セクションが解決されないことでした。
config.ru ファイルに次の行を追加すると解決しました。
set :database, YAML.safe_load(ERB.new(File.read('./config/database.yml')).result(binding), aliases: true)