まえがき
気がつくと Lightsail インスタンスがポコポコと立っており本番稼働しているといったことが人生にはしばしば起こりえます。
ちゃんとステートレスなサーバになっていれば良いのですが、得てして「Lightsail で安くシュッと Wordpress を動かしたい!」「ヨッシャ動いたから本番稼働させちゃおう!」といった勢いで Web サーバから DB までまるっと1インスタンスに詰め込まれがちです。
本来であれば Lightsail Database などを適切に用いて DB を分離すべきですが、Lightsail のスナップショットを定期的に取得しておくことで暫定対策とすることもしばしばあります。
しかし、残念ながら Lightsail には手動スナップショット機能はあっても定期的に自動でスナップショットを取得する機能は存在していません。Lightsail Database がリリースされた今では、実装される見込みも薄いように思えます。
ですのでさっくり Lambda で全インスタンスの日次バックアップの実装してしまいましょう。
コード
import * as AWS from "aws-sdk";
import { CloudWatchLogsEvent, Context, Handler } from "aws-lambda";
import { PromiseResult } from "aws-sdk/lib/request";
const AP_NORTHEAST_1: "ap-northeast-1" = "ap-northeast-1";
AWS.config.update({ region: AP_NORTHEAST_1 });
const lightsail = new AWS.Lightsail({ apiVersion: "2016-11-28" });
const createAllBackup = (instances: AWS.Lightsail.Types.Instance[] = []) => {
return instances.map(instance => {
const instanceName: AWS.Lightsail.Types.ResourceName | undefined = instance.name;
const currentTime: Date = new Date();
const params = {
instanceName: `${instanceName}`,
instanceSnapshotName: `${instanceName}-${currentTime.getTime()}`
};
console.log(`create backup for ${instanceName}...`);
return lightsail.createInstanceSnapshot(params).promise();
});
};
const getAllInstances = (): Promise<PromiseResult<AWS.Lightsail.Types.GetInstancesResult, AWS.AWSError>> => {
return lightsail.getInstances({}).promise();
};
export const handler: Handler = async (event: CloudWatchLogsEvent, context: Context) => {
try {
const instancesResults: AWS.Lightsail.Types.GetInstancesResult = await getAllInstances();
const result = await Promise.all(createAllBackup(instancesResults.instances));
console.log("DONE");
return "backup complete";
} catch (err) {
throw new Error(err);
}
};
これを CloudWatch Events Schedule から毎日叩くようにすればいいですね、かんたん!