カテゴリー
【AWS Lambda使い方ガイド】AWS CLIから簡単なランタイムNodejs v18対応のLambdaをデプロイする手順
※ 当ページには【広告/PR】を含む場合があります。
2023/06/15
index.js
index.mjs
esbuild
esbuild
前置き
AWS CLI
AWS CLI
Lambda実行ロールの準備
lambda_basic_execution
$ aws iam list-roles | grep Arn
#...ARNのリストが表示される
"Arn": "arn:aws:iam::************:role/<Lambdaに割り当てる実行権限ロール>",
#...
#もしくはjqコマンドが使える場合
$ aws iam list-roles | jq '.Roles[].Arn'
#...ARNのリストが表示される
"arn:aws:iam::************:role/<Lambdaに割り当てる実行権限ロール>"
#...
Lambdaのプロジェクト作成 〜 esbuildでハンドラのビルドする
esbuild
nodejsプロジェクトのリソースを作成
$ touch package.json index.ts
package.json
{
"name": "my-lambda",
"version": "0.0.1",
"description": "To execise to use AWS lambda with nodejs18."
}
$ yarn init
$ yarn add typescript @types/node tslib -D
$ yarn tsc --init
tsconfig.json
トランスパイラをtscからesbuildに乗り換え
$ yarn add esbuild -D
$ touch esbuild.config.js
esbuild
esbuild.config.js
import esbuild from 'esbuild';
esbuild.build({
entryPoints: [
'./iindex.ts',
],
outdir: 'build',
outExtension: { '.js': '.mjs' },
bundle: true,
minify: true,
platform: 'node',
sourcemap: false,
target: ['node18'],
plugins: [],
external: [],
}).catch(() => process.exit(1));
package.json
{
"name": "my-lambda",
"version": "0.0.1",
"description": "To execise to use AWS lambda with nodejs18.",
"scripts": {
"build": "rm -rf build && node esbuild.config.js"
},
"type": "module",
"devDependencies": {
"tslib": "^2.4.1",
"@types/node": "^20.0.0",
"esbuild": "^0.18.2",
"typescript": "^4.9.4"
}
}
esbuild
tsc
"type": "module",
esbuild:external指定でnodeパッケージ依存性を制御する
esbuild:external指定
「shelljs」
「pm2」
external
//...中略
esbuild.build({
//...
external: [
'shelljs',
'pm2'
],
}).catch(() => process.exit(1));
esbuildでindex.tsをビルドする
index.ts
export const handler = async (event: any, context: any) => {
const response: any = { statusCode: 200, body: '' };
try {
response.body = {message: 'HELLO, NODEJS V18!!!'};
return response;
} catch (error) {
response.statusCode = 500;
response.body = `ERROR: ${error}`;
return response;
}
}
export const handler...
$ yarn build
$ ls -la build/
-rw-r--r-- 1 node node 655 Jun 14 07:45 index.mjs
index.mjs
AWS CLIでLambdaをデプロイしてみる
index.mjs
ビルドしたソースを圧縮
tmp
build
tmp
$ mkdir tmp
$ zip -rj tmp/my-function.zip build/*
zip圧縮で-j(junk)オプションがないと困った話
-rオプション
$ zip -r tmp/my-function.zip build/*
-rオプション
build
$ zipinfo -1 my-function.zip
build/index.mjs
build
index.mjs
CloudWatch
2023-06-14T11:14:24.790Z undefined ERROR Uncaught Exception
{
"errorType": "Runtime.ImportModuleError",
"errorMessage": "Error: Cannot find module 'index'\nRequire stack:\n- /var/runtime/index.mjs",
"stack": [
"Runtime.ImportModuleError: Error: Cannot find module 'index'",
"Require stack:",
"- /var/runtime/index.mjs",
" at _loadUserApp (file:///var/runtime/index.mjs:997:17)",
" at async UserFunction.js.module.exports.load (file:///var/runtime/index.mjs:1032:21)",
" at async start (file:///var/runtime/index.mjs:1195:23)",
" at async file:///var/runtime/index.mjs:1201:1"
]
}
index.mjs
「Cannot find module 'index'」
build
-j(junk)オプション
build
$ zip -rj tmp/my-function.zip build/*
$ zipinfo -1 my-function.zip
index.mjs
build
esbuild
node_modules
AWS CLIからLambdaへデプロイ
$ aws lambda create-function \
--function-name [Lambdaの関数名] \
--runtime nodejs18.x \
--zip-file fileb://tmp/my-function.zip \
--role [Lambdaに割り当てる実行権限ロールのARN] \
--handler index.handler
$ aws lambda list-functions | grep FunctionName
#...
"FunctionName": "Lambdaの関数名",
#...
invoke
$ aws lambda invoke \
--function-name [Lambdaの関数名] \
--payload '{"key1":"value1","key2":"value2","key3": "value3"}' \
response.json
#👇レスポンス
{
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
200
response.json
--payload
デプロイしたLambdaを更新する場合
create-function
update-function-code
$ aws lambda update-function-code \
--function-name [Lambdaの関数名] \
--zip-file fileb://tmp/my-function.zip
デプロイしたLambdaを抹消する
$ aws lambda delete-function \
--function-name [Lambdaの関数名]
まとめ
lambda invoke
参考サイト
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー