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」に記載されている環境変数を設定する
    • LDLIBRARYPATH
    • 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が実行できるようになった。


Related #aws

Alexaに気温と二酸化炭素濃度を教えてもらう

「Alexa、気温」でセンサー情報を教えてくれるようになった

AWS SAMで作ったLambdaアプリをCircleCIでデプロイする

circleci/aws-serverlessのOrbを使った

s3の署名付きURLが有効期限より前に見れなくなってしまう

IAMロールではなくIAMユーザの権限でURLを生成する必要があった

AWS CDK使用時にリージョンを指定する

new Stackの際にenvで指定できる