Heroku Postgres へ AWS Lambda からアクセスする
こんにちは、@kimihomです。
こちらは Heroku Advent Calendar 2015 の12日目の記事となっております。
弊社は5分でブラウザ電話コールセンターを構築できるCallConnectを Heroku と Ruby on Rails で構築しています。そして AWS Lambda と Heroku Postgres をつないで連携しているので、そのTipsをご紹介します。
AWS Lambda とは
Herokuの記事なのであまり深くは説明しませんが、AWS Lambda はあらゆるイベントをトリガにしてお好きなコードを実行できるサービスです。
この"あらゆるイベント"というのがポイントで、例えば画像やJSONをS3にアップロードしたタイミングでメールを送ったり、画像処理をしたりといった処理を AWS Lambda へ渡すことができます。これにより頻度の多くないバックグラウンドジョブを AWS Lambda に任せることができるようになります。
Heroku Postgres を外部からアクセスする
Heorku Postgres は外部から簡単にアクセスできます。最も簡単な方法は、Heroku Toolbeltを利用してコマンドを叩くやり方です。
> heroku pg:credentials DATABASE -a my-awesome-app
postgres://user:pass@ec2.compute-1.amazonaws.com:5432/aaaaaa
この接続URLの末尾に?ssl=true
を付ければ接続ができるようになります。実際にnpmモジュールのpgを利用してアクセスします。
var pg = require('pg');
var async = require('async');
var aws = require('aws-sdk');
exports.handler = function(event, context) {
var conString = "postgres://user:pass@ec2.compute-1.amazonaws.com:5432/aaaaaa?ssl=true";
pg.connect(conString, function(err, client, done) {
async.waterfall([
function startTransaction(callback) {
console.log("Step4: Begin Transaction.");
client.query('BEGIN', callback);
},
function insertToContacts(callback) {
client.query("INSERT INTO ....", callback);
},
], function(err, result) {
client.query("COMMIT", done);
console.log("Transaction finished.");
if(err) console.log(err);
context.done();
});
});
};
ここで INSERT に渡すデータは、もちろん外部APIを呼んで取ってきてもいいですし、S3に保存したデータを入れるといったこともできます。
Heroku のデータ容量に気をつける
ここで調子に乗ってたくさんデータを入れてしまうと、プラン容量をオーバーしてしまう時がきます。こまめに
> heroku pg:info -a my-awesome-app
=== HEROKU_POSTGRESQL_CHARCOAL_URL, DATABASE_URL
Plan: Hobby-dev
Status: Available
Connections: 3/20
PG Version: 9.4.4
Created: 2015-04-24 02:53 UTC
Data Size: 10.8 MB
Tables: 19
Rows: 4739/10000 (In compliance)
Fork/Follow: Unsupported
Rollback: Unsupported
Add-on: live-surely-5553
を見て確認するようにします。限界が近づいたら一応 Heroku からもメールが来るようです。
その他 Heroku Postgres TIPS
せっかくのアドベントカレンダーなので Heroku Postgres に関してのTIPS。
Heroku Postgres にあるデータを他のHeroku Postgresに移す
> pg_dump --no-acl --no-owner -h [host ip].compute-1.amazonaws.com -U [user name] -t [table name] --data-only [database name] > table.dump
> echo "truncate [table];" | heroku pg:psql [DATABASE] -app YOUR_APP
> heroku pg:psql --app YOURAPP DATABASE < table.dump
毎晩2時にバックアップをスケジューリング
heroku pg:backups schedule --at '02:00 Asia/Tokyo' DATABASE_URL
所感
自分でデータベースを管理する必要がなくなるので、Heroku Postgres は重宝しております。
Heroku Postgres の本も出版されているので、もし興味があれば一読されることをお勧めします。