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');
で使うことができます。
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 の場合の差分のみ記載します。
最新の 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を使うと、関数の容量を抑えらる・他の関数でも使い回せる と言ったメリットがある!