Edited at

AWS LambdaでPHPを動かしてRDS(MySQL)へ接続する

More than 3 years have passed since last update.

以前は、LambdaからRDSへ接続するには、RDSをパブリックアクセス可能に設定し、LambdaのIPアドレスを通すようなセキュリティグループの設定も必要でした。

しかし、LambdaからVPCアクセスが可能となった今、スマートかつセキュアに接続をすることができます。


LAMP環境を作る

AWS LambdaのVPC対応によって、LAMP環境の構築が容易になりました。

LAMP環境とは、LAmbda, MySQL, PHP で構成されるアプリケーションの実行環境のことです。

(Python?知らない子ですね)


AWS Lambdaで動かすPHP

AWS LambdaにはPHPが入っていません。

なので、PHPを動かすためには、Node.jsなどのAWS Lambdaでサポートされている言語経由で、自分で用意したPHPの実行ファイルを起動する必要があります。

AWS LambdaでPHPを動かす方法については、こちらにまとめてあります。

以下のPHPのスクリプトなどは、こちらの記事の「PHP CLIを動かした話」で紹介しているものを、一部修正したものです。


用意したPHP実行ファイル

MySQLにアクセスするので、そのためのオプションを忘れないようにします。

git clone git@github.com:php/php-src.git

cd php-src
git checkout -b php-7.0.3 php-7.0.3
./buildconf --force
./configure \
--prefix=/var/task/php \
--disable-all \
--with-openssl \
--enable-pdo \
--with-mysqli \
--with-pdo-mysql \
--with-mysql
make


スクリプト


script.sh

#!/bin/sh

export LD_LIBRARY_PATH=`pwd`'/lib:'$LD_LIBRARY_PATH
./php/php app.php



app.php

<?php

$schema = 'test';
$dbhost = 'test.*********.ap-northeast-1.rds.amazonaws.com';
$dbport = 3306;
$charset = 'utf8';
$dbuser = 'test';
$dbpass = 'test';
$dsn = "mysql:dbname={$schema};host={$dbhost};port={$dbport};charset={$charset}";
$pdo = new \PDO($dsn, $dbuser, $dbpass);

$statement = $pdo->query('SELECT id,name FROM gloriana;');

while ($data = $statement->fetch(\PDO::FETCH_ASSOC)) {
echo "{$data['id']}, {$data['name']}\n";
}



RDS

Aurora, MySQL, MariaDBのいずれかのRDSインスタンスを立てておきます。

テスト用に、下記のテーブル、データを用意しました。


ddl-dml.sql

CREATE TABLE `gloriana` (

`id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` varchar(10) NOT NULL
) ENGINE='InnoDB';

INSERT INTO gloriana (name) values
('ダージリン'),
('アッサム'),
('オレンジペコ'),
('ローズヒップ');



AWS Lambda


設定

上記で作成したPHP本体やスクリプトをまとめたファイルをS3経由でLambdaファンクションにコードとしてアップロード。

下記のように設定します。

Screen Shot 2016-02-21 at 3.59.59 PM.png


実行結果

Screen Shot 2016-02-21 at 2.57.55 PM.png


参考

(祝)AWS LambdaのVPC利用が可能になりました

AWS LambdaのVPCアクセスに関して少しだけ解説

AWS LambdaでPHPなどを動かした話