2017-12-18 190 views
0

我试图将我的应用程序移动到Heroku,但是我通过PHP访问数据库时遇到问题。我能够从本地机器访问AWS数据库,但是当我部署到Heroku时,它会失败。无法在Heroku上访问AWS RDS MySQL + PHP

我已经按照从主页面方向:https://devcenter.heroku.com/articles/amazon-rds

而且我试过SO/AWS的其他线程:

Getting Mysql2::Error (SSL connection error: ASN: bad other signature confirmation) on Heroku App with AWS RDS

http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_MySQL.html#MySQL.Concepts.SSLSupport

我也看到了这里的说明: https://devcenter.heroku.com/articles/getting-started-with-php#provision-a-database

但我试图移植现有的应用程序,所以我需要坚持我现有的PDO语法。我试图得到这个工作:

$dbInfo = getenv('DATABASE_URL'); 
try{ 
    $dbh = new PDO($dbInfo); 
    echo json_encode(array('outcome' => true)); 
} 
catch(PDOException $ex){ 
    echo json_encode(array('outcome' => false, 'message' => 'Unable to connect')); 
} 

我的环境变量设置正确,可以运行parse_url访问所有的数组项的;我也有位于config文件夹中的amazon-rds-ca-cert.pem。

我能够(通过SequelPro)远程登录,并运行在查询管理下,试图迫使SSL证书:

GRANT USAGE ON *.* TO 'username'@'%' REQUIRE SSL; 

但是,当我故意拼错了证书名称我的本地数据库可以仍然连接,这让我想也许我错过了一些需求。

回答

0

想通了;需要在PDO连接中手动指定SSL证书。在PDO语法中也有小错误。

try{ 
    $dbh = new PDO("mysql:host=$pdohost;dbname=$pdodb", $pdouser, $pdopass, array(
    PDO::MYSQL_ATTR_SSL_CA =>'path/to/combined-cert.pem' 
)); 
    echo json_encode(array('outcome' => true)); 
} 
catch(PDOException $ex){ 
    echo $ex; 
    echo json_encode(array('outcome' => false, 'message' => 'Unable to connect')); 
} 

还需要确定更新AWS入站规则0.0.0.0/0允许Heroku的访问。