ããã¯ããªã«ãããããŠæžãããã®ïŒ
TypeScriptã§AWS Lambdaé¢æ°ãæžããŠã¿ããããªãšæããŸããŠã
LocalStackã«ãããã€ããŠãåãããŠã¿ããšãããŸã§ãã£ãŠã¿ãŸããã
èãæ¹ïŒ
TypeScriptã䜿ã£ãäŸã¯ããã¡ãã«ãåºãŠããã®ã§ããã
Lambda 関数の作成と使用 - AWS SDK for JavaScript
https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/lambda
èå¿ã®ãã¢ããããŒãããzipãã¡ã€ã«ã®äœãæ¹ãæžããŠãããŸããã
ã©ããããTypeScriptãã¡ã€ã«ã®ãã«ãåŸã«package.json
ïŒããã³package-lock.json
ïŒãã³ããŒïŒnpm install
ããŠ
zipãã¡ã€ã«ãäœããšããæµãã«ãªãã¿ããã§ãã
ã§ã¯ããã£ãŠã¿ãŸãããã
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ãã
LocalStackã
$ localstack --version 0.12.19.3
èµ·åã
$ LAMBDA_EXECUTOR=docker-reuse localstack start
$ awslocal --version aws-cli/2.3.3 Python/3.8.8 Linux/5.4.0-89-generic exe/x86_64.ubuntu.20 prompt/off
AWS Lambdaã®ãµããŒãããŠããNode.jsã®ããŒãžã§ã³ã§ãçŸæç¹ã§ææ°ãªã®ã¯v14ã®ãããªã®ã§
ããŒã«ã«ãv14ã®Node.jsã䜿ã£ãŠããããšã«ããŸããã
$ node -v v14.18.1 $ npm -v 6.14.15
TypeScriptã®ããŒãžã§ã³ãäžå¿ãPrettierã䜿ã£ãŠããŸãã
$ npx tsc --version Version 4.4.4 $ npx prettier --version 2.4.1
tsconfig.json
ã¯ããã®ããã«èšå®ã
tsconfig.json
{ "compilerOptions": { "target": "esnext", "module": "commonjs", "baseUrl": "./src", "outDir": "dist", "strict": true, "noImplicitAny": true, "forceConsistentCasingInFileNames": true, "esModuleInterop": true, "sourceMap": true, "skipLibCheck": true }, "include": [ "src" ] }
.prettierrc.json
ã«ã€ããŠã¯ãç¹ã«äžèº«ã¯ãããŸããã
.prettierrc.json
{}
ãé¡
åã«æååãè¿ãã ãã®é¢æ°ãäœæããŠããªããªã®ã§ãLocalStackã®Amazon S3ã«ã¢ã¯ã»ã¹ããé¢æ°ãäœæããããšã«
ããŸãããã
æºå
å¿ èŠãªã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŸãã
å宣èšã
$ npm i -D @types/node @aws-sdk/types
Amazon S3ã«ã¢ã¯ã»ã¹ããããã®ã©ã€ãã©ãªã
$ npm i @aws-sdk/client-s3
AWS SDKã¯ãv3ã䜿ãããšã«ããŸããã
SDK for JavaScript をインストールする - AWS SDK for JavaScript
APIããã¥ã¡ã³ãã¯ããã¡ãã
v3ã§ã¯ãåãµãŒãã¹ããšã«ã¯ã©ã€ã¢ã³ããã€ã³ã¹ããŒã«ãã圢æ ã¿ããã§ãã
package.json
ã§ã®äŸåé¢ä¿ã¯ããããªããŸããã
"devDependencies": { "@aws-sdk/types": "^3.38.0", "@types/node": "^16.11.6", "prettier": "2.4.1", "typescript": "^4.4.4" }, "dependencies": { "@aws-sdk/client-s3": "^3.39.0" }
AWS Lambdaé¢æ°ããã¢ã¯ã»ã¹ãããS3ãã±ããã®äœæã
$ awslocal s3 mb s3://my-bucket
ããã§æºåã¯å®äºã§ãã
ãœãŒã¹ã³ãŒããäœæãã
ã§ã¯ããœãŒã¹ã³ãŒããäœæããŸãã
src/index.ts
import { S3 } from "@aws-sdk/client-s3"; const localstackEndpoint = `http://${process.env["LOCALSTACK_HOSTNAME"]}:${process.env["EDGE_PORT"]}`; const s3 = new S3({ endpoint: localstackEndpoint, forcePathStyle: true }); export async function handler(event: any, context: any): Promise<object> { const requestMessage = event.message; const now = new Date().toISOString(); const bodyMessage = `[${now}] ${requestMessage}`; const putResult = await s3.putObject({ Bucket: "my-bucket", Key: "my-file", Body: bodyMessage, }); return { message: bodyMessage, }; }
ãã€ã³ãã§ãããLocalStackå
ã§èµ·åããAWS Lambdaé¢æ°ã§Amazon S3ãAWS DynamoDBã«ã¢ã¯ã»ã¹ããéã«ã¯ã
LOCALSTACK_HOSTNAME
ãšEDGE_PORT
ãšããç°å¢å€æ°ã䜿ããšè¯ãããã§ãã
ç¹ã«ãã®ããšãæžãããŠããã®ã¯ãLOCALSTACK_HOSTNAME
ã§ããã
LocalStack / Debugging Configurations
ããšãAmazon S3ã«ã¢ã¯ã»ã¹ããéã«ã¯forcePathStyle
ãtrue
ã«ããŠãããªããšãããŸãã¢ã¯ã»ã¹ã§ããŸããã
S3 | S3 Client - AWS SDK for JavaScript v3
const localstackEndpoint = `http://${process.env["LOCALSTACK_HOSTNAME"]}:${process.env["EDGE_PORT"]}`; const s3 = new S3({ endpoint: localstackEndpoint, forcePathStyle: true });
S3#putObject
ã«æž¡ãåŒæ°ãæåAPIããã¥ã¡ã³ãããã¯ããããããªãã£ãã®ã§ããâŠ
PutObjectCommandInput | S3 Client - AWS SDK for JavaScript v3
ããèŠããšããæžããŠãã£ãã®ã§
This interface extends from PutObjectRequest interface. There are more parameters than Body defined in PutObjectRequest
ãã¡ããåãããŠã¿ãã®ãæ£è§£ã ãšâŠã
PutObjectRequest | S3 Client - AWS SDK for JavaScript v3
APIããã¥ã¡ã³ãã®èªã¿æ¹ã¯ããŸã ã¡ãã£ãšæ £ããªãæããããŸããã
ããšãhandlerã®any
ãæ°æã¡æªãæ°ãããŸãããããã¯ãªãã±ã§è£è¶³ããŸãã
â»ç¹ã«AWS SDK v2ã®å Žå
export async function handler(event: any, context: any): Promise<object> {
ãã«ããšããã±ãŒãžã³ã°ã¯ããããªã¹ãããã§å®è¡ããŸããã
ãŸãã¯TypeScriptãã¡ã€ã«ããã«ããä»åã®èšå®ã ãšãdist
ãã£ã¬ã¯ããªå
ã«åºåãããŸãã
$ npx tsc
TypeScriptãã¡ã€ã«ã®ãã«ããçµãã£ãããdist
ãã£ã¬ã¯ããªã«package.json
ãšpackage-lock.json
ãã³ããŒã
$ cp package*.json dist
dist
ãã£ã¬ã¯ããªå
ã§ãdependencies
ã®äŸåé¢ä¿ã®ã¿ã€ã³ã¹ããŒã«ã
$ cd dist $ npm i --production
ãã«ãããã.js
ãã¡ã€ã«ãšnode_modules
ãã£ã¬ã¯ããªããzipã«ãŸãšããŸãã
$ zip -r function.zip index.js node_modules
å ã®ãã£ã¬ã¯ããªã«æ»ã£ãŠ
$ cd ..
æåŸã«awslocal lambda create-function
ã§ãããã€ã§ãã
.zip ファイルアーカイブで Node.js Lambda 関数をデプロイする - AWS Lambda
$ awslocal lambda create-function \ --function-name my-typescript-function \ --zip-file fileb://dist/function.zip \ --handler index.handler \ --runtime nodejs12.x \ --role test-role
æŽæ°ãšåé€ã¯ããã¡ãã§ããã
$ awslocal lambda update-function-code \ --function-name my-typescript-function \ --zip-file fileb://dist/function.zip $ awslocal lambda delete-function --function-name my-typescript-function
ãããã€ããAmazon Lambdaé¢æ°ãåŒã³åºããŠã¿ãŸãã
$ awslocal lambda invoke --function-name my-typescript-function --payload '{"message": "Hello World!!"}' --cli-binary-format raw-in-base64-out result.json
çµæã
result.json
{"message":"[2021-11-03T13:31:26.607Z] Hello World!!"}
æ¥ä»ã®éšåã¯ãå®è¡ãã床ã«å€åããŸãã
Amazon S3ãã±ããã®äžèº«ã確èªããŠã¿ãŸãããã
$ awslocal s3 cp s3://my-bucket/my-file - [2021-11-03T13:31:26.607Z] Hello World!!
OKã§ããã
ãªãã±ïŒscriptsã§package.jsonãã³ããŒããããã«ãã
package.json
ã§ã®zipããã±ãŒãžã³ã°ã®å®çŸ©ã¯ããã®ããã«ãŸãšããŸããã
"scripts": { "build": "tsc", "clean": "rm -rf dist", "format": "prettier --write src", "lambda-package": "npm run build && cp package*.json dist/ && cd dist && npm i --production && zip -r function.zip *" },
zipãã¡ã€ã«ã«ãŸãšãããšããã¯ãã ãã¶ãã£ããã«ãªã£ãŠããŸããã
ãã¡ãã®ã³ãã³ãã§ãã«ããããš
$ npm run lambda-package
dist/function.zip
ãã§ããã®ã§ãããã€ããã°OKã§ãã
ãªãã±ïŒ aws-lambdaå宣èš
hanlderé¢æ°ã®åŒæ°ãany
ã«ãªã£ãŠããã®ãã¡ãã£ãšæ°æã¡æªããšããã§ããã
export async function handler(event: any, context: any): Promise<object> {
ãã®å宣èšã¯@types/aws-lambda
ã§è¿œå ã§ããŸãã
$ npm i -D @types/aws-lambda
https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/aws-lambda/README.md
ã±ã£ãšèŠããšaws-lambda
ãšããããã±ãŒãžã®å宣èšã«èŠããã®ã§ããããã¡ãã¯CLIããŒã«ã ã£ããããŸãã
README.md
ã«ã¯CLIããŒã«ã§ããaws-lambda
ãšã¯ç¡é¢ä¿ãªããšãæžãããŠããŸãã
Types helpful for implementing handlers in the AWS Lambda NodeJS runtimes, the handler interface and types for AWS-defined trigger sources.
ãŸãšã
TypeScriptã§AWS Lambdaé¢æ°ãäœæããŠãLocalStackã«ãããã€ããŠã¿ãŸããã
å²ãšå°ã£ãã®ã¯ãTypeScriptã§AWS Lambdaé¢æ°ãã©ã宣èšãããããã®ããããããªããŠãããããèŠãçµæ
åŒæ°ãany
ã«ããããšã«ããã®ã§ããã
ãã¡ãã«ãããœãŒã¹ã³ãŒãã ãšãåãçç¥ããŠããã®ã§ãããããã®ãããããŸããâŠã
https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/lambda/src
ããšã¯ãAWS SDK for JavaScript v3ã®APIããã¥ã¡ã³ãããªããªãèªããªããŠå°ããŸããâŠã
ãŸãããããããšã£ãããã«ã¯ãªã£ãã®ã§è¯ããšããŸãããã