Nodejs12のLambdaでawscliを使う

Lambdaでs3のファイルを操作する場合に、aws-sdk-jsを使うと1度のAPIリクエストで最大1000件までといった制限があるため複数ファイルのコピーや削除を行いたい場合に実装が複雑になってしまう。

awscli s3 syncを使えばコマンド一発でファイルの同期が出来るのでawscliが使いたい。

ということでNode.js 12.xのLambdaでawscliを使う方法を調べた。

awsのサンプルリポジトリにまさにこれというのがあったのでこちらを利用。

aws-samples/aws-lambda-layer-awscli

  • Deploy from SAR console」からデプロイしたいリージョンを選択して各自のaws環境にデプロイする
  • Nodejs12で新規のLambda関数を作成する
  • レイヤーの追加で、デプロイしたawscliのarnを追加
  • Lambda関数に「Node10 and Node12 AWS Lambda runtime support」に記載されている環境変数を設定する
    • LD_LIBRARY_PATH
    • PYTHONHOME
    • PYTHONPATH
  • Lambda関数のタイムアウトを10秒、メモリを512MBに変更する(これは用途に応じて要調整)

この状態で↓のコードをデプロイして試すと、

const shell = require('child_process').execSync

exports.handler = () => {
    const version = shell('/opt/awscli/aws --version')
    console.log(version)
}

正しくaws --versionの実行結果が返ってくる。

aws-cli/1.18.142 Python/2.7.16 Linux/4.14.193-110.317.amzn2.x86_64 exec-env/AWS_Lambda_nodejs12.x botocore/1.18.1

サンプルリポジトリのおかげで手軽にLambdaからawscliが実行できるようになった。