ãã®èšäºã§ã¯ããµãŒããŒã¬ã¹ã¢ããªã±ãŒã·ã§ã³ãããŒã«ã«ã§éçºããã³ãã¹ãããæ¹æ³ãããã³ããšã³ãããã³ããã¯ãšã³ãã«ãŒãã£ã³ã°ãAmazonãµãŒãã¹ãªã©ã«çŠç¹ãåœãŠãŸãã 誰ãæ°ã«ããªããç«ãžããããïŒ
åºæã®ãããªãã®
æè¿ãŸã§ããµãŒããŒã¬ã¹ã¢ããªã±ãŒã·ã§ã³ã®éçºã¯ãã©ã ãé¢æ°ãšAPIã®å®å šãªããŒã«ã«ãã¹ãã®æ段ããªãã£ããããéåžžã«è€éã§ããã ã¢ããªã±ãŒã·ã§ã³ãäœæãããšãã¯ããã©ãŠã¶ã§ã³ãŒããç·šéããŠåžžã«ãªã³ã©ã€ã³ã§äœæ¥ããããã©ã ãé¢æ°ã®ãœãŒã¹ã³ãŒããåžžã«ã¯ã©ãŠãã«ã¢ãŒã«ã€ãããŠã¢ããããŒãããå¿ èŠããããŸããã
2017幎ã®å€ã«çªç Žå£ããããŸããã AWSã¯ã ãµãŒããŒã¬ã¹ã¢ããªã±ãŒã·ã§ã³ã¢ãã« ïŒSAMïŒãšåŒã°ããæ°ããåçŽåãããCloudFormationãã³ãã¬ãŒãæšæºãäœæããåæã«sam-localãããžã§ã¯ããéå§ããŸããã ãŸãæåã«ã
Amazon CloudFormationã¯ãJSONãŸãã¯YAMLãã³ãã¬ãŒããã¡ã€ã«ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã«å¿ èŠãªãã¹ãŠã®AWSã€ã³ãã©ã¹ãã©ã¯ãã£ãèšè¿°ããããšãã§ãããµãŒãã¹ã§ãã ããã¯éåžžã«äŸ¿å©ãªããšã§ãã ããããªããšãWebã³ã³ãœãŒã«ãŸãã¯ã³ãã³ãã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠæåã§å¿ èŠãªå€ãã®ãªãœãŒã¹ãæåã§äœæããå¿ èŠããããŸãïŒã©ã ãé¢æ°ãããŒã¿ããŒã¹ãAPIãããŒã«ãããã³ããªã·ãŒ...
CloudFormationã䜿çšãããšãç¹å¥ãªãã¶ã€ããŒã§ã€ã³ãã©ã¹ãã©ã¯ãã£ãæç»ãããããã³ãã¬ãŒãã«æã§ã€ã³ãã©ã¹ãã©ã¯ãã£ãæžã蟌ãããšãã§ããŸãã ãããã«ãããçµæã¯ãã³ãã¬ãŒããã¡ã€ã«ã«ãªããŸãããã³ãã¬ãŒããã¡ã€ã«ã䜿çšãããšãæ°åã®ã¯ãªãã¯ã§ããŸãã¯1ã€ã®ã³ãã³ãã§ãã¢ããªã±ãŒã·ã§ã³ã«å¿ èŠãªãã¹ãŠã®ãã®ãåŒãç¶ãäœæã§ããŸãã ãããŠãå¿ èŠã«å¿ããŠããã®ãã³ãã¬ãŒããå€æŽãã1ã€ã®ã³ãã³ãã§å床é©çšããŸãã ããã«ãããã¢ããªã±ãŒã·ã§ã³ã€ã³ãã©ã¹ãã©ã¯ãã£ã®ãµããŒããã¯ããã«ç°¡åã«ãªããŸãã ã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ã³ãŒãã®ããã§ãã
CloudFormationã¯çŸããããã®ãã³ãã¬ãŒãã䜿çšãããš ãAWSãªãœãŒã¹ã®ã»ãŒ100ïŒ ãèšè¿°ããããšãã§ããŸã ã ããããæ±çšæ§ããããããããã¯ããªããåé·ãªã圢åŒã§ãããã³ãã¬ãŒãã¯ããã«é©åãªãµã€ãºã«æé·ã§ããŸãã ãããèªèãããµãŒããŒã¬ã¹ã¢ããªã±ãŒã·ã§ã³ã®éçºã容æã«ããããšãç®æããŠãAWSã¯æ°ããSAM圢åŒãäœæããŸããã
æ¡ä»¶ä»ãã§ãéåžžã®CloudFormationãã³ãã¬ãŒãã¯äœã¬ãã«èšèªã§èšè¿°ãããŠãããšæ³å®ã§ããŸãã ãŸããSAMãã³ãã¬ãŒãã¯é«æ°Žæºèšèªã§ãããããç°¡çŽ åãããæ§æã䜿çšããŠãµãŒããŒã¬ã¹ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãèšè¿°ããããšãã§ããŸãã SAMãã³ãã¬ãŒãã¯ããããã€æã«CloudFrontã«ãã£ãŠéåžžã®ãã³ãã¬ãŒãã«å€æãããŸãã
sam-localãšã¯äœã§ããïŒ ããã¯ãSAMãã³ãã¬ãŒãã§èšè¿°ããããµãŒããŒã¬ã¹ã¢ããªã±ãŒã·ã§ã³ãããŒã«ã«ã§æäœã§ããã³ãã³ãã©ã€ã³ããŒã«ã§ãã Sam-localã䜿çšãããšãã©ã ãé¢æ°ããã¹ãããããããŸããŸãªAWSãµãŒãã¹ããã€ãã³ããçæããããã²ãŒããŠã§ã€APIãå®è¡ããããSAMãã³ãã¬ãŒãããã§ãã¯ãããã§ããŸãã
Sam-localã¯ãDockerã³ã³ãããŒã䜿çšããŠãGatewayããã³Lambda APIããšãã¥ã¬ãŒãããŸãã åäœåçã¯æ¬¡ã®ãšããã§ãã èµ·åãããšãsam-localã¯ãããžã§ã¯ããã©ã«ããŒã§SAMãã³ãã¬ãŒããã¡ã€ã«ãæ¢ããŸãã ãã³ãã¬ãŒããã¡ã€ã«ãåæããDockerã³ã³ããå ã®ãã³ãã¬ãŒãã«å²ãåœãŠããããªãœãŒã¹ãèµ·åããŸããAPIãéããã©ã ãé¢æ°ããããã«æ¥ç¶ããŸãã ããã«ããµããŒãã¯å®éã®ã©ã ãé¢æ°ã®åäœã«éåžžã«è¿ãã§ãïŒå¶éã䜿çšãããã¡ã¢ãªã®éãããã³å®è¡æéã瀺ããŠããŸãïŒã
ãããªæã
Georgiy@Baltimore MINGW64 /h/dropbox/projects/aberp/lambda (master) $ sam local start-api --docker-volume-basedir /h/Dropbox/Projects/aberp/lambda "aberp" â[34mINFOâ[0m[0000] Unable to use system certificate pool: crypto/x509: system root pool is not available on Windows 2018/04/04 22:33:49 Connected to Docker 1.35 â[34mINFOâ[0m[0001] Unable to use system certificate pool: crypto/x509: system root pool is not available on Windows 2018/04/04 22:33:50 Fetching lambci/lambda:nodejs6.10 image for nodejs6.10 runtime... nodejs6.10: Pulling from lambci/lambda â[1B06c3813f: Already exists â[1B967675e1: Already exists â[1Bdaa0d714: Pulling fs layer â[1BDigest: sha256:56205b1ec69e0fa6c32e9658d94ef6f3f5ec08b2d60876deefcbbd72fc8cb12f52kB/2.052kBB Status: Downloaded newer image for lambci/lambda:nodejs6.10 â[32;1mMounting index.handler (nodejs6.10) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH]â[0 m You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template.
次ã«ãããŒã«ã«APIã«ã¢ã¯ã»ã¹ãã察å¿ããã©ã ãé¢æ°ãåŒã³åºãããšã¯ãã©ã ãé¢æ°ãCloudWatchãã°ã«æ å ±ã衚瀺ããã®ãšåãæ¹æ³ã§ã³ã³ãœãŒã«ã«è¡šç€ºãããŸãã
2018/04/04 22:36:06 Invoking index.handler (nodejs6.10) 2018/04/04 22:36:06 Mounting /h/Dropbox/Projects/aberp/lambda as /var/task:ro inside runtime container â[32mSTART RequestId: 9fee783c-285c-127d-b5b5-491bff5d4df5 Version: $LATESTâ[0m â[32mEND RequestId: 9fee783c-285c-127d-b5b5-491bff5d4df5â[0m â[32mREPORT RequestId: 9fee783c-285c-127d-b5b5-491bff5d4df5 Duration: 476.26 ms Billed Duration: 500 ms Memory S ize: 128 MB Max Memory Used: 37 MB â[0m
Sam-localã¯ãŸã ãããªãã¯ããŒã¿ã¹ããŒã¿ã¹ã§ãããéåžžã«å®å®ããŠåäœããŠããããã«æããŸããã
äžè¬ã«ãããããã¹ãŠã«ãããããŒã«ã«ã³ã³ãã¥ãŒã¿ãŒã§ãµãŒããŒã¬ã¹ã¢ããªã±ãŒã·ã§ã³ãäœæããããšãã§ããŸããããã¯ãåŸæ¥ã®Webã¢ããªã±ãŒã·ã§ã³ãäœæãããããè€éã§ã¯ãããŸããã
èšåãããããããŸããã Sam-localã«ã¯é¡äŒŒç¹ããããŸã-Serverless frameworkã§ãã ãµãŒããŒã¬ã¹ãã¬ãŒã ã¯ãŒã¯ã¯éåžžã«äººæ°ããããŸããããã¯ãäž»ã«ä»¥åã«ä»£æ¿æ段ããªãã£ãããã§ãã ç§ã¯ããã䜿çšããçµéšã¯ããŸããããŸããããç§ãç¥ãéããsam-localã®ãããªå®å šãªããŒã«ã«ç°å¢ãæäŸããŠããŸããã Sam-localã¯AWSèªäœã§éçºãããŠãããå¥ã®æ奜家ããŒã ããµãŒããŒã¬ã¹ãã¬ãŒã ã¯ãŒã¯ãäœæããŠããŸãã ãã ãããµãŒããŒã¬ã¹ãã¬ãŒã ã¯ãŒã¯ãæ¯æããããšã§ãç¹å®ã®ãã³ããŒãžã®ã¢ããªã±ãŒã·ã§ã³ã®æ¥ç¶ãæžããããšãã§ãããšããäºå®ã«èµ·å ããå¯èœæ§ããããŸãã
ãã¬ãŒã ã¯ãŒã¯ã«ã€ããŠ
ãã§ã«æžããããã«ãæ°ãããµãŒããŒã¬ã¹ã¢ããªã±ãŒã·ã§ã³ãäœæãããšãã«ã¯ã€ãã¯ã¹ã¿ãŒããæäŸããããã«å¿ èŠã§ãã çŸæç¹ã§ã¯ãWebããŒã¯ã³ã®æ¿èªã®ã¿ããµããŒãããŠããŸãã ããã«ããšã©ãŒåŠçã®è¿œå ããã©ãŒã ã®æäœã衚圢åŒããŒã¿ã®åºåãå±éã¡ã«ããºã ã®æ§æãèšç»ããŠããŸãã äžè¬ã«ãå°æ¥çã«AB-ERPãªããžããªã®ã¯ããŒã³ãäœæããã¢ããªã±ãŒã·ã§ã³ã®äœæ¥ãããã«éå§ã§ããããã«ããŸãã
ERPã·ã¹ãã ãäœæãããããä»ã®è£œåã®ååAB-TASKSããã³AB-DOCãšã®é¡æšã«ããAB-ERPãšåŒã³ãŸããã åæã«ãERPã·ã¹ãã ã®äœæã«ã¯AB-ERPã¯å¿ èŠãããŸãã;ããã«åºã¥ããŠããµãŒããŒã¬ã¹Webã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãããã³ããšã³ãã³ãŒããšããã¯ãšã³ãã³ãŒãããããŸãã ãããã£ãŠããããžã§ã¯ãã«ãŒãã«ã¯2ã€ã®ãã©ã«ããŒããããŸãïŒ lambda ïŒããã¯ãšã³ãïŒãšpublic ïŒããã³ããšã³ãïŒïŒ
+---lambda | +---api | +---core \---public +---css | \---core +---img +---js | \---core \---views
AB-ERPã¯ã1ããŒãžã®Webã¢ããªã±ãŒã·ã§ã³ïŒSPAïŒã®ååã«åºã¥ããŠåäœããŸãã ã¢ããªã±ãŒã·ã§ã³ããããã€ããå Žåãããã³ããšã³ãã³ãŒããAWS S3ã«é 眮ãããã®åã«CloudFrontãæ§æããå¿ èŠããããŸãã ããã¯ã 以åã® AB-DOC ã«é¢ããèšäºã®ãéçºãšå±éãã»ã¯ã·ã§ã³ã§èª¬æãããŠããŸããã
ãããã€äžã®ããã¯ãšã³ãã³ãŒãã¯AWS Lambdaã«ã¢ããããŒããããŸãã
AB-ERPã¯MariaDBãããŒã¿ããŒã¹ãšããŠäœ¿çšããŸãã MariaDBã¯AWS RDSã«ãããã€ãããŸãã å¿ èŠã«å¿ããŠãããšãã°AWS DynamoDBãšé£æºããããã«AB-ERPãåæ§æã§ããŸãã
ãŠãŒã¶ãŒãã¡ã€ã«ã¯AWS S3ã«ä¿åãããŸãã
ããã¯ãã¢ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£ã®å€èŠ³ã§ãã
ããã¯ãšã³ã
çŸæç¹ã§ã¯ããã¹ãŠãéåžžã«ã·ã³ãã«ã§ãã 1ã€ã®ã²ãŒããŠã§ã€APIãªãœãŒã¹ãš1ã€ã®ã©ã ãé¢æ°ã®ã¿ã
SAMãã³ãã¬ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
AWSTemplateFormatVersion : '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: An example RESTful service Resources: ABLambdaRouter: Type: AWS::Serverless::Function Properties: Runtime: nodejs6.10 Handler: index.handler Events: ABAPI: Type: Api Properties: Path: /{proxy+} Method: any
SAMãã³ãã¬ãŒãã«ã¯ãã©ã ãé¢æ°ã§ããABLambdaRouterã®ãªãœãŒã¹ã®1ã€ããããŸãã ABLambdaRouterã¯ãAPIããã®1ã€ã®ABAPIã€ãã³ãã«ãã£ãŠã®ã¿åŒã³åºãããŸãã
API GatewayãªãœãŒã¹ã¯ãä»»æã®ã¡ãœããïŒ ANY ïŒã«ããURL / {proxy +}ã®ãã¹ãžã®ãªã¯ãšã¹ããåãå ¥ããŸãã ã€ãŸããèšãæããã°ãéåžžã®åæ¹åãããã·ãšããŠæ©èœããŸãã Lambdaé¢æ°ã¯ããããããªã¯ãšã¹ãã«å¿ããŠç°ãªãã³ãŒããå®è¡ããã«ãŒã¿ãŒã®åœ¹å²ãåŒãåããå¿ èŠããããŸãã
Lambdaé¢æ°ã³ãŒãïŒã«ãŒã¿ãŒïŒ
'use strict'; const jwt = require('jsonwebtoken'); //process.env.PROD and other env.vars are set in production only if(process.env.PROD === undefined){ process.env.PROD = 0; process.env.SECRET = 'SOME_SECRET_CODE_672967256'; process.env.DB_HOST = '192.168.1.5'; process.env.DB_NAME = 'ab-erp'; process.env.DB_USER = 'ab-erp'; process.env.DB_PASSWORD = 'ab-erp'; } //core modules const HTTP = require('core/http'); const DB = require('core/db'); //main handler exports.handler = (event, context, callback) => { context.callbackWaitsForEmptyEventLoop = false; let api; const [resource, action] = event.pathParameters['proxy'].split('/'); //OPTIONS requests are proccessed by API GateWay using mock //sam-local can't do it, so for local development we need this if(event.httpMethod === 'OPTIONS'){ return callback(null, HTTP.response()); } //require resource module try { api = require('api/' + resource)(HTTP, DB); } catch(e) { if (e.code === 'MODULE_NOT_FOUND') { return callback(null, HTTP.response(404, {error: 'Resource not found.'})); } return callback(null, HTTP.response(500)); } //call resource action if(api.hasOwnProperty(action)) { if(api[action].protected === 0){ api[action](event, context, callback); } else if (event.headers['X-Access-Token'] !== undefined) { let token = event.headers['X-Access-Token']; try { event.userData = jwt.verify(token, process.env.SECRET); api[action](event, context, callback); } catch(error) { return callback(null, HTTP.response(403, {error: 'Failed to verify token.'})); } } else { return callback(null, HTTP.response(403, {error: 'No token provided.'})); } } else { return callback(null, HTTP.response(404, {error: 'Action not found.'})); } }
APIã«ã¯2ã€ã®ã¬ãã«ã®éå±€ããããŸããæåã®ã¬ãã«ã¯ã¢ãžã¥ãŒã«ã§ã2çªç®ã®ã¬ãã«ã¯ã¢ã¯ã·ã§ã³ã§ãã URLã¯api.app.com/module/actionã§ãã ã«ãŒã¿ãŒé¢æ°ã¯ãçä¿¡èŠæ±ã®pathParametersãåæããç®çã®ã¢ãžã¥ãŒã«ãlambda / apiãã©ã«ããŒããæ¥ç¶ããŠãããèŠæ±ããã®ã¢ãžã¥ãŒã«å ã®ç®çã®é¢æ°ã«è»¢éããããšããŸãã
ããã©ã«ãã§ã¯ãã¢ãžã¥ãŒã«å ã®é¢æ°ã¯æ¿èªãå¿ èŠãšãããããã¢ãžã¥ãŒã«ããé¢æ°ãåŒã³åºãåã«ãã«ãŒã¿ãŒã¯X-Access-Tokenãªã¯ãšã¹ãããããŒå ã®æå¹ãªããŒã¯ã³ããã§ãã¯ããŸãã ããŒã¯ã³ãæå¹ãªå Žåãã¢ãžã¥ãŒã«ããé¢æ°ãåŒã³åºãããŸã;æå¹ã§ãªãå Žåããšã©ãŒ403ãè¿ãããŸãã
å€æ°ã®åå¥ã®Gateway APIãªãœãŒã¹ãšå€æ°ã®ã©ã ãé¢æ°ãäœæãã代ããã«ããªããã®ã¢ãããŒããéžæããã®ã§ããïŒ ãŸãããããŠæãéèŠãªããšã¯ãæ§æãå±éãããã³ãã®ãããªã¢ãŒããã¯ãã£ã®å®éã®æäœã®å®¹æãã§ãã 第äºã«ããã®ã¢ãããŒãã¯é¢æ°ã®ã³ãŒã«ãã¹ã¿ãŒããæå°éã«æããŸãã å®éãé¢æ°ã«é·ãåŒã³åºãããªãå ŽåãAWSã¯ãã®ã³ã³ãããŒãåé€ããæ°ããåŒã³åºãã¯ãªã¯ãšã¹ãã®åŠçã«æéãããããŸãã
ãã®ã¢ãããŒãã«ã¯æ¬ ç¹ããããŸãã ããŸããŸãªAPIãªãœãŒã¹ã«å¯ŸããŠãAPI Gatewayã¬ãã«ã§ç¹å¥ãªèšå®ãè¡ãããšã¯ã§ããŸããã
誰ãã質åããããããããŸãããããªãã²ãŒããŠã§ã€APIãå¿ èŠãªã®ã§ããããã©ãŠã¶ããã©ã ãã«çŽæ¥ã¢ã¯ã»ã¹ããªãã®ã¯ãªãã§ããïŒ Gateway APIã«ã¯å€ãã®å©ç¹ããããŸãã Edge Optimizedã¢ãŒãã§ã¯ãCDNã®ããã«æ©èœããå¿çã®ãã£ãã·ã¥ããããããã¯ãšã³ããžã®åŒã³åºããªãã§OPTIONèŠæ±ã«å¿çã§ããŸãïŒMOCKçµ±åïŒãããã«ãããã¢ããªã±ãŒã·ã§ã³ãå€§å¹ ã«é«éåãããŸãã ãŸããDDOSä¿è·ãšãå¶éã䜿çšããŠãã©ãã£ãã¯ãèŠå¶ããæ©èœãåããŠããŸãã ãŸãããµãŒãããŒãã£ã®éçºè åãã«ã¢ããªã±ãŒã·ã§ã³APIãéãããšãã§ããŸãã
ããã³ããšã³ã
ããã³ããšã³ãã§ã¯ãReactãVue.jsãAngular.jsã®ãããªã倧ããªããã¬ãŒã ã¯ãŒã¯ã䜿çšããªãããšã«ãããããSPAã¢ããªã±ãŒã·ã§ã³çšã®å°ããªã«ãŒã¿ãŒãäœæããŸããã
ã«ãŒã¿ãŒã¯åããŒãžã®èª¬æãä¿åããŸãïŒã©ã®htmlãã³ãã¬ãŒããšã©ã®cssãjsãã¡ã€ã«ãå¿ èŠãã ããŒãžãèŠæ±ããããšãã«ãŒã¿ãŒã¯å¿ èŠãªãã¹ãŠã®ãã¡ã€ã«ããã¬ãŒã³ããã¹ãã§ããŒãããããããçµåããŠãã¢ããªã±ãŒã·ã§ã³ã€ã³ã¿ãŒãã§ã€ã¹ã®divã³ã³ãããŒã«æ¿å ¥ããŸãã ã³ã³ããã«æ¿å ¥ããããšãéãããããŒãžã®JavaScriptãå®è¡ãããŸãã
ã«ãŒã¿ãŒã³ãŒã
"use strict"; //ROUTER object const ROUTER = { pages: { "index": ["css/index.css", "views/index.html", "js/index.js"], "login": ["css/login.css", "views/login.html", "js/login.js"] }, open: function(page){ let self = this; $container.html(big_preloader_html); if(self.pages.hasOwnProperty(page)){ const parts = self.pages[page]; let getters = []; let wrappers = []; for (let i = 0; i < parts.length; i++) { if( /^.*\.css$/i.test(parts[i]) ){ wrappers.push('style'); } else if ( /^.*\.js$/i.test(parts[i]) ){ wrappers.push('script'); } else { wrappers.push(''); } getters.push( $.get(parts[i], null, null, 'text').promise() ); } Promise.all(getters).then(function(results) { let html = ''; for (let i = 0; i < results.length; i++) { if(wrappers[i] === ''){ html += results[i]; } else { html += `<${wrappers[i]}>${results[i]}</${wrappers[i]}>`; } } self.updatePath(page); $container.html(html); }); } else { //TODO console.log('404'); } }, updatePath: function(newPath){ if(newPath !== window.location.pathname) { history.pushState({}, null, newPath); } } }
ç°å¢èšå®
ã³ã³ãã¥ãŒã¿ãŒã§ãããžã§ã¯ããéå§ããããã«å¿ èŠãªãã®ã¯ãã¹ãŠããããžã§ã¯ãgithubã® READMEã§æé ã説æããããšããŸããã äœããããŸããããªãå Žåã¯ãã³ã¡ã³ããæžããŠãã ãã-ç§ãã¡ã¯å©ããããšããŸãã ãããã£ãŠãREADMEãè£å ããŸãã
ããŒã«ã«ãã¹ãã®ããã«ãNode.jsã«å°ããªHTTPãµãŒããŒãäœæããŸããã
const express = require('express'); const app = express(); app.use(express.static('public')); app.use(function(req, res, next) { req.url = 'app.html'; next(); }); app.use(express.static('public')); app.listen(80, () => console.log('Listening..'))
éå§ããåã«ã node abserver.jsã³ãã³ãã䜿çšããŠå®è¡ããå¿ èŠããããŸãã èŠæ±ãå°çãããšã ãããªãã¯ãã©ã«ããŒå ã®ãã¡ã€ã«ãæ€çŽ¢ããèŠã€ãã£ãå Žåã¯ãããæäŸããŸãã ãã¡ã€ã«ãèŠã€ãããªãå Žåã¯ãã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ãã¡ã€ã«public \ app.htmlãæäŸãããŸãã SPAã¢ããªã±ãŒã·ã§ã³ãæ©èœããã«ã¯ãããã§ååã§ãã æ¬çªç°å¢ã§ã¯ãAmazon CloudFrontã¯åãããšãè¡ããŸãã
ãããã«
AB-ERPã¯ãŸã éåžžã«æªå å·¥ã§ãã ææ¡ãã³ã¡ã³ããããã«å€ãã®ã³ããããæè¿ããŸãã
çŸåšãæ¿èªã®ã¿ãå€ããå°ãªããAB-ERPã«å®è£ ãããŠããŸããããã«ã€ããŠã¯ã次ã®ããããã®èšäºã§èª¬æããäºå®ã§ãã Gateway APIã䜿çšããéã«ã©ã®ãããªèªèšŒãªãã·ã§ã³ããããã«ã¹ã¿ã èªèšŒãCognitoãšã®çµ±åãå®è£ ããªãã£ãçç±ã
ãããžã§ã¯ãã®ãããªãéçºã®ããã®ããã€ãã®èšç»ã
ããŒã¿ã¢ããªã±ãŒã·ã§ã³ã®äž»èŠãªã³ã³ããŒãã³ãã¯ãåºåçšã®ããŒã¿ãšããŒãã«ãå ¥åããããã®ãã©ãŒã ã§ãã ãããã£ãŠããã©ãŒã ãšããŒãã«ãæäœããæ©èœãæåã«è¿œå ãããŸãã
YAMLãã³ãã¬ãŒãã䜿çšããŠããã©ãŒã ã§ã®äœæ¥ïŒããŒãžã§ã®ãã©ãŒã ã®äœæãããã¯ãšã³ããšããã³ããšã³ãã§ã®æ€èšŒãããŒã¿ããŒã¹ãžã®ä¿åïŒãæšæºåãããšããã¢ã€ãã¢ããããŸãã ã€ãŸããYAMLãã³ãã¬ãŒãã§ãã©ãŒã ãèšè¿°ããããã³ããšã³ããšããã¯ãšã³ãã§æ®ãã®ãã¹ãŠã®äœæ¥ãèšè¿°ã§ããããã«ããŠãAB-ERPã³ãŒãã§è¡ãããããã«ããŸãã ããŒãã«ã«ã¯ãã¿ã¹ã¯ãã©ãã«ãŒAB-TASKSã§äœ¿çšããDatatablesã©ã€ãã©ãªã䜿çšããŸãã
èšäºãæžããšãã次ã®ããŒã«ã圹ã«ç«ã¡ãŸããã
- ãªã³ã©ã€ã³ãã£ãŒããµãŒãã¹draw.io
- ãã£ã¬ã¯ããªããªãŒãæç»ããWindowsã³ãã³ãã©ã€ã³ããªãŒã³ãã³ã