15
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

HerokuAdvent Calendar 2015

Day 12

Heroku Postgres へ AWS Lambda からアクセスする

Posted at

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 の本も出版されているので、もし興味があれば一読されることをお勧めします。

15
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?