結論
こうすればいい
cd ~
# グローバルパッケージのインストール先確認
npm root -g
# グローバルインストール
npm install -g aws-sdk
# グローバルパッケージが本当にインストールされたかを確認する
npm list -g --depth=0
# ローカルパッケージとして読み込みたいプロジェクトディレクトリに移動する
cd ~/environment/myLambdaProjectName
# グローバルパッケージとローカルパッケージのシンボリックリンクを作成する
npm link aws-sdk
# ローカルパッケージとして読み込まれているかを確認する
npm list --depth=0
あとはこれをZIPファイルにまとめてデプロイするなり、なんなりと
何がしたいか
私が開発したあるプロジェクトは、DynamoDBからレコードを取り出して、
RdsDBにINSERTするという行為をLambda関数で実現するというものでした。
本番環境のLambdaは最初からAWS-SDKパッケージが用意されているので、
ローカルパッケージとしてZIPファイルに含める必要はありません。ファイルサイズが増えるだけです。
しかし、ローカル環境(Cloud9)にAWS-SDKパッケージがないので、
今までは npm install aws-sdk
して毎回AWS-SDKをローカルインストールして、
本番デプロイ前に手動でaws-sdkディレクトリを削除するという何ともアレな運用をしていました。
何か、ローカル環境だけAWS-SDKを読み込ませて、
本番デプロイ時は手動削除しないで良い方法を探したら、上の方法を見つけた次第です。
他に良い方法をご存じの方がいましたら、教えてください。
追記
Cloud9環境で、ローカルからLambdaにデプロイする場合は、次の手順で行います
cd ~/environment/myLambdaProjectName
zip --symlinks -r hoge.zip .
左サイドバー > AWS > AWS: Explorer > Asia Pacific (Tokyo) > Lambda > {myFunctionName}
アップロードしたいLambda関数名を右クリック、Upload Lambda > ZIP Archiveを選択、
先ほどZIP圧縮したファイルを選択して、OKボタンを押すと、デプロイできます
うまくいけば、画面右上にちっさく Successfully uploaded Lambda function {myFunctionName}
が表示されます
本当にAWS-SDKが除外されてアップロードされているかは、以下の手順で確認できます
- Lambdaコンソール画面に移動
-
Lambda > 関数 > {myFunctionName} に移動
-
画面右上、アクション > 関数のエクスポート > デプロイパッケージのダウンロード
-
ダウンロードしたZIPファイルを開き、node_modulesディレクトリ内にaws-sdkディレクトリがないことを確認する
Upload Lambda > Directory を使うことでもデプロイはできますが、
そちらはシンボリックリンクを辿って、
実ファイルを含んだ状態でアップロードしてしまうので、
ファイルサイズを抑えることができません。