カテゴリー
【Serveless Framework V3対応】serverless.ymlのpackageを利用してzipにまとめるファイルを選択する方法
※ 当ページには【広告/PR】を含む場合があります。
2020/04/21
2023/03/13

ビルドからデプロイまでAWSへ自動一括処理してくれるのが便利な反面、全てをお任せで自動化させて、うっかりするとデプロイ後のS3のバケットに見せたく無いファイルまでアップロードされてしまう恐れがあります。
今回は勝手にまとめて欲しくないファイルを
serverless.yml
exclude
SLS Ver.1(アーカイブ用)でまとめる
本内容の動作確認時(2021年6月)で、最新のSLSのバージョンが
2.47.0
現行のSLS V.2と、この節の内容であるSLS V.1系のyamlファイルの記述作法が異なるので、SLS V.2対応の話は次節にお進みください。
【SLS Ver.1(アーカイブ用)】excludeオプションなしのserverless.ymlを使用した場合
一例としてAngularプロジェクト(手元の環境ではcli@11.0.0以降で動作確認)でプロジェクトをAWSサービスにデプロイする際に、excludeを適切に処理しない場合、以下のように困った具材までzipされてアップロードされてしまいます。
$ tree
.
├── Dockerfile
├── README.md
├── angular.json
├── dist
│ ├── browser
│ │ ├── 3rdpartylicenses.txt
│ │ ├── hogehoge.woff
│ │ ├── hogehoge.ttf
│ │ ├── hogehoge.woff2
│ │ ├── assets
│ │ │ └── personal_logo.svg
│ │ ├── es2015-polyfills.js
│ │ ├── favicon.ico
│ │ ├── index.html
│ │ ├── main.js
│ │ ├── polyfills.js
│ │ ├── robots.txt
│ │ ├── runtime.js
│ │ ├── sitemap.xml
│ │ └── styles.css
│ ├── prerender.js
│ ├── server
│ │ ├── main.js
│ │ └── main.js.map
│ ├── server.js
│ └── static
│ ├── 3rdpartylicenses.txt
│ └── hogehoge.woff
├── docker-compose.yml
├── lambda.js
├── local.js
├── ng-toolkit.json
├── node_modules
│ ├── aws-serverless-express
│ ├── binary-case
│ ├── media-typer
│ ├── mime-db
│ ├── mime-types
│ └── type-is
├── package.json
├── prerender.ts
├── server.ts
├── serverless.yml
├── static.js
├── static.paths.ts
├── tsconfig.json
├── tslint.json
├── webpack.server.config.js
├── yarn-error.log
└── yarn.lock
個人的には実質のビルド生成物であるdistフォルダが適切にアップロードされていればいいのですが、なんかプライベートな具材まで綺麗にタタミこまれちゃってます。 これでは、AWSアカウント情報を記述したファイルが混入していたら、万が一、悪意ある第三者に流出した場合にセキュリティー的な問題が発生します。
【SLS Ver.1(アーカイブ用)】serverless.ymlでのexcludeオプションの記述例
早速流出させたくないファイルを
serverless.yml
exclude
#...中略
package:
exclude:
- README.md
- .DS_Store
- .dockerignore
- .editorconfig
- .npmrc
- .vscode/**
- Dockerfile
- docker-compose.yml
- yarn-error.log
- yarn.lock
- angular.json
- compress.js
- local.js
- ng-toolkit.json
- prerender.ts
- server.ts
- static.js
- static.paths.ts
- tsconfig.json
- tslint.json
- webpack.server.config.js
#...以下略
ビルドに使用する設定ファイルや、ローカルテストに使ったソースコードも要らないので、ジャンジャンexcludeします。
これを利用してプロジェクトをビルドすると、以下のようにスッキリとしたzipパッケージになりました。
$ tree
.
├── dist
│ ├── browser
│ │ ├── 3rdpartylicenses.txt
│ │ ├── hogehoge.ttf
│ │ ├── hogehoge.woff
│ │ ├── hogehoge.woff2
│ │ ├── assets
│ │ │ └── personal_logo.svg
│ │ ├── es2015-polyfills.js
│ │ ├── favicon.ico
│ │ ├── index.html
│ │ ├── main.js
│ │ ├── polyfills.js
│ │ ├── robots.txt
│ │ ├── runtime.js
│ │ ├── sitemap.xml
│ │ └── styles.css
│ ├── prerender.js
│ ├── server
│ │ ├── main.js
│ │ └── main.js.map
│ └── server.js
├── lambda.js
├── node_modules
│ ├── aws-serverless-express
│ ├── binary-case
│ ├── media-typer
│ ├── mime-db
│ ├── mime-types
│ └── type-is
└── package.json
以上が、
serverless.yml
exclude
デプロイするパッケージに関する詳細は
SLS Ver.2(非推奨)でまとめる
前節のSLS V.1の
package
おそらくそのままV.2に引き上げると、
$ sls deploy
#...中略
Error: No file matches include / exclude patterns
at globby.then.allFilePaths (/usr/local/lib/node_modules/serverless/lib/plugins/package/lib/packageService.js:234:13)
#....
と言ったように、
No file matches include / exclude patterns
どうやらSLS V.2での仕様変更で、
exclude
include-exclude patterns
つまりはSLS V.1では
パッケージから除外したいもの
パッケージへ同梱したいもの
#...中略
package:
exclude:
- '**'
include:
- 'dist/**'
- 'lambda.js'
- 'node_modules/@vendia/**'
- 'node_modules/aws-serverless-express/**'
- 'node_modules/binary-case/**'
- 'node_modules/type-is/**'
- 'node_modules/media-typer/**'
- 'node_modules/mime-types/**'
- 'node_modules/mime-db/**'
#...以下略
以上のように、V1とV2ではZipするパッケージの記述方法がガラッと変わりましたので気を遣う必要があります。
なお、awsへSLS V.2でSAMアプリをデプロイする場合に、
AWS Lambda側でライブラリが足りていない場合のエラーはクライアント環境では検知することができないので、AWS CloudWatchのダッシュボードから該当のLambdaのロググループの中身でエラーの内容を対処しましょう。

SLS Ver.3(現行)でまとめる
※この項目は2023年3月に更新した内容です。
Serverless Framework V3が正式にリリースした以降、首題にしてきた
ということで、先程のV.2版で説明した内容をそのままV.3に書き直すと
package
#...中略
package:
patterns:
- '!**'
- 'dist/**'
- 'lambda.js'
- 'node_modules/@vendia/**'
- 'node_modules/aws-serverless-express/**'
- 'node_modules/binary-case/**'
- 'node_modules/type-is/**'
- 'node_modules/media-typer/**'
- 'node_modules/mime-types/**'
- 'node_modules/mime-db/**'
#...以下略
このファイルでいうと、
exclude: - '**'
'!**'
「!」
inclue
「!」
まとめ
このブログ執筆次点で、既にSLS V.3がリリースされて、V.1やV.2は過去のものになってしまいました。
packageタグの記述作法は開発側も結構仕様をコロコロと変えてきた経緯がこの記事でもおわかりいただけるかと思いますが、おそらくV3で導入された
patterns
参考サイト
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー