ビルドオプション
関数がデプロイされる前にスクリプトを実行する必要がある場合があります。例えば、TypeScriptやES6をBabelまたはtscを使用してAWS Lambdaのnodeランタイムでサポートされている形式に変換するためです。amplify pushは、プロジェクトルートのpackage.jsonでamplify:<resource_name>という名前のスクリプト定義を探し、関数リソースのsrcディレクトリでnpm installが実行された直後にそれを実行します。
例: TSCでTypeScriptコードをトランスパイルする
npm install -g typescriptを実行してグローバルに、またはnpm install --save-dev typescriptを実行してローカルにtscコマンドをインストールしていることを確認してください。
amplify function addで関数リソースが作成されており、generateReportという名前だとしましょう。この関数のES6ソースコードはamplify/backend/function/generateReport/libに配置されており、リソースのsrcディレクトリにはこの関数の自動生成されたpackage.jsonのみが含まれています。TypeScriptをコンパイルするには、プロジェクトルートのpackage.jsonに以下のスクリプト定義を追加する必要があります:
{ "scripts": { "amplify:generateReport": "cd amplify/backend/function/generateReport && tsc -p ./tsconfig.json && cd -" },}amplify/backend/function/generateReportに移動してtsconfig.jsonを作成し、以下を追加します:
{ "compilerOptions": { "allowSyntheticDefaultImports": true, "lib": ["dom", "esnext"], "module": "commonjs", "moduleResolution": "node", "skipLibCheck": true, "resolveJsonModule": true, "outDir": "./src", "baseUrl": "./", "rootDir": "./lib", "paths": { "src": ["./lib"] } }}**注:**TypeScriptファイルでaws-sdkを使用している場合、以下の方法でインポートしようとするとタイムアウトが発生することに注意することが重要です:
import AWS from 'aws-sdk';これに変更してください:
import * as AWS from 'aws-sdk';amplify pushを実行すると、amplify:generateReportスクリプトが実行されます。プロジェクトルートディレクトリにyarn.lockファイルが存在するかどうかに応じて、yarnまたはnpmによって実行されます。
例: BabelでES6コードをトランスパイルする
amplify function addで関数リソースが作成されており、generateReportという名前だとしましょう。この関数のES6ソースコードはamplify/backend/function/generateReport/libに配置されており、リソースのsrcディレクトリにはこの関数の自動生成されたpackage.jsonのみが含まれています。Babelを実行するには、プロジェクトルートのpackage.jsonに以下のスクリプト定義と開発依存関係を追加する必要があります:
{ "scripts": { "amplify:generateReport": "cd amplify/backend/function/generateReport && babel lib -d src && cd -" }, "devDependencies": { "@babel/cli": "^7.5.5", "@babel/preset-env": "^7.5.5", }}トランスパイルされたコードがAWS Lambdaで実行できるようにBabelを適切に設定する必要があります。これはリソースフォルダー(amplify/backend/function/generateReport/.babelrcこの場合)に.babelrcファイルを追加することで行えます:
{ "presets": [ [ "env", { "exclude": ["transform-regenerator"], "targets": { "node": "10.18" } } ] ], "plugins": [ "transform-async-to-generator", "transform-exponentiation-operator", "transform-object-rest-spread" ]}amplify pushを実行すると、amplify:generateReportスクリプトが実行されます。プロジェクトルートディレクトリにyarn.lockファイルが存在するかどうかに応じて、yarnまたはnpmによって実行されます。
Python関数には既存のビルドオプションはありません。Python関数のビルドとパッケージングのプロセスは、仮想環境に依存するLambdaデプロイメントパッケージを手動で作成するためのAmazonの既存のドキュメントと一致しています。
Amplifyはビルド中に関数のソースディレクトリでpipenv installを実行します。Pipenvのデフォルト仮想環境を使用するか、アクティブな仮想環境を使用します。その後、パッケージングステージでは、その仮想環境のsite-packagesディレクトリの内容が、関数固有のファイルと一緒にzip化されます。
Pythonビルドの内容には、関数を実行するために必要なもののほかに、ローカル開発依存関係(テスト用など)を含めることができます。「編集可能」としてインストールされたパッケージ(-eフラグを使用)は、依存関係のローカルで編集可能なコードを指す.egg-linkファイルとして表されるため、パッケージ化されません。