以前は、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
スクリプト
#!/bin/sh
export LD_LIBRARY_PATH=`pwd`'/lib:'$LD_LIBRARY_PATH
./php/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インスタンスを立てておきます。
テスト用に、下記のテーブル、データを用意しました。
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ファンクションにコードとしてアップロード。
下記のように設定します。
実行結果
参考
(祝)AWS LambdaのVPC利用が可能になりました
AWS LambdaのVPCアクセスに関して少しだけ解説
AWS LambdaでPHPなどを動かした話