Techioz Blog

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)