boto3でEC2のインスタンスを起動/再起動する

boto3のインストール

pipでboto3をインストールします。

pip install boto3

認証周りの準備

~/.aws/credentialsに以下のようにアクセスキー、シークレットアクセスキーをセットします。今回はdefaultのプロファイルを使用して認証します。

[custom]
aws_access_key_id =  xxx
aws_secret_access_key = xxx

次に~/.aws/configにregionをセットします。

[default]
region=ap-northeast-1

プログラムを作成

EC2のインスタンスIDを引数にとって起動・停止させるプログラムを作成します。

import boto3
def start(ami):
    try:
        print('ec2 > start')
        ec2 = boto3.resource('ec2')
        instance = ec2.Instance(ami)
        instance.start()
    except Exception as err:
        print(err)


def stop(ami):
    try:
        print('ec2 > stop')
        ec2 = boto3.resource('ec2')
        instance = ec2.Instance(ami)
        instance.stop()
    except Exception as err:
        print(err)

node.jsで定期的にスクリプトを実行するにはpm2が便利

定期的にスクリプトを実行するには定期的にタスクを実行させるnode-cronとプロセス管理ツールのpm2でスクリプトをデーモン化することによって実現できます。

例えば、毎日午前6時にgood morningを表示するだけのcron.jsを作成してみます。

インストール

まずはpm2とnode-cronをインストールします。

npm install pm2 -g 
npm install node-cron 

cron.jsを作成

定期的に実行するcron.jsを作成します。cronの詳しい表記はこのリンクが参考になります。

let cron = require('node-cron');
cron.schedule('0 0 6 * * *', () => {
  //定期的に実行する
  console.log('good morning');
});

scheduleの第一引数でスクリプトが実行される時刻を指定しています。左から秒、分、時、日、月、曜日となっています。アスタリスクは任意の時間を表しています。
第二引数のコールバックに処理内容を記述します。

pm2を使ってデーモン化

プロセスをデーモン化するのはとっても簡単です。

pm2 start cron.js

でデーモン化できます。また、プロセスを停止させるには

pm2 stop cron.js

を実行します。
logを表示させたい場合は

pm2 logs cron

を実行します。

[Postgresql] ローカルマシンから外部サーバー(Ubuntu)のDBに接続する

外部のIPアドレスからDBにアクセスできるようにするため、PostgreSQLサーバーの環境設定ファイルとなっている 外部サーバーのetc/postgresql/9.3/main/postgresql.confのlisten_address= …の箇所を

listen_addresses = '*'
に書き換えます。

次にPostgreSQL サーバーへの接続制限、認証方法に関する設定を行うための設定ファイルである、 /etc/postgresql/9.3/main/pg_hba.confに下記を追加します。

host all all ローカルマシンのIPアドレス/24 trust
自分のIPアドレスはwhat is my ipでGoogle検索をすると取得できます。

ちなみにすべてのホストからの外部DBへのアクセスを許可する場合は

host    all         all         0.0.0.0/0 md5
とします。

coを使って非同期処理を綺麗に書く

coを使うとJavaScriptの非同期処理を同期的に書くことができてかなり読みやすいコードが書けるようになります。

例えば、非同期にファイルの中身を取得するプログラムでもかなりすっきりとした感じになります。

'use strict';
let co = require('co');
let fs = require('fs');

let readFile = (path) => {
	return new Promise((resolve,reject) => {
		fs.readFile(path,(err,data) => {
			if (err) return reject(err);
			let jsonData = JSON.parse(data);
			return resolve(jsonData);
		})
	})
};


co(function *(){
	//success
	let read = readFile('./data.json');
	let data = yield read;
	//dataにdata.jsonの中身が入っている
	console.log(data)

}).catch((err) => {
	//error
	console.log(err);

});