Lambda から最新の AWS SDK を使って Aurora のデータベースクラスタの停止、開始を実行できるようにする

Lambda から Aurora のデータベースクラスタを止めるためにRDS.stopDBCluster を呼んだのですが stopDBCluster is not defined になったので Lambda Layers を使って解決してみました。

Amazon Aurora がデータベースクラスタの停止、開始へのサポートを開始

Lambda の実行環境調査

Lambda の実行環境(ランタイム: Node.js 8.10)では AWS SDK for JavaScript – 2.290.0 がデフォルトで含まれており
2.290.0までに対応している API であれば何も考えずに const AWS = require('aws-sdk'); で使うことができます。

docs.aws.amazon.com

2.290.0 は 2018/08/10 にリリースされたバージョンなので、それ以降にリリースされた API に関しては何かしら対策が必要となります。

Release Release v2.290.0 · aws/aws-sdk-js · GitHub

今回欲しいのは、RDS の start/stop DBCluster が入っているバージョンで
CHANGELOG から探してみると2.319.0で入っており、やはりそのままでは使えません。

aws-sdk-js/CHANGELOG.md at master · aws/aws-sdk-js · GitHub

feature: RDS: This launch enables RDS start-db-cluster and stop-db-cluster. Stopping and starting Amazon Aurora clusters helps you manage costs for development and test environments.

Lambda Layers で解決する

今までだと関数のコードと一緒に zip にしてアップしていたのですが、関数の容量が大きくなってしまうため
Re:invent 2018 で発表された Lambda Layers を使ってみます。

詳細な手順は以下の記事にわかりやすく書かれていますが、Python の例なので Node.js の場合の差分のみ記載します。

qiita.com

最新の AWS SDK の場合は以下のコマンドを実行して、できあがった zip をアップロードします。

$ mkdir nodejs && cd nodejs
$ yarn add aws-sdk
$ cd ../
$ zip aws-sdk-nodejs-latest.zip -r nodejs

Layers の作成が完了したら、aws-sdkをインポートすることで実行できるようになります。
※ Layers に aws-sdk が存在する場合は、実行環境のデフォルトのものより優先されてインポートされるようです。

RDS.stopDBClusterが使えるようになった参考コードは以下です。

const AWS = require('aws-sdk');

exports.handler = (e, ctx) => {
    const rds = new AWS.RDS();
    const params = {
        DBClusterIdentifier: CLUSTER_NAME
    };
    rds.stopDBCluster(params, (err, data) => {
        if (err) console.log(err);
        ctx.succeed();
    });
}

まとめ

  • Lambda で AWS SDK for JavaScript – 2.290.0 以降のバージョンを使いたい場合は対策が必要。
  • Lambda Layersを使うと、関数の容量を抑えらる・他の関数でも使い回せる と言ったメリットがある!

参考

docs.aws.amazon.com

dev.classmethod.jp