{"id":32181,"date":"2024-01-08T05:05:05","date_gmt":"2024-01-17T13:25:19","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e8%ae%a4%e8%af%81%e5%a4%87%e8%80%83%e3%80%91%e9%9b%b6%e6%88%90%e6%9c%ac%e5%9c%a8%e7%ba%bf%e5%ae%9e%e8%b7%b5%e5%ad%a6%e4%b9%a0aws%e5%85%a5%e9%97%a8%ef%bc%88api-gateway-lambda-dynamodb\/"},"modified":"2024-05-04T17:21:45","modified_gmt":"2024-05-04T09:21:45","slug":"%e3%80%90aws%e8%ae%a4%e8%af%81%e5%a4%87%e8%80%83%e3%80%91%e9%9b%b6%e6%88%90%e6%9c%ac%e5%9c%a8%e7%ba%bf%e5%ae%9e%e8%b7%b5%e5%ad%a6%e4%b9%a0aws%e5%85%a5%e9%97%a8%ef%bc%88api-gateway-lambda-dynamodb","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e8%ae%a4%e8%af%81%e5%a4%87%e8%80%83%e3%80%91%e9%9b%b6%e6%88%90%e6%9c%ac%e5%9c%a8%e7%ba%bf%e5%ae%9e%e8%b7%b5%e5%ad%a6%e4%b9%a0aws%e5%85%a5%e9%97%a8%ef%bc%88api-gateway-lambda-dynamodb\/","title":{"rendered":"\u3010AWS\u8ba4\u8bc1\u5907\u8003\u3011\u96f6\u6210\u672c\u5728\u7ebf\u5b9e\u8df5\u5b66\u4e60AWS\u5165\u95e8\uff08API Gateway, Lambda, DynamoDB\uff09\u3010\u9002\u5408\u521d\u5b66\u8005\u3011"},"content":{"rendered":"<h1>\u7ae0\u8282\u7d22\u5f15<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u3069\u3093\u306a\u8a18\u4e8b\uff1f<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u4f55\u3092\u4f5c\u308b\u306e\u304b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u74b0\u5883<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">LocalStack\u74b0\u5883\u3092\u4fdd\u5b58\u3059\u308b\u65b9\u6cd5<\/ul>\n<\/li>\n<\/ul>\n<p>LocalStack\u3092\u8d77\u52d5\u3057\u3066\u307f\u3088\u3046\uff01<\/p>\n<p>AWS CLI\u3067Lambda\u304c\u5b9f\u884c\u3067\u304d\u308b\u304b\u78ba\u8a8d\u3059\u308b<br \/>\nAWS CLI Local\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<\/p>\n<p>\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u3067\u7ffb\u8a33Web API\u3092\u69cb\u7bc9\u3059\u308b<\/p>\n<p>\u307f\u3093\u306a\u306e\u81ea\u52d5\u7ffb\u8a33API\u547c\u3073\u51fa\u3059Lambda\u3092\u4f5c\u6210\u3059\u308b(Node.js)<br \/>\nNode\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<br \/>\nLambda\u95a2\u6570\u306e\u4f5c\u6210\u3001\u30c7\u30d7\u30ed\u30a4\u3057\u3066\u30c6\u30b9\u30c8<br \/>\nAPI Gateway\u306e\u69cb\u7bc9\u3068Lambda\u3068\u306e\u9023\u643a<br \/>\nDynamoDB\u306e\u69cb\u7bc9<br \/>\nLambda\u3068DynamoDB\u3092\u9023\u643a<br \/>\nAPI Gateway, Lambda, \u7ffb\u8a33API, DynamoDB\u304c\u9023\u643a\u3055\u308c\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3059\u308b<\/p>\n<p>\u7d42\u308f\u308a<\/p>\n<h1>\u4ec0\u4e48\u6837\u7684\u6587\u7ae0\uff1f<\/h1>\n<p>\u5728\u4e91\u8ba1\u7b97\u9886\u57df\uff0c\u4e9a\u9a6c\u900a\u7f51\u7edc\u670d\u52a1\uff08AWS\uff09\u88ab\u5e7f\u6cdb\u4f7f\u7528\u3002\u7136\u800c\uff0c\u4e3a\u4e86\u83b7\u5f97\u4e0eAWS\u76f8\u5173\u7684\u8d44\u8d28\uff0c\u901a\u5e38\u9700\u8981\u4e00\u4e9b\u6559\u80b2\u6750\u6599\u548c\u57f9\u8bad\u7684\u8d39\u7528\u3002\u5bf9\u4e8e\u521d\u5b66\u8005\u6765\u8bf4\uff0c\u8fd9\u6837\u7684\u8d39\u7528\u53ef\u80fd\u6210\u4e3a\u969c\u788d\u3002<\/p>\n<p>\u5728\u6210\u4e3a\u5de5\u7a0b\u5e08\u4e4b\u524d\uff0c\u6211\u79c1\u4e0b\u8fdb\u884c\u4e86AWS\u7684\u5b9e\u8df5\u5b66\u4e60\uff0c\u4f46\u6211\u62c5\u5fc3\u4f1a\u4e0d\u4f1a\u4e0d\u5c0f\u5fc3\u4ea7\u751f\u8d39\u7528\uff08\u6211\u5728\u67d0\u4e2a\u5b66\u4e60\u7f51\u7ad9\u7684AWS\u5b9e\u8df5\u8bfe\u7a0b\u95ee\u7b54\u9875\u9762\u4e0a\u770b\u5230\u4e00\u4e2a\u95ee\u9898\uff0c\u95ee\uff1a\u201c\u6211\u4ea7\u751f\u4e8620\u4e07\u7684\u8d39\u7528\uff0c\u6211\u8be5\u600e\u4e48\u529e\uff1f\u201d\u8ba9\u6211\u611f\u5230\u5f88\u9707\u60ca\uff09\u3002<\/p>\n<p>\u56e0\u6b64\uff0c\u672c\u6587\u5c06\u91cd\u70b9\u4ecb\u7ecd\u521d\u5b66\u8005\u53ef\u4ee5\u514d\u8d39\u4fbf\u6377\u5730\u5b66\u4e60AWS\u8ba4\u8bc1\u8003\u8bd5\u7684\u5b9e\u8df5\u5b66\u4e60\u65b9\u6cd5\u3002<\/p>\n<p>\u6211\u4eec\u5c06\u4f7f\u7528\u4e00\u79cd\u540d\u4e3aLocalStack\u7684\u5de5\u5177\uff0c\u5728\u672c\u5730\u73af\u5883\u4e2d\u6a21\u62dfAWS\u670d\u52a1\uff0c\u6765\u8fdb\u884c\u5b9e\u8df5\u3002\u901a\u8fc7\u6a21\u62dfAWS\u670d\u52a1\uff0cLocalStack\u53ef\u4ee5\u8fdb\u884c\u4e0e\u5b9e\u9645\u7684AWS\u73af\u5883\u76f8\u7c7b\u4f3c\u7684\u64cd\u4f5c\u548c\u6d4b\u8bd5\u3002\u8fd9\u7bc7\u6587\u7ae0\u8be6\u7ec6\u4ecb\u7ecd\u4e86LocalStack 2.0\u7684\u53d1\u5e03\u548c\u529f\u80fd\u6539\u8fdb\u3002<\/p>\n<p>\u5e0c\u671b\u80fd\u4e3a\u521d\u5b66\u8005\u4eec\u5728AWS\u8ba4\u8bc1\u5907\u8003\u4e0a\u63d0\u4f9b\u5e2e\u52a9\uff0c\u52a9\u4ed6\u4eec\u63d0\u5347\u6280\u80fd\uff01<\/p>\n<h1>\u4f60\u8981\u505a\u4ec0\u4e48\uff1f<\/h1>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d108f37434c4406bf1497\/9-0.png\" alt=\"AWS Hands-on for Beginners\u3088\u308a\u5f15\u7528\" \/><\/div>\n<p>\u6211\u77e5\u9053CLI\u7684\u64cd\u4f5c\u53ef\u80fd\u4f1a\u8ba9\u4eba\u611f\u5230\u56f0\u96be\uff0c\u4f46\u662f\u6211\u4f1a\u5c3d\u91cf\u5728\u89e3\u91ca\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u56fe\u89e3\u6765\u5e2e\u52a9\u7406\u89e3\uff01<\/p>\n<h1>\u73af\u5883<\/h1>\n<p>\u6211\u4f7f\u7528\u7684\u5f00\u53d1\u73af\u5883\u662fWSL2 Ubuntu 20.04 LTS\u3002\u7531\u4e8e\u6709\u5173WSL1\u65e0\u6cd5\u542f\u52a8Docker\u7684\u62a5\u9053\uff0c\u6211\u5efa\u8bae\u5c06\u5176\u5347\u7ea7\u81f3WSL2\u3002\uff08\u56e0\u4e3a\u6211\u6700\u521d\u5c1d\u8bd5\u5728WSL1\u4e0a\u542f\u52a8\uff0c\u9047\u5230\u4e86\u76f8\u5f53\u5927\u7684\u56f0\u96be\uff09<\/p>\n<p>\u5728\u8fd9\u7bc7\u6587\u7ae0\u4e2d\uff08\u5173\u4e8e\u5728WSL\u4e0a\u8fd0\u884cDocker\u65f6\u9047\u5230\u7684\u95ee\u9898\uff09\uff0c\u4f3c\u4e4e\u5373\u4f7f\u662f\u5728WSL1\u4e5f\u53ef\u4ee5\u8fd0\u884c\u3002\u3002\u3002<\/p>\n<p>\u4ee5\u4e0b\u662f\u73af\u5883\u7684\u8be6\u7ec6\u4fe1\u606f\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Docker 23.0.4\uff1aDocker Desktop for Windows\u306f\u4f7f\u308f\u305aUbuntu\u306b\u76f4\u63a5\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u3044\u307e\u3059\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">docker-compose v1.29.2<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Python 3.8.10<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">pip 23.1.1<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Visual Studio Code<\/ul>\n<p>\u8bf7\u6ce8\u610f\uff1a\u6587\u7ae0\u64b0\u5199\u65f6\u6240\u63d0\u5230\u7684\u73af\u5883\u7248\u672c\u53ef\u80fd\u4e0e\u6700\u65b0\u7684LocalStack\u4f7f\u7528\u6761\u4ef6\u4e0d\u540c\uff0c\u8bf7\u53ca\u65f6\u67e5\u9605\u6700\u65b0\u7684LocalStack\u5b89\u88c5\u9875\u9762\u4ee5\u83b7\u53d6\u51c6\u786e\u4fe1\u606f\u3002<\/p>\n<h1>\u4fdd\u5b58LocalStack\u73af\u5883\u7684\u65b9\u5f0f<\/h1>\n<p>\u7531\u4e8eLocalStack\u5728\u5bb9\u5668\u4e2d\u8fd0\u884c\uff0c\u56e0\u6b64\u5f53\u505c\u6b62\u5bb9\u5668\u65f6\uff0c\u6240\u6709\u6570\u636e\u90fd\u4f1a\u6d88\u5931\u3002\u56e0\u6b64\uff0cLocalStack V2\u5f15\u5165\u4e86Community Cloud Pods\u529f\u80fd\uff0c\u53ef\u4ee5\u4f7f\u7528\u5b83\u6765\u8fdb\u884c\u5feb\u7167\u3002\u8bf7\u52a1\u5fc5\u4f7f\u7528\u8be5\u529f\u80fd\u3002\u53c2\u8003\uff1aLocalStack Community Cloud Pods<\/p>\n<p>\u64cd\u4f5c\u6b65\u9aa4<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u672c\u5730\u5806\u6808 CLI \u5b89\u88c5<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u53c2\u8003\uff1a\u672c\u5730\u5806\u6808 CLI \u5b89\u88c5<\/ol>\n<\/li>\n<\/ol>\n<p>\u4f7f\u7528 localstack pod save file:\/\/&lt;\u4fdd\u5b58\u8def\u5f84, \u6587\u4ef6\u540d&gt; \u547d\u4ee4\u4fdd\u5b58\u5feb\u7167<\/p>\n<p>\u4f7f\u7528 localstack pod load file:\/\/&lt;\u4fdd\u5b58\u8def\u5f84, \u6587\u4ef6\u540d&gt; \u547d\u4ee4\u52a0\u8f7d\u5feb\u7167<\/p>\n<h1>\u73b0\u5728\u8ba9\u6211\u4eec\u542f\u52a8LocalStack\u5427\uff01<\/h1>\n<p>\u9996\u5148\uff0c\u6211\u5011\u5c07\u5b89\u88dd\u4e26\u5617\u8a66\u555f\u52d5LocalStack\u3002\u96d6\u7136\u6709\u5f88\u591a\u5b89\u88dd\u65b9\u6cd5\u53ef\u9078\uff0c\u4f46\u9019\u6b21\u6211\u5011\u5c07\u4f7f\u7528docker-compose\u4f86\u555f\u52d5\u3002<\/p>\n<p>\u53e6\u5916\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u5728\u542f\u52a8LocalStack\u540e\u4f7f\u7528localhost:4566\/health\u6765\u68c0\u67e5\u5404\u79cd\u670d\u52a1\u7684\u72b6\u6001\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># \u4f5c\u696d\u7528\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u4f5c\u6210\u5f8c\u306b\u4f5c\u696d\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5<\/span>\r\nUbuntu@dev01:~<span class=\"nv\">$ <\/span><span class=\"nb\">mkdir<\/span> .\/workplace <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">cd<\/span> <span class=\"nv\">$_<\/span>\r\n<span class=\"c\"># Github\u304b\u3089LocalStack\u3092\u30af\u30ed\u30fc\u30f3<\/span>\r\nUbuntu@dev01:~\/workplace<span class=\"nv\">$ <\/span>git clone https:\/\/github.com\/localstack\/localstack.git\r\nUbuntu@dev01:~\/workplace<span class=\"nv\">$ <\/span><span class=\"nb\">ls\r\n<\/span>localstack\r\nUbuntu@dev01:~\/workplace<span class=\"nv\">$ <\/span><span class=\"nb\">cd <\/span>localstack\/\r\n<span class=\"c\"># docker compose\u3067LocalStack\u8d77\u52d5<\/span>\r\nUbuntu@dev01:~\/workplace\/localstack<span class=\"nv\">$ <\/span><span class=\"nb\">sudo <\/span>docker-compose up <span class=\"nt\">-d<\/span>\r\nUbuntu@dev01:~\/workplace\/localstack<span class=\"nv\">$ <\/span><span class=\"nb\">sudo <\/span>docker ps <span class=\"nt\">-a<\/span>\r\nCONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS                   PORTS                                                                    NAMES\r\n843a54664031   localstack\/localstack   <span class=\"s2\">\"docker-entrypoint.sh\"<\/span>   3 minutes ago   Up 3 minutes <span class=\"o\">(<\/span>healthy<span class=\"o\">)<\/span>   127.0.0.1:4510-4559-&gt;4510-4559\/tcp, 127.0.0.1:4566-&gt;4566\/tcp, 5678\/tcp   localstack_main\r\n<span class=\"c\"># json\u3092\u6574\u5f62\u3059\u308b\u30c4\u30fc\u30ebjq\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/span>\r\nUbuntu@dev01:~\/workplace\/localstack<span class=\"nv\">$ <\/span><span class=\"nb\">sudo <\/span>apt <span class=\"nb\">install <\/span>jq\r\n<span class=\"c\"># LocalStack\u306e\u5229\u7528\u53ef\u80fd\u306a\u30b5\u30fc\u30d3\u30b9\u4e00\u89a7\u3092\u78ba\u8a8d\u3059\u308b<\/span>\r\nUbuntu@dev01:~\/workplace\/localstack<span class=\"nv\">$ <\/span>curl localhost:4566\/health | jq\r\n% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\r\n                                 Dload  Upload   Total   Spent    Left  Speed\r\n100   876  100   876    0     0   171k      0 <span class=\"nt\">--<\/span>:--:-- <span class=\"nt\">--<\/span>:--:-- <span class=\"nt\">--<\/span>:--:--  171k\r\n<span class=\"o\">{<\/span>\r\n  <span class=\"s2\">\"services\"<\/span>: <span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"acm\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"apigateway\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"cloudformation\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"cloudwatch\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"config\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"dynamodb\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"dynamodbstreams\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"ec2\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"es\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"events\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"firehose\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"iam\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"kinesis\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"kms\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"lambda\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"logs\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"opensearch\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"redshift\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"resource-groups\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"resourcegroupstaggingapi\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"route53\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"route53resolver\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"s3\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"s3control\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"secretsmanager\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"ses\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"sns\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"sqs\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"ssm\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"stepfunctions\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"sts\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"support\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"swf\"<\/span>: <span class=\"s2\">\"available\"<\/span>,\r\n    <span class=\"s2\">\"transcribe\"<\/span>: <span class=\"s2\">\"available\"<\/span>\r\n  <span class=\"o\">}<\/span>,\r\n  <span class=\"s2\">\"version\"<\/span>: <span class=\"s2\">\"2.0.3.dev\"<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u8bf7\u4f7f\u7528AWS CLI\u6765\u9a8c\u8bc1\u662f\u5426\u53ef\u4ee5\u6267\u884cLambda\u51fd\u6570\u3002<\/h2>\n<p>\u5f53\u4f7f\u7528AWS CLI\u65f6\uff0c\u7531\u4e8e\u6839\u636e\u9009\u62e9\u7684\u670d\u52a1\u548c\u533a\u57df\u81ea\u52a8\u786e\u5b9a\u7aef\u70b9URL\uff0c\u56e0\u6b64\u5982\u679c\u8981\u4f7f\u7528LocalStack\uff0c\u9700\u8981\u4f7f\u7528&#8211;endpoint-url\u8fdb\u884c\u6307\u5b9a\u3002<\/p>\n<p>\u540e\u6765\u5b89\u88c5AWS CLI Local\u5e76\u4f7f\u7528awslcoal\u547d\u4ee4\u3002\u5982\u679c\u4f7f\u7528awslocal\u547d\u4ee4\uff0c\u53ef\u4ee5\u7701\u7565\u6307\u5b9a\u7aef\u70b9\u548c\u914d\u7f6e\u6587\u4ef6\uff0c\u6240\u4ee5\u53ef\u4ee5\u8df3\u8fc7\u5b89\u88c5AWS CLI\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># zip, unzip\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/span>\r\nUbuntu@dev01:~<span class=\"nv\">$ <\/span><span class=\"nb\">sudo <\/span>apt <span class=\"nb\">install <\/span>zip unzip \r\n\r\n<span class=\"c\"># AWS CLI\u30a4\u30f3\u30b9\u30c8\u30fc\u30e9\u30fc\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/span>\r\nUbuntu@dev01:~<span class=\"nv\">$ <\/span>curl <span class=\"s2\">\"https:\/\/awscli.amazonaws.com\/awscli-exe-linux-x86_64.zip\"<\/span> <span class=\"nt\">-o<\/span> <span class=\"s2\">\"awscliv2.zip\"<\/span>\r\nUbuntu@dev01:~<span class=\"nv\">$ <\/span>unzip awscliv2.zip\r\n<span class=\"c\"># AWS CLI\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/span>\r\nUbuntu@dev01:~<span class=\"nv\">$ <\/span><span class=\"nb\">sudo<\/span> .\/aws\/install\r\n\r\n<span class=\"c\"># AWS Credentials\u3092\u8a2d\u5b9a<\/span>\r\nUbuntu@dev01:~<span class=\"nv\">$ <\/span>aws configure <span class=\"nt\">--profile<\/span><span class=\"o\">=<\/span>localstack\r\nAWS Access Key ID <span class=\"o\">[<\/span>None]:None\r\nAWS Secret Access Key <span class=\"o\">[<\/span>None]:None\r\nDefault region name <span class=\"o\">[<\/span>None]: ap-notheast-1\r\nDefault output format <span class=\"o\">[<\/span>None]: json\r\n<\/code><\/pre>\n<p>\u8bf7\u6309\u7167\u8fd9\u4e2a\u9875\u9762\u7684\u8bf4\u660e\uff0c\u521b\u5efaLambda\u51fd\u6570\u6587\u4ef6\u5e76\u538b\u7f29\u4e3azip\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># Lambda\u3067\u5b9f\u884c\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3059\u308b\u4f5c\u696d\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u4f5c\u6210\u3057\u3066\u3001\u79fb\u52d5<\/span>\r\nUbuntu@dev01:~<span class=\"nv\">$ <\/span><span class=\"nb\">mkdir<\/span> <span class=\"nt\">-p<\/span> .\/workplace\/demo\/ <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">cd<\/span> <span class=\"nv\">$_<\/span>\r\n<span class=\"c\"># \u95a2\u6570\u3092\u4f5c\u6210\u3059\u308b<\/span>\r\nUbuntu@dev01:~\/workplace\/demo<span class=\"nv\">$ <\/span>vi index.js\r\nexports.handler <span class=\"o\">=<\/span> async <span class=\"k\">function<\/span><span class=\"o\">(<\/span>event, context<span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n          console.log<span class=\"o\">(<\/span><span class=\"s2\">\"ENVIRONMENT VARIABLES<\/span><span class=\"se\">\\n<\/span><span class=\"s2\">\"<\/span> + JSON.stringify<span class=\"o\">(<\/span>process.env, null, 2<span class=\"o\">))<\/span>\r\n          console.log<span class=\"o\">(<\/span><span class=\"s2\">\"EVENT<\/span><span class=\"se\">\\n<\/span><span class=\"s2\">\"<\/span> + JSON.stringify<span class=\"o\">(<\/span>event, null, 2<span class=\"o\">))<\/span>\r\n          <span class=\"k\">return <\/span>context.logStreamName\r\n<span class=\"o\">}<\/span>\r\n\r\n<span class=\"c\"># \u95a2\u6570\u30d5\u30a1\u30a4\u30eb\u3092\u30c7\u30d7\u30ed\u30a4\u30d1\u30c3\u30b1\u30fc\u30b8\u306b\u3059\u308b<\/span>\r\nUbuntu@dev01:~\/workplace\/demo<span class=\"nv\">$ <\/span>zip <span class=\"k\">function<\/span>.zip index.js\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u4f7f\u7528lambda create-function\u547d\u4ee4\u5c06zip\u6587\u4ef6\u90e8\u7f72\u5230Lambda\u3002<br \/>\n\u6709\u5173lambda create-function\u547d\u4ee4\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605\u6b64\u9875\u9762\u3002<\/p>\n<div>\u5728LocalStack V1\u4e2d\uff0c\u60a8\u53ef\u4ee5\u50cfr1\u90a3\u6837\u6307\u5b9a\u4efb\u610f\u5b57\u7b26\u4e32\uff0c\u4f46\u5728LocalStack V2\u4e2d\uff0c\u89d2\u8272\u7684\u6307\u5b9a\u4e3aarn:aws:iam::&lt;12\u4f4d\u6570\u5b57&gt;:role\/&lt;\u4efb\u610f\u5b57\u7b26\u4e32&gt;\u3002\u4e0d\u68c0\u67e5\u6307\u5b9a\u89d2\u8272\u7684\u5b58\u5728\u4e0e\u5426\uff0c\u6240\u4ee5\u53ef\u4ee5\u662f\u4efb\u610f\u503c\u3002\u8bf7\u53c2\u8003\u6b64\u9875\u9762\u4ee5\u4e86\u89e3\u66f4\u591a\u8be6\u7ec6\u4fe1\u606f\u3002<\/div>\n<div>&#8211;handler\u9009\u9879\u6307\u5b9a\u4e3a&#8211;handler &lt;\u6587\u4ef6\u540d&gt;.&lt;\u5165\u53e3\u70b9\u51fd\u6570\u540d&gt;\u3002<\/div>\n<div>&#8211;\u6839\u636e\u8fd9\u4e2a\u9875\u9762\u4e0a\u7684\u6307\u793a\u8fdb\u884c\u4e86runtime\u7684\u8bbe\u5b9a\u3002<\/div>\n<pre class=\"post-pre\"><code><span class=\"c\"># \u4f5c\u6210\u3057\u305f\u30c7\u30d7\u30ed\u30a4\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u4f7f\u3063\u3066Lambda\u95a2\u6570\u3092\u4f5c\u6210\u3059\u308b<\/span>\r\nUbuntu@dev01:~\/workplace\/demo<span class=\"nv\">$ <\/span>aws <span class=\"nt\">--endpoint-url<\/span><span class=\"o\">=<\/span>http:\/\/localhost:4566 lambda create-function <span class=\"nt\">--function-name<\/span> demo-function <span class=\"nt\">--zip-file<\/span> fileb:\/\/function.zip <span class=\"nt\">--handler<\/span> index.handler <span class=\"nt\">--runtime<\/span> nodejs18.x <span class=\"nt\">--role<\/span> arn:aws:iam::123456789012:role\/lambda-demo1 <span class=\"nt\">--profile<\/span><span class=\"o\">=<\/span>localstack\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"FunctionName\"<\/span>: <span class=\"s2\">\"demo-function\"<\/span>,\r\n    <span class=\"s2\">\"FunctionArn\"<\/span>: <span class=\"s2\">\"arn:aws:lambda:ap-northeast-1:000000000000:function:demo-function\"<\/span>,\r\n    <span class=\"s2\">\"Runtime\"<\/span>: <span class=\"s2\">\"nodejs18.x\"<\/span>,\r\n    <span class=\"s2\">\"Role\"<\/span>: <span class=\"s2\">\"arn:aws:iam::123456789012:role\/lambda-demo1\"<\/span>,\r\n    <span class=\"s2\">\"Handler\"<\/span>: <span class=\"s2\">\"index.handler\"<\/span>,\r\n    <span class=\"s2\">\"CodeSize\"<\/span>: 325,\r\n    <span class=\"s2\">\"Description\"<\/span>: <span class=\"s2\">\"\"<\/span>,\r\n    <span class=\"s2\">\"Timeout\"<\/span>: 3,\r\n    <span class=\"s2\">\"MemorySize\"<\/span>: 128,\r\n    <span class=\"s2\">\"LastModified\"<\/span>: <span class=\"s2\">\"2023-04-23T05:57:03.340517+0000\"<\/span>,\r\n    <span class=\"s2\">\"CodeSha256\"<\/span>: <span class=\"s2\">\"c1MYsVaMfs4+EDf4IRHEVTtsD0X6CnwxI7OE2oqwN98=\"<\/span>,\r\n    <span class=\"s2\">\"Version\"<\/span>: <span class=\"s2\">\"<\/span><span class=\"nv\">$LATEST<\/span><span class=\"s2\">\"<\/span>,\r\n    <span class=\"s2\">\"TracingConfig\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"Mode\"<\/span>: <span class=\"s2\">\"PassThrough\"<\/span>\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"RevisionId\"<\/span>: <span class=\"s2\">\"a330e7cb-045e-488d-ac15-fec69a4abac2\"<\/span>,\r\n    <span class=\"s2\">\"State\"<\/span>: <span class=\"s2\">\"Pending\"<\/span>,\r\n    <span class=\"s2\">\"StateReason\"<\/span>: <span class=\"s2\">\"The function is being created.\"<\/span>,\r\n    <span class=\"s2\">\"StateReasonCode\"<\/span>: <span class=\"s2\">\"Creating\"<\/span>,\r\n    <span class=\"s2\">\"PackageType\"<\/span>: <span class=\"s2\">\"Zip\"<\/span>,\r\n    <span class=\"s2\">\"Architectures\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"s2\">\"x86_64\"<\/span>\r\n    <span class=\"o\">]<\/span>,\r\n    <span class=\"s2\">\"EphemeralStorage\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"Size\"<\/span>: 512\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"SnapStart\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"ApplyOn\"<\/span>: <span class=\"s2\">\"None\"<\/span>,\r\n        <span class=\"s2\">\"OptimizationStatus\"<\/span>: <span class=\"s2\">\"Off\"<\/span>\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"RuntimeVersionConfig\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"RuntimeVersionArn\"<\/span>: <span class=\"s2\">\"arn:aws:lambda:ap-northeast-1::runtime:8eeff65f6809a3ce81507fe733fe09b835899b99481ba22fd75b5a7338290ec1\"<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5728LocalStack\u4e2d\uff0c\u7531\u4e8eLambda\u662f\u5728\u5bb9\u5668\u4e2d\u7ba1\u7406\u7684\uff0c\u6240\u4ee5\u5728\u9996\u6b21\u8c03\u7528Lambda\u65f6\u53ef\u80fd\u9700\u8981\u82b1\u8d39\u65f6\u95f4\u6765\u4e0b\u8f7d\u6620\u50cf\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># Lambda\u3092\u5b9f\u884c\u3059\u308b<\/span>\r\nUbuntu@dev01:~\/workplace\/demo<span class=\"nv\">$ <\/span>aws <span class=\"nt\">--endpoint-url<\/span><span class=\"o\">=<\/span>http:\/\/localhost:4566 lambda invoke <span class=\"nt\">--function-name<\/span> demo-function outfile <span class=\"nt\">--profile<\/span> localstack\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"StatusCode\"<\/span>: 200,\r\n    <span class=\"s2\">\"ExecutedVersion\"<\/span>: <span class=\"s2\">\"<\/span><span class=\"nv\">$LATEST<\/span><span class=\"s2\">\"<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u5b89\u88c5AWS CLI Local<\/h2>\n<p>\u4f7f\u7528AWS CLI\u9700\u8981\u6307\u5b9a\u7aef\u70b9\u548c\u914d\u7f6e\u6587\u4ef6\uff0c\u4f46\u4f7f\u7528LocalStack AWS CLI\u53ef\u4ee5\u7701\u7565\u8fd9\u4e9b\u6b65\u9aa4\uff0c\u56e0\u6b64\u6211\u4eec\u4f1a\u8fdb\u884c\u5b89\u88c5\u3002<br \/>\nLocalStack AWS CLI- Github<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># pip\u7d4c\u7531\u3067\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u305f\u3081\u3001\u307e\u305apip\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/span>\r\nUbuntu@dev01:~\/workplace\/localstack<span class=\"nv\">$ <\/span><span class=\"nb\">sudo <\/span>apt <span class=\"nb\">install <\/span>python3-pip\r\nUbuntu@dev01:~\/workplace\/localstack<span class=\"nv\">$ <\/span>pip3 <span class=\"nb\">install <\/span>awscli-local\r\n\r\n<span class=\"c\"># awslocal\u30b3\u30de\u30f3\u30c9\u304c\u4f7f\u7528\u53ef\u80fd\u304b\u78ba\u8a8d<\/span>\r\nUbuntu@dev01:~\/workplace\/localstack<span class=\"nv\">$ <\/span>awslocal <span class=\"nt\">--version<\/span>\r\naws-cli\/2.11.15 Python\/3.11.3 Linux\/5.15.90.1-microsoft-standard-WSL2 exe\/x86_64.ubuntu.20 prompt\/off\r\n<\/code><\/pre>\n<p>\u4ece\u73b0\u5728\u5f00\u59cb\uff0c\u6211\u4eec\u5c06\u4f7f\u7528AWS CLI Local\uff08awslcoal\uff09\u8fdb\u884c\u64cd\u4f5c\u3002<\/p>\n<h1>\u4f7f\u7528\u65e0\u670d\u52a1\u5668\u67b6\u6784\u6784\u5efa\u7ffb\u8bd1Web API\u3002<\/h1>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d108f37434c4406bf1497\/43-0.png\" alt=\"AWS Hands-on for Beginners\u3088\u308a\u5f15\u7528\" \/><\/div>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u624b\u9806<\/ul>\n<\/li>\n<\/ul>\n<p>\u7ffb\u8a33API\u547c\u3073\u51fa\u3059Lambda\u3092\u4f5c\u6210\u3059\u308b\u3002<br \/>\n\u307f\u3093\u306a\u306e\u81ea\u52d5\u7ffb\u8a33API\u547c\u3073\u51fa\u3059Lambda\u3092\u4f5c\u6210\u3059\u308b(Node.js)<br \/>\nNode\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<br \/>\nLambda\u95a2\u6570\u306e\u4f5c\u6210\u3001\u30c7\u30d7\u30ed\u30a4\u3057\u3066\u30c6\u30b9\u30c8<br \/>\nAPI Gateway\u306e\u69cb\u7bc9<br \/>\nAPI Gateway\u306e\u69cb\u7bc9<\/p>\n<h2>\u521b\u5efa\u8c03\u7528DeppL API\u7684Lambda\u51fd\u6570<\/h2>\n<p>\u7531\u4e8e\u4fe1\u7528\u5361\u6ce8\u518c\u51fa\u73b0\u9891\u7e41\u9519\u8bef\uff0c\u6211\u611f\u5230\u7070\u5fc3\u4e27\u6c14\u3002<br \/>\n\u6211\u8fdb\u884c\u4e86\u4e00\u756a\u8c03\u67e5\uff0c\u53d1\u73b0\u5927\u5bb6\u7684\u81ea\u52a8\u7ffb\u8bd1\u5de5\u5177\u4f3c\u4e4e\u975e\u5e38\u6613\u4e8e\u4f7f\u7528\uff0c\u6240\u4ee5\u6211\u51b3\u5b9a\u5c1d\u8bd5\u4e00\u4e0b\u3002<\/p>\n<h2>\u521b\u5efa\u4e00\u4e2a\u8c03\u7528\u5927\u5bb6\u7684\u81ea\u52a8\u7ffb\u8bd1API\u7684Lambda\u51fd\u6570\uff08\u4f7f\u7528Node.js\uff09<\/h2>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d108f37434c4406bf1497\/48-0.png\" alt=\"aws-serverless-arch01.png\" \/><\/div>\n<p>\u5728Node.js\u4e2d\u521b\u5efaLambda\u51fd\u6570\u3002\u5982\u679c\u60f3\u8981\u5728Lambda\u4e2d\u4f7f\u7528\u5916\u90e8\u6a21\u5757\u5982requests\uff0c\u5c31\u9700\u8981\u521b\u5efaLambda\u5c42\u3002<\/p>\n<p>\u54ea\u6015\u662f\u3001\u3001\u3001<\/p>\n<p>\u5728LocalStack\u4e2d\uff0cLambda\u5c42\u662f\u4ed8\u8d39\u652f\u6301\u7684\uff0c\u56e0\u6b64\u672c\u6b21\u6211\u4eec\u4ec5\u4f7f\u7528Node.js\u7684\u6807\u51c6\u6a21\u5757\u8fdb\u884c\u521b\u5efa\uff01<br \/>\n\u53c2\u8003\uff1aLocalStack Lambda\u5c42<\/p>\n<h2>\u5b89\u88c5Node<\/h2>\n<p>\u8bf7\u6839\u636e\u8fd9\u4e2a\u9875\u9762\uff08Node.js \u5728Linux\u7684Windows\u5b50\u7cfb\u7edf\uff08WSL2\uff09\u4e0a\u5b89\u88c5\uff09\u8fdb\u884c\u5b89\u88c5\u3002<br \/>\n:::note warn<br \/>\n\u8bf7\u6ce8\u610f\uff0c\u76ee\u524d\u901a\u8fc7Ubuntu\u7684apt-get\u547d\u4ee4\u5b89\u88c5\u7684Node.js\u7248\u672c\u5df2\u7ecf\u8fc7\u671f\uff0c\u8bf7\u6ce8\u610f\u3002<br \/>\n\u5b89\u88c5Node.js\u5728Linux\u7684Windows\u5b50\u7cfb\u7edf\uff08WSL2\uff09\u4e0a\u3002<\/p>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/localstack<span class=\"nv\">$ <\/span><span class=\"nb\">cd<\/span> ..\/\r\nUbuntu@dev01:~\/workplace\/<span class=\"nv\">$ <\/span><span class=\"nb\">mkdir<\/span> .\/translate-function <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">cd<\/span> <span class=\"nv\">$_<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function<span class=\"nv\">$ <\/span><span class=\"nb\">mkdir <\/span>nodejs <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">cd<\/span> <span class=\"nv\">$_<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/nodejs<span class=\"nv\">$ <\/span>curl <span class=\"nt\">-o-<\/span> <span class=\"o\">[<\/span>https:\/\/raw.githubusercontent.com\/nvm-sh\/nvm\/master\/install.sh]<span class=\"o\">(<\/span>https:\/\/raw.githubusercontent.com\/nvm-sh\/nvm\/master\/install.sh<span class=\"o\">)<\/span> | bash\r\n% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\r\nDload  Upload   Total   Spent    Left  Speed\r\n100 15916  100 15916    0     0  46133      0 <span class=\"nt\">--<\/span>:--:-- <span class=\"nt\">--<\/span>:--:-- <span class=\"nt\">--<\/span>:--:-- 46267\r\n<span class=\"o\">=&gt;<\/span> Downloading nvm from git to <span class=\"s1\">'\/home\/Ubuntu\/.nvm'<\/span>\r\n<span class=\"o\">=&gt;<\/span> Cloning into <span class=\"s1\">'\/home\/Ubuntu\/.nvm'<\/span>...\r\nremote: Enumerating objects: 359, <span class=\"k\">done<\/span><span class=\"nb\">.<\/span>\r\nremote: Counting objects: 100% <span class=\"o\">(<\/span>359\/359<span class=\"o\">)<\/span>, <span class=\"k\">done<\/span><span class=\"nb\">.<\/span>\r\nremote: Compressing objects: 100% <span class=\"o\">(<\/span>305\/305<span class=\"o\">)<\/span>, <span class=\"k\">done<\/span><span class=\"nb\">.<\/span>\r\nremote: Total 359 <span class=\"o\">(<\/span>delta 40<span class=\"o\">)<\/span>, reused 168 <span class=\"o\">(<\/span>delta 28<span class=\"o\">)<\/span>, pack-reused 0\r\nReceiving objects: 100% <span class=\"o\">(<\/span>359\/359<span class=\"o\">)<\/span>, 219.46 KiB | 2.44 MiB\/s, <span class=\"k\">done<\/span><span class=\"nb\">.<\/span>\r\nResolving deltas: 100% <span class=\"o\">(<\/span>40\/40<span class=\"o\">)<\/span>, <span class=\"k\">done<\/span><span class=\"nb\">.<\/span>\r\n\r\n- <span class=\"o\">(<\/span>HEAD detached at FETCH_HEAD<span class=\"o\">)<\/span>\r\nmaster\r\n<span class=\"o\">=&gt;<\/span> Compressing and cleaning up git repository\r\n\r\n<span class=\"o\">=&gt;<\/span> Appending nvm <span class=\"nb\">source <\/span>string to \/home\/Ubuntu\/.bashrc\r\n<span class=\"o\">=&gt;<\/span> Appending bash_completion <span class=\"nb\">source <\/span>string to \/home\/Ubuntu\/.bashrc\r\n\/usr\/bin\/env: \u2018bash<span class=\"se\">\\r<\/span>\u2019: No such file or directory\r\n<span class=\"o\">=&gt;<\/span> Close and reopen your terminal to start using nvm or run the following to use it now:\r\n\r\n<span class=\"nb\">export <\/span><span class=\"nv\">NVM_DIR<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"<\/span><span class=\"nv\">$HOME<\/span><span class=\"s2\">\/.nvm\"<\/span>\r\n<span class=\"o\">[<\/span> <span class=\"nt\">-s<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$NVM_DIR<\/span><span class=\"s2\">\/nvm.sh\"<\/span> <span class=\"o\">]<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\.<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$NVM_DIR<\/span><span class=\"s2\">\/nvm.sh\"<\/span>  <span class=\"c\"># This loads nvm<\/span>\r\n<span class=\"o\">[<\/span> <span class=\"nt\">-s<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$NVM_DIR<\/span><span class=\"s2\">\/bash_completion\"<\/span> <span class=\"o\">]<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\.<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$NVM_DIR<\/span><span class=\"s2\">\/bash_completion\"<\/span>  <span class=\"c\"># This loads nvm bash_completion<\/span>\r\n\r\nUbuntu@dev01:~\/workplace\/translate-function\/nodejs<span class=\"nv\">$ <\/span><span class=\"nb\">export <\/span><span class=\"nv\">NVM_DIR<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"<\/span><span class=\"si\">$(<\/span><span class=\"o\">[<\/span> <span class=\"nt\">-z<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">XDG_CONFIG_HOME<\/span><span class=\"p\">-<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"o\">]<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">printf<\/span> %s <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">HOME<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/.nvm\"<\/span> <span class=\"o\">||<\/span> <span class=\"nb\">printf<\/span> %s <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">XDG_CONFIG_HOME<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/nvm\"<\/span><span class=\"si\">)<\/span><span class=\"s2\">\"<\/span>\r\n <span class=\"nt\">-s<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$NVM_DIR<\/span><span class=\"s2\">\/nvm.sh\"<\/span> <span class=\"o\">]<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\.<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$NVM_DIR<\/span><span class=\"s2\">\/nvm.sh\"<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>nvm <span class=\"nb\">install<\/span> <span class=\"nt\">--lts<\/span>\r\nInstalling latest LTS version.\r\nDownloading and installing node v18.16.0...\r\nDownloading https:\/\/nodejs.org\/dist\/v18.16.0\/node-v18.16.0-linux-x64.tar.xz...\r\n<span class=\"c\">############################################################################################################# 100.0%<\/span>\r\nComputing checksum with <span class=\"nb\">sha256sum\r\n<\/span>Checksums matched!\r\nNow using node v18.16.0 <span class=\"o\">(<\/span>npm v9.5.1<span class=\"o\">)<\/span>\r\nCreating default <span class=\"nb\">alias<\/span>: default -&gt; lts\/<span class=\"k\">*<\/span> <span class=\"o\">(<\/span>-&gt; v18.16.0<span class=\"o\">)<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>node <span class=\"nt\">-v<\/span>\r\nv18.16.0\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>npm <span class=\"nt\">-v<\/span>\r\n9.5.1\r\n\r\n<\/code><\/pre>\n<h2>\u521b\u5efaLambda\u51fd\u6570\u5e76\u90e8\u7f72\u548c\u6d4b\u8bd5\u3002<\/h2>\n<p>\u901a\u8fc7\u5c06VScode\u4e0eUbuntu\u8fdb\u884c\u8fdc\u7a0b\u8fde\u63a5\uff0c\u53ef\u4ee5\u987a\u5229\u8fdb\u884c\u7f16\u7801\u3002<br \/>\n\u53c2\u8003\uff1a\u5728Windows\u4e0a\u4f7f\u7528VS Code\u7684Remote-WSL\u529f\u80fd\uff0c\u8bbf\u95eeWSL2\u4e2d\u7684Ubuntu 20.04\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># nodejs\u914d\u4e0b\u3067\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059\u304c\u7279\u306b\u610f\u56f3\u306f\u3042\u308a\u307e\u305b\u3093<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span><span class=\"nb\">touch <\/span>translate.js\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">https<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">https<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">querystring<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">querystring<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">BASE_URL<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">https:\/\/mt-auto-minhon-mlt.ucri.jgn-x.jp<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u57fa\u5e95URL (https:\/\/xxx.jp\u307e\u3067\u3092\u5165\u529b)<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">API_KEY<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">***<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ API key<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">API_SECRET<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">***<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ API secret<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">LOGIN_ID<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">***<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u30ed\u30b0\u30a4\u30f3ID<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">API_NAME<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">mt<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ API\u540d (https:\/\/xxx.jp\/api\/mt\/generalNT_ja_en\/ \u306e\u5834\u5408\u306f\u3001\"mt\")<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">API_PARAM<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">generalNT_ja_en<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ API\u5024 (https:\/\/xxx.jp\/api\/mt\/generalNT_ja_en\/ \u306e\u5834\u5408\u306f\u3001\"generalNT_ja_en\")<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">callTranslateApi<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"nx\">accessToken<\/span><span class=\"p\">,<\/span> <span class=\"nx\">input_text<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">postData<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">querystring<\/span><span class=\"p\">.<\/span><span class=\"nf\">stringify<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">access_token<\/span><span class=\"p\">:<\/span> <span class=\"nx\">accessToken<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">API_KEY<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ API Key<\/span>\r\n    <span class=\"na\">api_name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">API_NAME<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">api_param<\/span><span class=\"p\">:<\/span> <span class=\"nx\">API_PARAM<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">LOGIN_ID<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u30ed\u30b0\u30a4\u30f3ID<\/span>\r\n    <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">json<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u30ec\u30b9\u30dd\u30f3\u30b9\u30bf\u30a4\u30d7<\/span>\r\n    <span class=\"na\">text<\/span><span class=\"p\">:<\/span> <span class=\"nx\">input_text<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u4ee5\u4e0b\u3001API\u3054\u3068\u306e\u30d1\u30e9\u30e1\u30fc\u30bf<\/span>\r\n  <span class=\"p\">});<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">options<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"na\">method<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">POST<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Content-Type<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">application\/x-www-form-urlencoded<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Content-Length<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"nx\">postData<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n  <span class=\"p\">};<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Promise<\/span><span class=\"p\">((<\/span><span class=\"nx\">resolve<\/span><span class=\"p\">,<\/span> <span class=\"nx\">reject<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">req<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">https<\/span><span class=\"p\">.<\/span><span class=\"nf\">request<\/span><span class=\"p\">(<\/span><span class=\"nx\">BASE_URL<\/span> <span class=\"o\">+<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/api\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">options<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"kd\">let<\/span> <span class=\"nx\">body<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">;<\/span>\r\n      <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">data<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">chunk<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">body<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">chunk<\/span><span class=\"p\">;<\/span>\r\n      <span class=\"p\">});<\/span>\r\n      <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">end<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">bodyJson<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nf\">parse<\/span><span class=\"p\">(<\/span><span class=\"nx\">body<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"kd\">const<\/span> <span class=\"nx\">output_text<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">bodyJson<\/span><span class=\"p\">.<\/span><span class=\"nx\">resultset<\/span><span class=\"p\">.<\/span><span class=\"nx\">result<\/span><span class=\"p\">.<\/span><span class=\"nx\">text<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"nf\">resolve<\/span><span class=\"p\">(<\/span><span class=\"nx\">output_text<\/span><span class=\"p\">);<\/span>\r\n      <span class=\"p\">});<\/span>\r\n    <span class=\"p\">});<\/span>\r\n    <span class=\"nx\">req<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">error<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nf\">reject<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">});<\/span>\r\n\r\n    <span class=\"nx\">req<\/span><span class=\"p\">.<\/span><span class=\"nf\">write<\/span><span class=\"p\">(<\/span><span class=\"nx\">postData<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"nx\">req<\/span><span class=\"p\">.<\/span><span class=\"nf\">end<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"p\">});<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">getAccessToken<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">tokenData<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">querystring<\/span><span class=\"p\">.<\/span><span class=\"nf\">stringify<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">grant_type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">client_credentials<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">client_id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">API_KEY<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ API Key<\/span>\r\n    <span class=\"na\">client_secret<\/span><span class=\"p\">:<\/span> <span class=\"nx\">API_SECRET<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ API secret<\/span>\r\n    <span class=\"na\">urlAccessToken<\/span><span class=\"p\">:<\/span> <span class=\"nx\">BASE_URL<\/span> <span class=\"o\">+<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/oauth2\/token.php<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3\u53d6\u5f97URI<\/span>\r\n  <span class=\"p\">});<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">tokenOptions<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"na\">method<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">POST<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Content-Type<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">application\/x-www-form-urlencoded<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Content-Length<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"nx\">tokenData<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n  <span class=\"p\">};<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Promise<\/span><span class=\"p\">((<\/span><span class=\"nx\">resolve<\/span><span class=\"p\">,<\/span> <span class=\"nx\">reject<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">tokenReq<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">https<\/span><span class=\"p\">.<\/span><span class=\"nf\">request<\/span><span class=\"p\">(<\/span>\r\n      <span class=\"nx\">BASE_URL<\/span> <span class=\"o\">+<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/oauth2\/token.php<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"nx\">tokenOptions<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">let<\/span> <span class=\"nx\">body<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">data<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">chunk<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n          <span class=\"nx\">body<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">chunk<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"p\">});<\/span>\r\n        <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">end<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n          <span class=\"kd\">const<\/span> <span class=\"nx\">accessToken<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nf\">parse<\/span><span class=\"p\">(<\/span><span class=\"nx\">body<\/span><span class=\"p\">).<\/span><span class=\"nx\">access_token<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3<\/span>\r\n          <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">accessToken<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Access token not found.<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\r\n            <span class=\"nf\">reject<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Error<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\r\n          <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"nf\">resolve<\/span><span class=\"p\">(<\/span><span class=\"nx\">accessToken<\/span><span class=\"p\">);<\/span>\r\n          <span class=\"p\">}<\/span>\r\n        <span class=\"p\">});<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"p\">);<\/span>\r\n\r\n    <span class=\"nx\">tokenReq<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">error<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nf\">reject<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">});<\/span>\r\n    <span class=\"nx\">tokenReq<\/span><span class=\"p\">.<\/span><span class=\"nf\">write<\/span><span class=\"p\">(<\/span><span class=\"nx\">tokenData<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"nx\">tokenReq<\/span><span class=\"p\">.<\/span><span class=\"nf\">end<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"p\">});<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"nx\">exports<\/span><span class=\"p\">.<\/span><span class=\"nx\">handler<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"nx\">event<\/span><span class=\"p\">,<\/span> <span class=\"nx\">context<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">INPUT_TEXT<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\u304a\u306f\u3088\u3046\u3054\u3056\u3044\u307e\u3059\u3002\u8abf\u5b50\u306f\u3069\u3046\u3067\u3059\u304b<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">accessToken<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">getAccessToken<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">OUTPUT_TEXT<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">callTranslateApi<\/span><span class=\"p\">(<\/span><span class=\"nx\">accessToken<\/span><span class=\"p\">,<\/span> <span class=\"nx\">INPUT_TEXT<\/span><span class=\"p\">);<\/span>\r\n\r\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">INPUT_TEXT : <\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">INPUT_TEXT<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">OUTPUT_TEXT : <\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">OUTPUT_TEXT<\/span><span class=\"p\">);<\/span>\r\n\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">statusCode<\/span><span class=\"p\">:<\/span> <span class=\"mi\">200<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Content-Type<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">application\/json<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">},<\/span>\r\n      <span class=\"na\">body<\/span><span class=\"p\">:<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nf\">stringify<\/span><span class=\"p\">({<\/span>\r\n        <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">success<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">OUTPUT_TEXT<\/span><span class=\"p\">:<\/span> <span class=\"nx\">OUTPUT_TEXT<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"p\">}),<\/span>\r\n    <span class=\"p\">};<\/span>\r\n\r\n    <span class=\"k\">return<\/span> <span class=\"nx\">response<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"p\">}<\/span> <span class=\"k\">catch <\/span><span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">.<\/span><span class=\"nx\">stack<\/span><span class=\"p\">);<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u5c06\u7f16\u5199\u597d\u7684translate.js\u6587\u4ef6\u538b\u7f29\u6210zip\u683c\u5f0f\uff0c\u7136\u540e\u90e8\u7f72\u5230Lambda\u51fd\u6570\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>zip translate.zip translate.js\r\nadding: translate.js <span class=\"o\">(<\/span>deflated 62%<span class=\"o\">)<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal lambda create-function <span class=\"nt\">--function-name<\/span> translateFunction01 <span class=\"nt\">--runtime<\/span> nodejs18.x <span class=\"nt\">--handler<\/span> translate.handler <span class=\"nt\">--zip-file<\/span> fileb:\/\/translate.zip <span class=\"nt\">--role<\/span> arn::iam::000000000000:role\/demo\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"FunctionName\"<\/span>: <span class=\"s2\">\"translateFunction01\"<\/span>,\r\n    <span class=\"s2\">\"FunctionArn\"<\/span>: <span class=\"s2\">\"arn:aws:lambda:us-east-1:000000000000:function:translateFunction01\"<\/span>,\r\n    <span class=\"s2\">\"Runtime\"<\/span>: <span class=\"s2\">\"nodejs18.x\"<\/span>,\r\n    <span class=\"s2\">\"Role\"<\/span>: <span class=\"s2\">\"arn::iam::000000000000:role\/demo\"<\/span>,\r\n    <span class=\"s2\">\"Handler\"<\/span>: <span class=\"s2\">\"translate.handler\"<\/span>,\r\n    <span class=\"s2\">\"CodeSize\"<\/span>: 1516,\r\n    <span class=\"s2\">\"Description\"<\/span>: <span class=\"s2\">\"\"<\/span>,\r\n    <span class=\"s2\">\"Timeout\"<\/span>: 3,\r\n    <span class=\"s2\">\"MemorySize\"<\/span>: 128,\r\n    <span class=\"s2\">\"LastModified\"<\/span>: <span class=\"s2\">\"2023-05-14T01:40:23.596074+0000\"<\/span>,\r\n    <span class=\"s2\">\"CodeSha256\"<\/span>: <span class=\"s2\">\"\/GgVaQ6xCUWytX6IzPI9QMXYDMVG5FrgdvebCwmwcEo=\"<\/span>,\r\n    <span class=\"s2\">\"Version\"<\/span>: <span class=\"s2\">\"<\/span><span class=\"nv\">$LATEST<\/span><span class=\"s2\">\"<\/span>,\r\n    <span class=\"s2\">\"TracingConfig\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"Mode\"<\/span>: <span class=\"s2\">\"PassThrough\"<\/span>\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"RevisionId\"<\/span>: <span class=\"s2\">\"f43c33e0-bcf0-460b-bca1-9cbdcc33efa0\"<\/span>,\r\n    <span class=\"s2\">\"State\"<\/span>: <span class=\"s2\">\"Pending\"<\/span>,\r\n    <span class=\"s2\">\"StateReason\"<\/span>: <span class=\"s2\">\"The function is being created.\"<\/span>,\r\n    <span class=\"s2\">\"StateReasonCode\"<\/span>: <span class=\"s2\">\"Creating\"<\/span>,\r\n    <span class=\"s2\">\"PackageType\"<\/span>: <span class=\"s2\">\"Zip\"<\/span>,\r\n    <span class=\"s2\">\"Architectures\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"s2\">\"x86_64\"<\/span>\r\n    <span class=\"o\">]<\/span>,\r\n    <span class=\"s2\">\"EphemeralStorage\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"Size\"<\/span>: 512\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"SnapStart\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"ApplyOn\"<\/span>: <span class=\"s2\">\"None\"<\/span>,\r\n        <span class=\"s2\">\"OptimizationStatus\"<\/span>: <span class=\"s2\">\"Off\"<\/span>\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"RuntimeVersionConfig\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"RuntimeVersionArn\"<\/span>: <span class=\"s2\">\"arn:aws:lambda:us-east-1::runtime:8eeff65f6809a3ce81507fe733fe09b835899b99481ba22fd75b5a7338290ec1\"<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4f60\u53ef\u4ee5\u4f7f\u7528lambda list-functions\u6765\u786e\u8ba4\u90e8\u7f72\u7684Lambda\u51fd\u6570\u3002\u53c2\u8003\uff1aLambda list-functions<\/p>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal lambda list-functions\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"Functions\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"FunctionName\"<\/span>: <span class=\"s2\">\"translateFunction\"<\/span>,\r\n            <span class=\"s2\">\"FunctionArn\"<\/span>: <span class=\"s2\">\"arn:aws:lambda:us-east-1:000000000000:function:translateFunction\"<\/span>,\r\n            <span class=\"s2\">\"Runtime\"<\/span>: <span class=\"s2\">\"nodejs18.x\"<\/span>,\r\n            <span class=\"s2\">\"Role\"<\/span>: <span class=\"s2\">\"arn::iam::000000000000:role\/demo\"<\/span>,\r\n            <span class=\"s2\">\"Handler\"<\/span>: <span class=\"s2\">\"translate.handler\"<\/span>,\r\n            <span class=\"s2\">\"CodeSize\"<\/span>: 1516,\r\n            <span class=\"s2\">\"Description\"<\/span>: <span class=\"s2\">\"\"<\/span>,\r\n            <span class=\"s2\">\"Timeout\"<\/span>: 3,\r\n            <span class=\"s2\">\"MemorySize\"<\/span>: 128,\r\n            <span class=\"s2\">\"LastModified\"<\/span>: <span class=\"s2\">\"2023-05-14T01:50:32.206828+0000\"<\/span>,\r\n            <span class=\"s2\">\"CodeSha256\"<\/span>: <span class=\"s2\">\"\/GgVaQ6xCUWytX6IzPI9QMXYDMVG5FrgdvebCwmwcEo=\"<\/span>,\r\n            <span class=\"s2\">\"Version\"<\/span>: <span class=\"s2\">\"<\/span><span class=\"nv\">$LATEST<\/span><span class=\"s2\">\"<\/span>,\r\n            <span class=\"s2\">\"TracingConfig\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"Mode\"<\/span>: <span class=\"s2\">\"PassThrough\"<\/span>\r\n            <span class=\"o\">}<\/span>,\r\n            <span class=\"s2\">\"RevisionId\"<\/span>: <span class=\"s2\">\"6b458364-8281-4d8c-89b5-c58f6513a692\"<\/span>,\r\n            <span class=\"s2\">\"PackageType\"<\/span>: <span class=\"s2\">\"Zip\"<\/span>,\r\n            <span class=\"s2\">\"Architectures\"<\/span>: <span class=\"o\">[<\/span>\r\n                <span class=\"s2\">\"x86_64\"<\/span>\r\n            <span class=\"o\">]<\/span>,\r\n            <span class=\"s2\">\"EphemeralStorage\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"Size\"<\/span>: 512\r\n            <span class=\"o\">}<\/span>,\r\n            <span class=\"s2\">\"SnapStart\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"ApplyOn\"<\/span>: <span class=\"s2\">\"None\"<\/span>,\r\n                <span class=\"s2\">\"OptimizationStatus\"<\/span>: <span class=\"s2\">\"Off\"<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">]<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u6211\u5c1d\u8bd5\u6267\u884c\u90e8\u7f72\u7684Lambda\u51fd\u6570\u3002<br \/>\n\u53c2\u8003\uff1aLambda\u8c03\u7528<\/p>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal lambda invoke <span class=\"nt\">--function-name<\/span> translateFunction outputfile.txt\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"StatusCode\"<\/span>: 200,\r\n    <span class=\"s2\">\"FunctionError\"<\/span>: <span class=\"s2\">\"Unhandled\"<\/span>,\r\n    <span class=\"s2\">\"ExecutedVersion\"<\/span>: <span class=\"s2\">\"<\/span><span class=\"nv\">$LATEST<\/span><span class=\"s2\">\"<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u51fa\u73b0\u4e86 FunctionError?\u200d\u2642\ufe0f<br \/>\n\u6211\u5c06\u68c0\u67e5\u8f93\u51fa\u7684outputfile.txt\u6587\u4ef6\u3002<br \/>\n\u53c2\u8003\uff1aNode.js\u7684AWS Lambda\u51fd\u6570\u9519\u8bef\u3002<\/p>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span><span class=\"nb\">cat <\/span>outputfile.txt\r\n<span class=\"o\">{<\/span><span class=\"s2\">\"errorMessage\"<\/span>:<span class=\"s2\">\"2023-05-14T02:25:34Z fa5edebc-c824-46f0-8283-3fc8c474c438 Task timed out after 3.00 seconds\"<\/span><span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u7531\u65bc\u51fa\u73fe\u8d85\u6642\u932f\u8aa4\uff0c\u6211\u5011\u5c07\u5c07 Lambda \u51fd\u6578\u7684\u57f7\u884c\u6642\u9593\u8a2d\u5b9a\u70ba 60 \u79d2\u4e26\u91cd\u65b0\u57f7\u884c ?\uff08\u9810\u8a2d\u57f7\u884c\u6642\u9593\u70ba 3 \u79d2\uff09\u3002<br \/>\n\u60a8\u53ef\u4ee5\u4f7f\u7528 update-function-configuration \u547d\u4ee4\u9032\u884c\u8a2d\u5b9a\u3002\u9664\u4e86\u57f7\u884c\u6642\u9593\u4e4b\u5916\uff0c\u60a8\u9084\u53ef\u4ee5\u66f4\u6539\u5167\u5b58\u5927\u5c0f\uff0c\u8a73\u60c5\u8acb\u53c3\u95b1\u4ee5\u4e0b\u9801\u9762\u3002<br \/>\n\u53c3\u8003\uff1aLambda update-function-configuration<\/p>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal lambda update-function-configuration <span class=\"nt\">--function-name<\/span> translateFunction <span class=\"nt\">--timeout<\/span> 60\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"FunctionName\"<\/span>: <span class=\"s2\">\"translateFunction\"<\/span>,\r\n    <span class=\"s2\">\"FunctionArn\"<\/span>: <span class=\"s2\">\"arn:aws:lambda:us-east-1:000000000000:function:translateFunction\"<\/span>,\r\n    <span class=\"s2\">\"Runtime\"<\/span>: <span class=\"s2\">\"nodejs18.x\"<\/span>,\r\n    <span class=\"s2\">\"Role\"<\/span>: <span class=\"s2\">\"arn::iam::000000000000:role\/demo\"<\/span>,\r\n    <span class=\"s2\">\"Handler\"<\/span>: <span class=\"s2\">\"translate.handler\"<\/span>,\r\n    <span class=\"s2\">\"CodeSize\"<\/span>: 1516,\r\n    <span class=\"s2\">\"Description\"<\/span>: <span class=\"s2\">\"\"<\/span>,\r\n    <span class=\"s2\">\"Timeout\"<\/span>: 60,\r\n    <span class=\"s2\">\"MemorySize\"<\/span>: 128,\r\n    <span class=\"s2\">\"LastModified\"<\/span>: <span class=\"s2\">\"2023-05-14T02:32:45.737909+0000\"<\/span>,\r\n    <span class=\"s2\">\"CodeSha256\"<\/span>: <span class=\"s2\">\"\/GgVaQ6xCUWytX6IzPI9QMXYDMVG5FrgdvebCwmwcEo=\"<\/span>,\r\n    <span class=\"s2\">\"Version\"<\/span>: <span class=\"s2\">\"<\/span><span class=\"nv\">$LATEST<\/span><span class=\"s2\">\"<\/span>,\r\n    <span class=\"s2\">\"TracingConfig\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"Mode\"<\/span>: <span class=\"s2\">\"PassThrough\"<\/span>\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"RevisionId\"<\/span>: <span class=\"s2\">\"327b9f37-5db2-447d-9114-1eeb3477c11c\"<\/span>,\r\n    <span class=\"s2\">\"State\"<\/span>: <span class=\"s2\">\"Active\"<\/span>,\r\n    <span class=\"s2\">\"LastUpdateStatus\"<\/span>: <span class=\"s2\">\"InProgress\"<\/span>,\r\n    <span class=\"s2\">\"LastUpdateStatusReason\"<\/span>: <span class=\"s2\">\"The function is being created.\"<\/span>,\r\n    <span class=\"s2\">\"LastUpdateStatusReasonCode\"<\/span>: <span class=\"s2\">\"Creating\"<\/span>,\r\n    <span class=\"s2\">\"PackageType\"<\/span>: <span class=\"s2\">\"Zip\"<\/span>,\r\n    <span class=\"s2\">\"Architectures\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"s2\">\"x86_64\"<\/span>\r\n    <span class=\"o\">]<\/span>,\r\n    <span class=\"s2\">\"EphemeralStorage\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"Size\"<\/span>: 512\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"SnapStart\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"ApplyOn\"<\/span>: <span class=\"s2\">\"None\"<\/span>,\r\n        <span class=\"s2\">\"OptimizationStatus\"<\/span>: <span class=\"s2\">\"Off\"<\/span>\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"RuntimeVersionConfig\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"RuntimeVersionArn\"<\/span>: <span class=\"s2\">\"arn:aws:lambda:us-east-1::runtime:8eeff65f6809a3ce81507fe733fe09b835899b99481ba22fd75b5a7338290ec1\"<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal lambda invoke <span class=\"nt\">--function-name<\/span> translateFunction   outputfile.txt\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"StatusCode\"<\/span>: 200,\r\n    <span class=\"s2\">\"ExecutedVersion\"<\/span>: <span class=\"s2\">\"<\/span><span class=\"nv\">$LATEST<\/span><span class=\"s2\">\"<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u7531\u4e8e\u66f4\u6539\u4e86\u6267\u884c\u65f6\u95f4\uff0cLambda\u51fd\u6570\u80fd\u591f\u6210\u529f\u6267\u884c\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u7ee7\u7eed\u68c0\u67e5\u8f93\u51fa\u7684\u65e5\u5fd7\u3002<br \/>\n\u53c2\u8003\uff1a\u4f7f\u7528\u547d\u4ee4\u884c\u6267\u884cAWS Lambda\u5e76\u5c06\u65e5\u5fd7\u8f93\u51fa\u5230\u6807\u51c6\u8f93\u51fa\u3002<\/p>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal lambda invoke <span class=\"nt\">--function-name<\/span> translateFunction <span class=\"nt\">--log-type<\/span> Tail outputfile.txt <span class=\"nt\">--query<\/span> <span class=\"s1\">'LogResult'<\/span> | <span class=\"nb\">tr<\/span> <span class=\"nt\">-d<\/span> <span class=\"s1\">'\"'<\/span> | <span class=\"nb\">base64<\/span> <span class=\"nt\">-d<\/span>\r\nSTART RequestId: 37d137f7-7503-464c-aa84-87db0bc383e6 Version: <span class=\"nv\">$LATEST<\/span>\r\n2023-05-14T02:39:27.955Z        37d137f7-7503-464c-aa84-87db0bc383e6    INFO    INPUT_TEXT : \u304a\u306f\u3088\u3046\u3054\u3056\u3044\u307e\u3059\u3002\u8abf\u5b50\u306f \u3069\u3046\u3067\u3059\u304b\r\n2023-05-14T02:39:27.957Z        37d137f7-7503-464c-aa84-87db0bc383e6    INFO    OUTPUT_TEXT : Good morning. How are you?\r\nEND RequestId: 37d137f7-7503-464c-aa84-87db0bc383e6\r\nREPORT RequestId: 37d137f7-7503-464c-aa84-87db0bc383e6  Duration: 4079.20 ms    Billed Duration: 4080 ms        Memory Size: 128 MB     Max Memory Used: 128 MB\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>\r\n<\/code><\/pre>\n<h2>\u642d\u5efaAPI\u7f51\u5173\u548cLambda\u7684\u534f\u540c\u8fde\u63a5\u3002<\/h2>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d108f37434c4406bf1497\/72-0.png\" alt=\"aws-serverless-arch01.png\" \/><\/div>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d108f37434c4406bf1497\/73-0.png\" alt=\"api-gateway.png\" \/><\/div>\n<h3>\u521b\u5efaREST API<\/h3>\n<p>\u5728 API Gateway \u4e2d\u521b\u5efa\u7684\u547d\u4ee4\u662f apigateway create-rest-api\u3002\u5728\u6267\u884c\u547d\u4ee4\u540e\u663e\u793a\u7684 id \u662f API \u7684\u6807\u8bc6\uff08\u8bf7\u6ce8\u610f\uff0c\u4e0d\u662f\u8d44\u6e90\u7684\u6807\u8bc6\uff09\u3002<\/p>\n<p>\u8bf7\u5145\u5206\u5229\u7528apigateway get-rest-apis\u547d\u4ee4\uff0c\u53ef\u4ee5\u4ee5\u5217\u8868\u5f62\u5f0f\u67e5\u770b\u5df2\u521b\u5efa\u7684API\u3002<\/p>\n<div>\u5982\u679c\u4e0d\u6307\u5b9aendpoint-configuration\uff0c\u5219\u9ed8\u8ba4\u4e3aEDGE\uff0c\u5728\u8fd9\u91cc\u6211\u4eec\u6307\u5b9a\u4e3aREGIONAL\u3002<\/div>\n<p>\u521b\u5efaREST API<br \/>\n20190514 AWS\u9ed1\u5e26\u5728\u7ebf\u7814\u8ba8\u4f1a \u4e9a\u9a6c\u900aAPI\u7f51\u5173<\/p>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal apigateway create-rest-api <span class=\"nt\">--name<\/span> translate-api <span class=\"nt\">--endpoint-configuration<\/span> <span class=\"nv\">types<\/span><span class=\"o\">=<\/span>REGIONAL\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"id\"<\/span>: <span class=\"s2\">\"hpvqgkbms0\"<\/span>,\r\n    <span class=\"s2\">\"name\"<\/span>: <span class=\"s2\">\"translate-api\"<\/span>,\r\n    <span class=\"s2\">\"createdDate\"<\/span>: <span class=\"s2\">\"2023-05-14T12:30:39+09:00\"<\/span>,\r\n    <span class=\"s2\">\"apiKeySource\"<\/span>: <span class=\"s2\">\"HEADER\"<\/span>,\r\n    <span class=\"s2\">\"endpointConfiguration\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"types\"<\/span>: <span class=\"o\">[<\/span>\r\n            <span class=\"s2\">\"REGIONAL\"<\/span>\r\n        <span class=\"o\">]<\/span>\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"disableExecuteApiEndpoint\"<\/span>: <span class=\"nb\">false<\/span>\r\n<span class=\"o\">}<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal apigateway get-rest-apis\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"items\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"id\"<\/span>: <span class=\"s2\">\"hpvqgkbms0\"<\/span>,\r\n            <span class=\"s2\">\"name\"<\/span>: <span class=\"s2\">\"translate-api\"<\/span>,\r\n            <span class=\"s2\">\"createdDate\"<\/span>: <span class=\"s2\">\"2023-05-14T12:30:39+09:00\"<\/span>,\r\n            <span class=\"s2\">\"apiKeySource\"<\/span>: <span class=\"s2\">\"HEADER\"<\/span>,\r\n            <span class=\"s2\">\"endpointConfiguration\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"types\"<\/span>: <span class=\"o\">[<\/span>\r\n                    <span class=\"s2\">\"REGIONAL\"<\/span>\r\n                <span class=\"o\">]<\/span>\r\n            <span class=\"o\">}<\/span>,\r\n            <span class=\"s2\">\"disableExecuteApiEndpoint\"<\/span>: <span class=\"nb\">false<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">]<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u521b\u5efa\u6d4b\u8bd5\u8d44\u6e90<\/h3>\n<p>\u521b\u5efa\u8d44\u6e90\u9700\u8981API ID\u548c\u6307\u5b9a\u7236\u8d44\u6e90ID\u7684\u4f4d\u7f6e\u3002<\/p>\n<div>\u4f7f\u7528apigateway get-resources &#8211;rest-api-id \u547d\u4ee4\u53ef\u4ee5\u67e5\u770b\u8d44\u6e90\u7684\u5217\u8868\u3002<\/div>\n<pre class=\"post-pre\"><code><span class=\"c\"># API ID\u3092\u78ba\u8a8d\u3059\u308b<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal apigateway get-rest-apis\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"items\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"id\"<\/span>: <span class=\"s2\">\"hpvqgkbms0\"<\/span>,\r\n            <span class=\"s2\">\"name\"<\/span>: <span class=\"s2\">\"translate-api\"<\/span>,\r\n            <span class=\"s2\">\"createdDate\"<\/span>: <span class=\"s2\">\"2023-05-14T12:30:39+09:00\"<\/span>,\r\n            <span class=\"s2\">\"apiKeySource\"<\/span>: <span class=\"s2\">\"HEADER\"<\/span>,\r\n            <span class=\"s2\">\"endpointConfiguration\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"types\"<\/span>: <span class=\"o\">[<\/span>\r\n                    <span class=\"s2\">\"REGIONAL\"<\/span>\r\n                <span class=\"o\">]<\/span>\r\n            <span class=\"o\">}<\/span>,\r\n            <span class=\"s2\">\"disableExecuteApiEndpoint\"<\/span>: <span class=\"nb\">false<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">]<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u786e\u8ba4\u8d44\u6e90ID\u3002\u5728\u521b\u5efaAPI\u4e4b\u540e\uff0c\u5c06\u4f1a\u521b\u5efa\u4e00\u4e2a\u8d44\u6e90\u3002\u65b0\u7684\u8d44\u6e90\u5c06\u88ab\u521b\u5efa\u5728\u73b0\u6709\u8d44\u6e90\u7684\u4e0b\u4e00\u7ea7\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># \u30ea\u30bd\u30fc\u30b9ID\u3092\u78ba\u8a8d\u3059\u308b<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal apigateway get-resources <span class=\"nt\">--rest-api-id<\/span> hpvqgkbms0\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"items\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"id\"<\/span>: <span class=\"s2\">\"55ezw5mmr6\"<\/span>,\r\n            <span class=\"s2\">\"path\"<\/span>: <span class=\"s2\">\"\/\"<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">]<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u7136\u540e\u4f7f\u7528apigateway create-resource\u547d\u4ee4\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a\/sample\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002<\/p>\n<div>\u4e3a\u4e86\u5728\u4e0b\u7ea7\u76ee\u5f55\u4e2d\u521b\u5efa\uff0c\u6307\u5b9a\u4e86\u7236\u8d44\u6e90ID\u7ed9parent-id\u3002<\/div>\n<p>\u53c2\u8003\uff1aapigateway \u521b\u5efa\u8d44\u6e90\u3002<\/p>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal apigateway create-resource <span class=\"nt\">--rest-api-id<\/span> hpvqgkbms0 <span class=\"nt\">--parent-id<\/span> 55ezw5mmr6 <span class=\"nt\">--path-part<\/span> sample\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"id\"<\/span>: <span class=\"s2\">\"zqgeelqr0b\"<\/span>,\r\n    <span class=\"s2\">\"parentId\"<\/span>: <span class=\"s2\">\"55ezw5mmr6\"<\/span>,\r\n    <span class=\"s2\">\"pathPart\"<\/span>: <span class=\"s2\">\"sample\"<\/span>,\r\n    <span class=\"s2\">\"path\"<\/span>: <span class=\"s2\">\"\/sample\"<\/span>\r\n<span class=\"o\">}<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal apigateway get-resources <span class=\"nt\">--rest-api-id<\/span> hpvqgkbms0\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"items\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"id\"<\/span>: <span class=\"s2\">\"55ezw5mmr6\"<\/span>,\r\n            <span class=\"s2\">\"path\"<\/span>: <span class=\"s2\">\"\/\"<\/span>\r\n        <span class=\"o\">}<\/span>,\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"id\"<\/span>: <span class=\"s2\">\"zqgeelqr0b\"<\/span>,\r\n            <span class=\"s2\">\"parentId\"<\/span>: <span class=\"s2\">\"55ezw5mmr6\"<\/span>,\r\n            <span class=\"s2\">\"pathPart\"<\/span>: <span class=\"s2\">\"sample\"<\/span>,\r\n            <span class=\"s2\">\"path\"<\/span>: <span class=\"s2\">\"\/sample\"<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">]<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4f7f\u7528apigateway put-method\u547d\u4ee4\u5728\/sample\u8d44\u6e90\u4e2d\u6dfb\u52a0GET\u65b9\u6cd5\u3002<br \/>\n\u53c2\u8003\uff1aAPI Gateway put-method<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># API ID\u3092\u78ba\u8a8d\u3059\u308b<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span> awslocal apigateway get-rest-apis\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"items\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"id\"<\/span>: <span class=\"s2\">\"hpvqgkbms0\"<\/span>,\r\n            <span class=\"s2\">\"name\"<\/span>: <span class=\"s2\">\"translate-api\"<\/span>,\r\n            <span class=\"s2\">\"createdDate\"<\/span>: <span class=\"s2\">\"2023-05-14T12:30:39+09:00\"<\/span>,\r\n            <span class=\"s2\">\"apiKeySource\"<\/span>: <span class=\"s2\">\"HEADER\"<\/span>,\r\n            <span class=\"s2\">\"endpointConfiguration\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"types\"<\/span>: <span class=\"o\">[<\/span>\r\n                    <span class=\"s2\">\"REGIONAL\"<\/span>\r\n                <span class=\"o\">]<\/span>\r\n            <span class=\"o\">}<\/span>,\r\n            <span class=\"s2\">\"disableExecuteApiEndpoint\"<\/span>: <span class=\"nb\">false<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">]<\/span>\r\n<span class=\"o\">}<\/span>\r\n<span class=\"c\"># GET\u30e1\u30bd\u30c3\u30c9\u306e\u8ffd\u52a0<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal apigateway put-method  <span class=\"nt\">--rest-api-id<\/span> hpvqgkbms0 <span class=\"nt\">--resource-id<\/span> zqgeelqr0b <span class=\"nt\">--http-method<\/span> GET <span class=\"nt\">--authorization-type<\/span> NONE\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"httpMethod\"<\/span>: <span class=\"s2\">\"GET\"<\/span>,\r\n    <span class=\"s2\">\"authorizationType\"<\/span>: <span class=\"s2\">\"NONE\"<\/span>,\r\n    <span class=\"s2\">\"apiKeyRequired\"<\/span>: <span class=\"nb\">false<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<span class=\"c\"># \/sample\u30ea\u30bd\u30fc\u30b9\u306bGET\u30e1\u30bd\u30c3\u30c9\u304c\u8ffd\u52a0\u3067\u304d\u305f\u3053\u3068\u3092\u78ba\u8a8d\u3059\u308b<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span> awslocal apigateway get-resources <span class=\"nt\">--rest-api-id<\/span> hpvqgkbms0\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"items\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"id\"<\/span>: <span class=\"s2\">\"55ezw5mmr6\"<\/span>,\r\n            <span class=\"s2\">\"path\"<\/span>: <span class=\"s2\">\"\/\"<\/span>\r\n        <span class=\"o\">}<\/span>,\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"id\"<\/span>: <span class=\"s2\">\"zqgeelqr0b\"<\/span>,\r\n            <span class=\"s2\">\"parentId\"<\/span>: <span class=\"s2\">\"55ezw5mmr6\"<\/span>,\r\n            <span class=\"s2\">\"pathPart\"<\/span>: <span class=\"s2\">\"sample\"<\/span>,\r\n            <span class=\"s2\">\"path\"<\/span>: <span class=\"s2\">\"\/sample\"<\/span>,\r\n            <span class=\"s2\">\"resourceMethods\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"GET\"<\/span>: <span class=\"o\">{<\/span>\r\n                    <span class=\"s2\">\"httpMethod\"<\/span>: <span class=\"s2\">\"GET\"<\/span>,\r\n                    <span class=\"s2\">\"authorizationType\"<\/span>: <span class=\"s2\">\"NONE\"<\/span>,\r\n                    <span class=\"s2\">\"apiKeyRequired\"<\/span>: <span class=\"nb\">false<\/span>,\r\n                    <span class=\"s2\">\"methodResponses\"<\/span>: <span class=\"o\">{}<\/span>\r\n                <span class=\"o\">}<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">]<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8fd9\u6837\uff0c\u60a8\u53ef\u4ee5\u4ece\u5ba2\u6237\u7aef\u5411\/sample\u8d44\u6e90\u53d1\u9001GET\u8bf7\u6c42\u3002\u7136\u540e\uff0c\u4f7f\u7528put-integration\u547d\u4ee4\u6765\u5b9a\u4e49\u96c6\u6210\u8bf7\u6c42\uff08\u5373\u4eceAPI\u7f51\u5173\u53d1\u9001\u8bf7\u6c42\u5230\u540e\u7aef\uff0c\u5e76\u6307\u5b9a\u540e\u7aef\uff09\u3002\u4e3a\u4e86\u6d4b\u8bd5\u76ee\u7684\uff0c\u6211\u4eec\u6682\u65f6\u5c06&#8211;type\u8bbe\u7f6e\u4e3aMOCK\uff0c\u5e76\u56fa\u5b9a\u54cd\u5e94\u3002<br \/>\n\u53c2\u8003\uff1a<br \/>\nAPI\u7f51\u5173put-integration\u547d\u4ee4<br \/>\nAPI\u96c6\u6210\u8bf7\u6c42\u7684\u57fa\u672c\u4efb\u52a1<\/p>\n<div>\u5728Windows\u547d\u4ee4\u63d0\u793a\u7b26\u4e2d\uff0c\u9700\u8981\u8f6c\u4e49\u5f15\u53f7\u3002\u66f4\u591a\u8be6\u7ec6\u4fe1\u606f\u8bf7\u53c2\u89c1\u4ee5\u4e0b\u9875\u9762\u3002<br \/>\n\u53c2\u8003\uff1a\u5728AWS CLI\u4e2d\u4f7f\u7528\u5f15\u53f7\u7684\u5b57\u7b26\u4e32<\/div>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal apigateway put-integration <span class=\"nt\">--rest-api-id<\/span> hpvqgkbms0 <span class=\"nt\">--resource-id<\/span> zqgeelqr0b <span class=\"nt\">--http-method<\/span> GET <span class=\"nt\">--type<\/span> MOCK <span class=\"nt\">--request-template<\/span> <span class=\"s1\">'{\"application\/json\" : \"{\\\"report_id\\\": \\\"1\\\", \\\"report_title\\\": \\\"Hello World\\\"}\"}'<\/span>\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"type\"<\/span>: <span class=\"s2\">\"MOCK\"<\/span>,\r\n    <span class=\"s2\">\"requestParameters\"<\/span>: <span class=\"o\">{}<\/span>,\r\n    <span class=\"s2\">\"requestTemplates\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"application\/json\"<\/span>: <span class=\"s2\">\"{<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">report_id<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">: <\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">1<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">, <\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">report_title<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">: <\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">Hello World<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">}\"<\/span>\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"cacheNamespace\"<\/span>: <span class=\"s2\">\"zqgeelqr0b\"<\/span>,\r\n    <span class=\"s2\">\"cacheKeyParameters\"<\/span>: <span class=\"o\">[]<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u90e8\u7f72\u4e4b\u524d\uff0c\u4f7f\u7528apigateway test-invoke-method\u547d\u4ee4\u8fdb\u884c\u6d4b\u8bd5?\u3002<\/p>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal apigateway test-invoke-method <span class=\"nt\">--rest-api-id<\/span> hpvqgkbms0 <span class=\"nt\">--resource-id<\/span> zqgeelqr0b <span class=\"nt\">--http-method<\/span> GET | jq <span class=\"nb\">.<\/span>\r\n<span class=\"o\">{<\/span>\r\n  <span class=\"s2\">\"status\"<\/span>: 200,\r\n  <span class=\"s2\">\"body\"<\/span>: <span class=\"s2\">\"{<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">report_id<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">: <\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">1<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">, <\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">report_title<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">: <\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">Hello World<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">}\"<\/span>,\r\n  <span class=\"s2\">\"headers\"<\/span>: <span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"Host\"<\/span>: <span class=\"s2\">\"localhost:4566\"<\/span>,\r\n    <span class=\"s2\">\"Accept-Encoding\"<\/span>: <span class=\"s2\">\"identity\"<\/span>,\r\n    <span class=\"s2\">\"Content-Type\"<\/span>: <span class=\"s2\">\"application\/json\"<\/span>,\r\n    <span class=\"s2\">\"User-Agent\"<\/span>: <span class=\"s2\">\"aws-cli\/2.11.15 Python\/3.11.3 Linux\/5.15.90.1-microsoft-standard-WSL2 exe\/x86_64.ubuntu.20 prompt\/off command\/apigateway.test-invoke-method\"<\/span>,\r\n    <span class=\"s2\">\"Accept\"<\/span>: <span class=\"s2\">\"application\/json\"<\/span>,\r\n    <span class=\"s2\">\"X-Amz-Date\"<\/span>: <span class=\"s2\">\"20230514T113523Z\"<\/span>,\r\n    <span class=\"s2\">\"Authorization\"<\/span>: <span class=\"s2\">\"AWS4-HMAC-SHA256 Credential=test\/20230514\/us-east-1\/apigateway\/aws4_request, SignedHeaders=accept;content-type;host;x-amz-date, Signature=37de1d70843bf497460854f3f549fec76ee7ebf947b9d545f7b8847c70da07cc\"<\/span>,\r\n    <span class=\"s2\">\"Content-Length\"<\/span>: <span class=\"s2\">\"2\"<\/span>,\r\n    <span class=\"s2\">\"x-localstack-tgt-api\"<\/span>: <span class=\"s2\">\"apigateway\"<\/span>,\r\n    <span class=\"s2\">\"x-moto-account-id\"<\/span>: <span class=\"s2\">\"000000000000\"<\/span>,\r\n    <span class=\"s2\">\"X-Forwarded-For\"<\/span>: <span class=\"s2\">\"172.20.0.1, localhost:4566\"<\/span>,\r\n    <span class=\"s2\">\"x-localstack-edge\"<\/span>: <span class=\"s2\">\"http:\/\/localhost:4566\"<\/span>\r\n  <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4f7f\u7528apigateway create-deployment\u547d\u4ee4\u521b\u5efa\u4e00\u4e2a\u9636\u6bb5\uff08\u5728\u6b64\u5904\u4e3adev\uff09\uff0c\u4ee5\u53d1\u5e03API\u3002<br \/>\n\u53c2\u8003\uff1aAPI create-deployment<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># API ID\u3092\u78ba\u8a8d<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal apigateway get-rest-apis\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"items\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"id\"<\/span>: <span class=\"s2\">\"hpvqgkbms0\"<\/span>,\r\n            <span class=\"s2\">\"name\"<\/span>: <span class=\"s2\">\"translate-api\"<\/span>,\r\n            <span class=\"s2\">\"createdDate\"<\/span>: <span class=\"s2\">\"2023-05-14T12:30:39+09:00\"<\/span>,\r\n            <span class=\"s2\">\"apiKeySource\"<\/span>: <span class=\"s2\">\"HEADER\"<\/span>,\r\n            <span class=\"s2\">\"endpointConfiguration\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"types\"<\/span>: <span class=\"o\">[<\/span>\r\n                    <span class=\"s2\">\"REGIONAL\"<\/span>\r\n                <span class=\"o\">]<\/span>\r\n            <span class=\"o\">}<\/span>,\r\n            <span class=\"s2\">\"disableExecuteApiEndpoint\"<\/span>: <span class=\"nb\">false<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">]<\/span>\r\n<span class=\"o\">}<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal apigateway create-deployment <span class=\"nt\">--rest-api-id<\/span> hpvqgkbms0 <span class=\"nt\">--stage-name<\/span> dev\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"id\"<\/span>: <span class=\"s2\">\"yxoalhr8v5\"<\/span>,\r\n    <span class=\"s2\">\"createdDate\"<\/span>: <span class=\"s2\">\"2023-05-14T20:31:55+09:00\"<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u7531\u4e8e\u90e8\u7f72\u5df2\u5b8c\u6210\uff0c\u6211\u5c06\u8c03\u7528API\u4ee5\u786e\u8ba4\u662f\u5426\u8fd4\u56de\u54cd\u5e94\u3002<\/p>\n<div>LocalStack\u7684API Gateway\u7684\u9ed8\u8ba4\u7aef\u70b9\u4e3ahttp:\/\/localhost:4566\/restapis\/\/&lt;\u9636\u6bb5\u540d\u79f0&gt;\/_user_request_\/&lt;\u8d44\u6e90\u540d\u79f0&gt;\u3002<br \/>\n\u53c2\u8003\uff1aLocalStack\u4e9a\u9a6c\u900a API Gateway<\/div>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>curl <span class=\"nt\">-X<\/span> GET http:\/\/localhost:4566\/restapis\/hpvqgkbms0\/dev\/_user_request_\/sample\r\n<span class=\"o\">{<\/span><span class=\"s2\">\"report_id\"<\/span>: <span class=\"s2\">\"1\"<\/span>, <span class=\"s2\">\"report_title\"<\/span>: <span class=\"s2\">\"Hello World\"<\/span><span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d108f37434c4406bf1497\/102-0.png\" alt=\"brows-api.png\" \/><\/div>\n<h3>\u521b\u5efa\u7ffb\u8bd1\u8d44\u6e90<\/h3>\n<p>\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86API\u6d4b\u8bd5\u7684\u6267\u884c\uff0c\u63a5\u4e0b\u6765\u5c06\u5f00\u59cb\u521b\u5efatranslate\u8d44\u6e90\uff01<\/p>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal apigateway create-resource <span class=\"nt\">--rest-api-id<\/span> hpvqgkbms0 <span class=\"nt\">--parent-id<\/span> 55ezw5mmr6 <span class=\"nt\">--path-part<\/span> translate\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"id\"<\/span>: <span class=\"s2\">\"2ebfoxwva3\"<\/span>,\r\n    <span class=\"s2\">\"parentId\"<\/span>: <span class=\"s2\">\"55ezw5mmr6\"<\/span>,\r\n    <span class=\"s2\">\"pathPart\"<\/span>: <span class=\"s2\">\"translate\"<\/span>,\r\n    <span class=\"s2\">\"path\"<\/span>: <span class=\"s2\">\"\/translate\"<\/span>\r\n<span class=\"o\">}<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal apigateway put-method <span class=\"nt\">--rest-api-id<\/span> hpvqgkbms0 -\r\n<span class=\"nt\">-resource-id<\/span> 2ebfoxwva3 <span class=\"nt\">--http-method<\/span> GET <span class=\"nt\">--authorization-type<\/span> NONE\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"httpMethod\"<\/span>: <span class=\"s2\">\"GET\"<\/span>,\r\n    <span class=\"s2\">\"authorizationType\"<\/span>: <span class=\"s2\">\"NONE\"<\/span>,\r\n    <span class=\"s2\">\"apiKeyRequired\"<\/span>: <span class=\"nb\">false<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5728API Gateway\u4e2d\uff0c\u6211\u4eec\u5c06\u4e3a\u8d44\u6e90\u6dfb\u52a0GET\u65b9\u6cd5\uff0c\u5e76\u4f7f\u7528&#8211;request-parameters\u547d\u4ee4\u6765\u63a5\u53d7input_text\u53c2\u6570\u3002<\/p>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal apigateway put-method  <span class=\"nt\">--rest-api-id<\/span> hpvqgkbms0\r\n<span class=\"nt\">--resource-id<\/span> 2ebfoxwva3 <span class=\"nt\">--http-method<\/span> GET <span class=\"nt\">--authorization-type<\/span> NONE  <span class=\"nt\">--request-parameters<\/span> <span class=\"s2\">\"{<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">method.request.querystrin\r\ng.input_text<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">: true}\"<\/span>\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"httpMethod\"<\/span>: <span class=\"s2\">\"GET\"<\/span>,\r\n    <span class=\"s2\">\"authorizationType\"<\/span>: <span class=\"s2\">\"NONE\"<\/span>,\r\n    <span class=\"s2\">\"apiKeyRequired\"<\/span>: <span class=\"nb\">false<\/span>,\r\n    <span class=\"s2\">\"requestParameters\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"method.request.querystring.input_text\"<\/span>: <span class=\"nb\">true<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u8fdb\u884c\u96c6\u6210\u8bf7\u6c42\u7684\u914d\u7f6e\u3002\u5728\u8fd9\u91cc\uff0c\u60a8\u9700\u8981\u4f7f\u7528&#8211;type AWS_PROXY\u5c06\u540e\u7aef\u96c6\u6210\u5230Lambda\u51fd\u6570\uff0c\u5e76\u4f7f\u7528&#8211;uri\u6307\u5b9a\u8981\u96c6\u6210\u7684Lambda\u51fd\u6570\u7684ARN\u3002<\/p>\n<p>\u53c2\u8003\uff1aAPI Gateway put-integration &#8211;type<\/p>\n<div>\u6307\u5b9aLambda\u9009\u9879\u547d\u4ee4\u662f&#8211;uri\u3002\u503c\u4e3aarn:aws:apigateway:us-east-1:lambda:path\/2015-03-31\/functions\/\/invocations\uff0c\u5728LocalStack\u4e2d\u5b83\u662f\u56fa\u5b9a\u7684\u3002\u53c2\u8003\uff1aLocalStack API Gateway &#8211;uri<\/div>\n<pre class=\"post-pre\"><code><span class=\"c\"># \u7d71\u5408\u3057\u305f\u3044Lambda\u95a2\u6570\u306eARN\u3092\u78ba\u8a8d\u3057\u307e\u3059<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span> awslocal lambda get-function <span class=\"nt\">--function-name<\/span> translateFunction\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"Configuration\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"FunctionName\"<\/span>: <span class=\"s2\">\"translateFunction\"<\/span>,\r\n        <span class=\"s2\">\"FunctionArn\"<\/span>: <span class=\"s2\">\"arn:aws:lambda:us-east-1:000000000000:function:translateFunction\"<\/span>,\r\n        <span class=\"s2\">\"Runtime\"<\/span>: <span class=\"s2\">\"nodejs18.x\"<\/span>,\r\n        <span class=\"s2\">\"Role\"<\/span>: <span class=\"s2\">\"arn::iam::000000000000:role\/demo\"<\/span>,\r\n        <span class=\"s2\">\"Handler\"<\/span>: <span class=\"s2\">\"translate.handler\"<\/span>,\r\n        <span class=\"s2\">\"CodeSize\"<\/span>: 1504,\r\n        <span class=\"s2\">\"Description\"<\/span>: <span class=\"s2\">\"\"<\/span>,\r\n        <span class=\"s2\">\"Timeout\"<\/span>: 60,\r\n        <span class=\"s2\">\"MemorySize\"<\/span>: 128,\r\n        <span class=\"s2\">\"LastModified\"<\/span>: <span class=\"s2\">\"2023-05-14T02:39:20.431503+0000\"<\/span>,\r\n        <span class=\"s2\">\"CodeSha256\"<\/span>: <span class=\"s2\">\"GQG2B5diM6Pe1+yZ7MkxoINkq25iX07DF1d\/Co9WZpM=\"<\/span>,\r\n        <span class=\"s2\">\"Version\"<\/span>: <span class=\"s2\">\"<\/span><span class=\"nv\">$LATEST<\/span><span class=\"s2\">\"<\/span>,\r\n        <span class=\"s2\">\"TracingConfig\"<\/span>: <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"Mode\"<\/span>: <span class=\"s2\">\"PassThrough\"<\/span>\r\n        <span class=\"o\">}<\/span>,\r\n        <span class=\"s2\">\"RevisionId\"<\/span>: <span class=\"s2\">\"9d5a5a51-dcaa-49f1-8103-a0fb39964d59\"<\/span>,\r\n        <span class=\"s2\">\"State\"<\/span>: <span class=\"s2\">\"Active\"<\/span>,\r\n        <span class=\"s2\">\"LastUpdateStatus\"<\/span>: <span class=\"s2\">\"Successful\"<\/span>,\r\n        <span class=\"s2\">\"PackageType\"<\/span>: <span class=\"s2\">\"Zip\"<\/span>,\r\n        <span class=\"s2\">\"Architectures\"<\/span>: <span class=\"o\">[<\/span>\r\n            <span class=\"s2\">\"x86_64\"<\/span>\r\n        <span class=\"o\">]<\/span>,\r\n        <span class=\"s2\">\"EphemeralStorage\"<\/span>: <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"Size\"<\/span>: 512\r\n        <span class=\"o\">}<\/span>,\r\n        <span class=\"s2\">\"SnapStart\"<\/span>: <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"ApplyOn\"<\/span>: <span class=\"s2\">\"None\"<\/span>,\r\n            <span class=\"s2\">\"OptimizationStatus\"<\/span>: <span class=\"s2\">\"Off\"<\/span>\r\n        <span class=\"o\">}<\/span>,\r\n        <span class=\"s2\">\"RuntimeVersionConfig\"<\/span>: <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"RuntimeVersionArn\"<\/span>: <span class=\"s2\">\"arn:aws:lambda:us-east-1::runtime:8eeff65f6809a3ce81507fe733fe09b835899b99481ba22fd75b5a7338290ec1\"<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"Code\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"RepositoryType\"<\/span>: <span class=\"s2\">\"S3\"<\/span>,\r\n        <span class=\"s2\">\"Location\"<\/span>: <span class=\"s2\">\"http:\/\/s3.localhost.localstack.cloud:4566\/awslambda-us-east-1-tasks\/snapshots\/000000000000\/translateFunction-e510ad6d-bc56-4bb9-bf13-b21b2ed9dcd6?AWSAccessKeyId=000000000000&amp;Signature=aKGyEdrwShjbF6AQIuWyuu5ufTg%3D&amp;Expires=1684073259\"<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal apigateway put-integration <span class=\"nt\">--rest-api-id<\/span> hpvqgkbms0 <span class=\"nt\">--resource-id<\/span> 2ebfoxwva3 <span class=\"nt\">--http-method<\/span> GET <span class=\"nt\">--integration-http-method<\/span> GET <span class=\"nt\">--type<\/span> AWS_PROXY <span class=\"nt\">--uri<\/span> arn:aws:apigateway:us-east-1:lambda:path\/2015-03-31\/functions\/arn:aws:lambda:us-east-1:000000000000:function:translateFunction\/invocations\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"type\"<\/span>: <span class=\"s2\">\"AWS_PROXY\"<\/span>,\r\n    <span class=\"s2\">\"httpMethod\"<\/span>: <span class=\"s2\">\"GET\"<\/span>,\r\n    <span class=\"s2\">\"uri\"<\/span>: <span class=\"s2\">\"arn:aws:apigateway:us-east-1:lambda:path\/2015-03-31\/functions\/arn:aws:lambda:us-east-1:000000000000:function:translateFunction\/invocations\"<\/span>,\r\n    <span class=\"s2\">\"requestParameters\"<\/span>: <span class=\"o\">{}<\/span>,\r\n    <span class=\"s2\">\"cacheNamespace\"<\/span>: <span class=\"s2\">\"2ebfoxwva3\"<\/span>,\r\n    <span class=\"s2\">\"cacheKeyParameters\"<\/span>: <span class=\"o\">[]<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5728Lambda\u51fd\u6570\u4e2d\uff0c\u6211\u5c06\u8fdb\u884c\u4fee\u6539\u4ee5\u63a5\u6536\u53c2\u6570\u3002(https:\/\/maku.blog\/p\/5mv5dkt\/)<\/p>\n<pre class=\"post-pre\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">https<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">https<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">querystring<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">querystring<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">BASE_URL<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">https:\/\/mt-auto-minhon-mlt.ucri.jgn-x.jp<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u57fa\u5e95URL (https:\/\/xxx.jp\u307e\u3067\u3092\u5165\u529b)<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">API_KEY<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">***<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ API key<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">API_SECRET<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">***<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ API secret<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">LOGIN_ID<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">***<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u30ed\u30b0\u30a4\u30f3ID<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">API_NAME<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">mt<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ API\u540d (https:\/\/xxx.jp\/api\/mt\/generalNT_ja_en\/ \u306e\u5834\u5408\u306f\u3001\"mt\")<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">API_PARAM<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">generalNT_ja_en<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ API\u5024 (https:\/\/xxx.jp\/api\/mt\/generalNT_ja_en\/ \u306e\u5834\u5408\u306f\u3001\"generalNT_ja_en\")<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">callTranslateApi<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"nx\">accessToken<\/span><span class=\"p\">,<\/span> <span class=\"nx\">input_text<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">postData<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">querystring<\/span><span class=\"p\">.<\/span><span class=\"nf\">stringify<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">access_token<\/span><span class=\"p\">:<\/span> <span class=\"nx\">accessToken<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">API_KEY<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ API Key<\/span>\r\n    <span class=\"na\">api_name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">API_NAME<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">api_param<\/span><span class=\"p\">:<\/span> <span class=\"nx\">API_PARAM<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">LOGIN_ID<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u30ed\u30b0\u30a4\u30f3ID<\/span>\r\n    <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">json<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u30ec\u30b9\u30dd\u30f3\u30b9\u30bf\u30a4\u30d7<\/span>\r\n    <span class=\"na\">text<\/span><span class=\"p\">:<\/span> <span class=\"nx\">input_text<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u4ee5\u4e0b\u3001API\u3054\u3068\u306e\u30d1\u30e9\u30e1\u30fc\u30bf<\/span>\r\n  <span class=\"p\">});<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">options<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"na\">method<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">POST<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Content-Type<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">application\/x-www-form-urlencoded<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Content-Length<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"nx\">postData<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n  <span class=\"p\">};<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Promise<\/span><span class=\"p\">((<\/span><span class=\"nx\">resolve<\/span><span class=\"p\">,<\/span> <span class=\"nx\">reject<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">req<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">https<\/span><span class=\"p\">.<\/span><span class=\"nf\">request<\/span><span class=\"p\">(<\/span><span class=\"nx\">BASE_URL<\/span> <span class=\"o\">+<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/api\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">options<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"kd\">let<\/span> <span class=\"nx\">body<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">;<\/span>\r\n      <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">data<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">chunk<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">body<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">chunk<\/span><span class=\"p\">;<\/span>\r\n      <span class=\"p\">});<\/span>\r\n      <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">end<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">bodyJson<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nf\">parse<\/span><span class=\"p\">(<\/span><span class=\"nx\">body<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"kd\">const<\/span> <span class=\"nx\">output_text<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">bodyJson<\/span><span class=\"p\">.<\/span><span class=\"nx\">resultset<\/span><span class=\"p\">.<\/span><span class=\"nx\">result<\/span><span class=\"p\">.<\/span><span class=\"nx\">text<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"nf\">resolve<\/span><span class=\"p\">(<\/span><span class=\"nx\">output_text<\/span><span class=\"p\">);<\/span>\r\n      <span class=\"p\">});<\/span>\r\n    <span class=\"p\">});<\/span>\r\n    <span class=\"nx\">req<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">error<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nf\">reject<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">});<\/span>\r\n\r\n    <span class=\"nx\">req<\/span><span class=\"p\">.<\/span><span class=\"nf\">write<\/span><span class=\"p\">(<\/span><span class=\"nx\">postData<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"nx\">req<\/span><span class=\"p\">.<\/span><span class=\"nf\">end<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"p\">});<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">getAccessToken<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">tokenData<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">querystring<\/span><span class=\"p\">.<\/span><span class=\"nf\">stringify<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">grant_type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">client_credentials<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">client_id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">API_KEY<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ API Key<\/span>\r\n    <span class=\"na\">client_secret<\/span><span class=\"p\">:<\/span> <span class=\"nx\">API_SECRET<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ API secret<\/span>\r\n    <span class=\"na\">urlAccessToken<\/span><span class=\"p\">:<\/span> <span class=\"nx\">BASE_URL<\/span> <span class=\"o\">+<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/oauth2\/token.php<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3\u53d6\u5f97URI<\/span>\r\n  <span class=\"p\">});<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">tokenOptions<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"na\">method<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">POST<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Content-Type<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">application\/x-www-form-urlencoded<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Content-Length<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"nx\">tokenData<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n  <span class=\"p\">};<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Promise<\/span><span class=\"p\">((<\/span><span class=\"nx\">resolve<\/span><span class=\"p\">,<\/span> <span class=\"nx\">reject<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">tokenReq<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">https<\/span><span class=\"p\">.<\/span><span class=\"nf\">request<\/span><span class=\"p\">(<\/span>\r\n      <span class=\"nx\">BASE_URL<\/span> <span class=\"o\">+<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/oauth2\/token.php<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"nx\">tokenOptions<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">let<\/span> <span class=\"nx\">body<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">data<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">chunk<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n          <span class=\"nx\">body<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">chunk<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"p\">});<\/span>\r\n        <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">end<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n          <span class=\"kd\">const<\/span> <span class=\"nx\">accessToken<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nf\">parse<\/span><span class=\"p\">(<\/span><span class=\"nx\">body<\/span><span class=\"p\">).<\/span><span class=\"nx\">access_token<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3<\/span>\r\n          <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">accessToken<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Access token not found.<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\r\n            <span class=\"nf\">reject<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Error<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\r\n          <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"nf\">resolve<\/span><span class=\"p\">(<\/span><span class=\"nx\">accessToken<\/span><span class=\"p\">);<\/span>\r\n          <span class=\"p\">}<\/span>\r\n        <span class=\"p\">});<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"p\">);<\/span>\r\n\r\n    <span class=\"nx\">tokenReq<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">error<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nf\">reject<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">});<\/span>\r\n    <span class=\"nx\">tokenReq<\/span><span class=\"p\">.<\/span><span class=\"nf\">write<\/span><span class=\"p\">(<\/span><span class=\"nx\">tokenData<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"nx\">tokenReq<\/span><span class=\"p\">.<\/span><span class=\"nf\">end<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"p\">});<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"nx\">exports<\/span><span class=\"p\">.<\/span><span class=\"nx\">handler<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"nx\">event<\/span><span class=\"p\">,<\/span> <span class=\"nx\">context<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">let<\/span> <span class=\"nx\">message<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">failed...<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"kd\">let<\/span> <span class=\"nx\">output_text<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">none<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">queryStringParameters<\/span> <span class=\"o\">!==<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">INPUT_TEXT<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">queryStringParameters<\/span><span class=\"p\">.<\/span><span class=\"nx\">input_text<\/span><span class=\"p\">;<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">accessToken<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">getAccessToken<\/span><span class=\"p\">();<\/span>\r\n      <span class=\"nx\">output_text<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">callTranslateApi<\/span><span class=\"p\">(<\/span><span class=\"nx\">accessToken<\/span><span class=\"p\">,<\/span> <span class=\"nx\">INPUT_TEXT<\/span><span class=\"p\">);<\/span>\r\n      <span class=\"nx\">message<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">success<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n      <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">INPUT_TEXT : <\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">INPUT_TEXT<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">output_text : <\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">output_text<\/span><span class=\"p\">);<\/span>\r\n\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">statusCode<\/span><span class=\"p\">:<\/span> <span class=\"mi\">200<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Content-Type<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">application\/json<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">},<\/span>\r\n      <span class=\"na\">body<\/span><span class=\"p\">:<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nf\">stringify<\/span><span class=\"p\">({<\/span>\r\n        <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"nx\">message<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">output_text<\/span><span class=\"p\">:<\/span> <span class=\"nx\">output_text<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"p\">}),<\/span>\r\n    <span class=\"p\">};<\/span>\r\n\r\n    <span class=\"k\">return<\/span> <span class=\"nx\">response<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"p\">}<\/span> <span class=\"k\">catch <\/span><span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">.<\/span><span class=\"nx\">stack<\/span><span class=\"p\">);<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u5c06\u4fee\u6b63\u540e\u7684 translate.js \u538b\u7f29\u4e3a zip \u6587\u4ef6\uff0c\u5e76\u4f7f\u7528 lambda update-function-code \u547d\u4ee4\u6765\u66f4\u65b0 translateFunction\u3002<br \/>\n\u53c2\u8003\uff1aLambda update-function-code<\/p>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>zip translate.zip translate.js\r\nupdating: translate.js <span class=\"o\">(<\/span>deflated 62%<span class=\"o\">)<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal lambda update-function-code <span class=\"nt\">--function-name<\/span> translateFunction <span class=\"nt\">--zip-file<\/span> fileb:\/\/translate.zip\r\n    <span class=\"s2\">\"Description\"<\/span>: <span class=\"s2\">\"\"<\/span>,\r\n    <span class=\"s2\">\"Timeout\"<\/span>: 60,\r\n    <span class=\"s2\">\"MemorySize\"<\/span>: 128,\r\n    <span class=\"s2\">\"LastModified\"<\/span>: <span class=\"s2\">\"2023-05-14T15:05:13.069049+0000\"<\/span>,\r\n    <span class=\"s2\">\"CodeSha256\"<\/span>: <span class=\"s2\">\"HnS2h+dTY1696Pz9BVMmS+qrC4cLpG5Lls2kruAKWNQ=\"<\/span>,\r\n    <span class=\"s2\">\"Version\"<\/span>: <span class=\"s2\">\"<\/span><span class=\"nv\">$LATEST<\/span><span class=\"s2\">\"<\/span>,\r\n    <span class=\"s2\">\"TracingConfig\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"Mode\"<\/span>: <span class=\"s2\">\"PassThrough\"<\/span>\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"RevisionId\"<\/span>: <span class=\"s2\">\"6b97a5ef-763d-462a-85f3-4a3b89346e1a\"<\/span>,\r\n    <span class=\"s2\">\"State\"<\/span>: <span class=\"s2\">\"Active\"<\/span>,\r\n    <span class=\"s2\">\"LastUpdateStatus\"<\/span>: <span class=\"s2\">\"InProgress\"<\/span>,\r\n    <span class=\"s2\">\"LastUpdateStatusReason\"<\/span>: <span class=\"s2\">\"The function is being created.\"<\/span>,\r\n    <span class=\"s2\">\"LastUpdateStatusReasonCode\"<\/span>: <span class=\"s2\">\"Creating\"<\/span>,\r\n    <span class=\"s2\">\"PackageType\"<\/span>: <span class=\"s2\">\"Zip\"<\/span>,\r\n    <span class=\"s2\">\"Architectures\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"s2\">\"x86_64\"<\/span>\r\n    <span class=\"o\">]<\/span>,\r\n    <span class=\"s2\">\"EphemeralStorage\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"Size\"<\/span>: 512\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"SnapStart\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"ApplyOn\"<\/span>: <span class=\"s2\">\"None\"<\/span>,\r\n        <span class=\"s2\">\"OptimizationStatus\"<\/span>: <span class=\"s2\">\"Off\"<\/span>\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"RuntimeVersionConfig\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"RuntimeVersionArn\"<\/span>: <span class=\"s2\">\"arn:aws:lambda:us-east-1::runtime:8eeff65f6809a3ce81507fe733fe09b835899b99481ba22fd75b5a7338290ec1\"<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d108f37434c4406bf1497\/115-0.png\" alt=\"image.png\" \/><\/div>\n<h2>\u69cb\u7bc9DynamoDB<\/h2>\n<h3>\u521b\u5efa DynamoDB \u8868\u683c<\/h3>\n<p>&#8211;attribute-definitions\u3067\u306f\u5c5e\u6027\u3068\u305d\u306e\u5c5e\u6027\u306e\u30bf\u30a4\u30d7\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\u4e0b\u8a18\u306e\u30b3\u30fc\u30c9\u3067\u306f\u5c5e\u6027\u540dtimestamp\u3067\u30bf\u30a4\u30d7\u304c\u6587\u5b57\u5217\u3067\u3059\u3002<\/p>\n<p>&#8211;key-schema\u3067\u306f\u30d7\u30e9\u30a4\u30de\u30ea\u30fc\u3092\u69cb\u6210\u3059\u308b\u5c5e\u6027\u3092\u6307\u5b9a\u3057\u307e\u3059\uff08&#8211;attribute-definitions\u3067\u6307\u5b9a\u3057\u3066\u3044\u308b\u4e2d\u304b\u3089\u9078\u629e\u3057\u307e\u3059\uff09\u4e0b\u8a18\u306e\u30b3\u30fc\u30c9\u3067\u306ftimestamp\u5c5e\u6027\u3092\u30d1\u30fc\u30c6\u30a3\u30b7\u30e7\u30f3\u30ad\u30fc\u3068\u6307\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002<br \/>\n\u53c2\u8003\uff1aDynamoDB create-table<\/p>\n<div>\u5982\u679c\u4e0d\u6307\u5b9a billing-mode\uff0c\u5219\u9ed8\u8ba4\u4e3a PROVISIONED\uff0c\u56e0\u6b64\u5fc5\u987b\u6307\u5b9a ReadCapacityUnits \u548c WriteCapacityUnits\u3002<br \/>\n\u53c2\u8003\uff1a\u8bfb\u53d6\/\u5199\u5165\u5bb9\u91cf\u6a21\u5f0f\u3002<\/div>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal dynamodb create-table <span class=\"nt\">--table-name<\/span> translate-history <span class=\"nt\">--attribute-definitions<\/span> <span class=\"nv\">AttributeName<\/span><span class=\"o\">=<\/span>timestamp,AttributeType<span class=\"o\">=<\/span>S <span class=\"nt\">--key-schema<\/span> <span class=\"nv\">AttributeName<\/span><span class=\"o\">=<\/span>timestamp,KeyType<span class=\"o\">=<\/span>HASH <span class=\"nt\">--billing-mode<\/span> PAY_PER_REQUEST\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"TableDescription\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"AttributeDefinitions\"<\/span>: <span class=\"o\">[<\/span>\r\n            <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"AttributeName\"<\/span>: <span class=\"s2\">\"timestamp\"<\/span>,\r\n                <span class=\"s2\">\"AttributeType\"<\/span>: <span class=\"s2\">\"S\"<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">]<\/span>,\r\n        <span class=\"s2\">\"TableName\"<\/span>: <span class=\"s2\">\"translate-history\"<\/span>,\r\n        <span class=\"s2\">\"KeySchema\"<\/span>: <span class=\"o\">[<\/span>\r\n            <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"AttributeName\"<\/span>: <span class=\"s2\">\"timestamp\"<\/span>,\r\n                <span class=\"s2\">\"KeyType\"<\/span>: <span class=\"s2\">\"HASH\"<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">]<\/span>,\r\n        <span class=\"s2\">\"TableStatus\"<\/span>: <span class=\"s2\">\"ACTIVE\"<\/span>,\r\n        <span class=\"s2\">\"CreationDateTime\"<\/span>: <span class=\"s2\">\"2023-05-20T17:29:44.130000+09:00\"<\/span>,\r\n        <span class=\"s2\">\"ProvisionedThroughput\"<\/span>: <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"LastIncreaseDateTime\"<\/span>: <span class=\"s2\">\"1970-01-01T09:00:00+09:00\"<\/span>,\r\n            <span class=\"s2\">\"LastDecreaseDateTime\"<\/span>: <span class=\"s2\">\"1970-01-01T09:00:00+09:00\"<\/span>,\r\n            <span class=\"s2\">\"NumberOfDecreasesToday\"<\/span>: 0,\r\n            <span class=\"s2\">\"ReadCapacityUnits\"<\/span>: 0,\r\n            <span class=\"s2\">\"WriteCapacityUnits\"<\/span>: 0\r\n        <span class=\"o\">}<\/span>,\r\n        <span class=\"s2\">\"TableSizeBytes\"<\/span>: 0,\r\n        <span class=\"s2\">\"ItemCount\"<\/span>: 0,\r\n        <span class=\"s2\">\"TableArn\"<\/span>: <span class=\"s2\">\"arn:aws:dynamodb:us-east-1:000000000000:table\/translate-history\"<\/span>,\r\n        <span class=\"s2\">\"TableId\"<\/span>: <span class=\"s2\">\"d7231038-ef8f-4b49-a830-1d2b616b8978\"<\/span>,\r\n        <span class=\"s2\">\"BillingModeSummary\"<\/span>: <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"BillingMode\"<\/span>: <span class=\"s2\">\"PAY_PER_REQUEST\"<\/span>,\r\n            <span class=\"s2\">\"LastUpdateToPayPerRequestDateTime\"<\/span>: <span class=\"s2\">\"2023-05-20T17:29:44.130000+09:00\"<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u6211\u5c06\u5c1d\u8bd5\u901a\u8fc7CLI\u6dfb\u52a0\u9879\u76ee\u5e76\u8fdb\u884c\u786e\u8ba4\u3002<\/h3>\n<p>\u4f7f\u7528put-item\u51fd\u6570\u6765\u6dfb\u52a0\u9879\uff0c\u5e76\u4f7f\u7528scan\u51fd\u6570\u6765\u67e5\u770b\u8868\u4e2d\u7684\u6240\u6709\u9879\u3002<br \/>\n\u53c2\u8003\uff1a<br \/>\nDynamoDB put-item<br \/>\nDynamoDB scan<\/p>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal dynamodb put-item <span class=\"nt\">--table-name<\/span> translate-history <span class=\"nt\">--item<\/span> <span class=\"s2\">\"{<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">timestamp<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">:{<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">S<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">:<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">203505082144<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">},<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">input_text<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">:{<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">S<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">:<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">\u304a\u306f\u3088\u3046\u3054\u3056\u3044\u307e\u3059<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">},<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">output_text<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">:{<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">S<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">:<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">Good morning<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">}}\"<\/span>\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal dynamodb scan <span class=\"nt\">--table-name<\/span> translate-history\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"Items\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"input_text\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"S\"<\/span>: <span class=\"s2\">\"\u304a\u306f\u3088\u3046\u3054\u3056\u3044\u307e\u3059\"<\/span>\r\n            <span class=\"o\">}<\/span>,\r\n            <span class=\"s2\">\"timestamp\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"S\"<\/span>: <span class=\"s2\">\"203505082144\"<\/span>\r\n            <span class=\"o\">}<\/span>,\r\n            <span class=\"s2\">\"output_text\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"S\"<\/span>: <span class=\"s2\">\"Good morning\"<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">]<\/span>,\r\n    <span class=\"s2\">\"Count\"<\/span>: 1,\r\n    <span class=\"s2\">\"ScannedCount\"<\/span>: 1,\r\n    <span class=\"s2\">\"ConsumedCapacity\"<\/span>: null\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u5c06Lambda\u548cDynamoDB\u8fdb\u884c\u6574\u5408<\/h2>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d108f37434c4406bf1497\/125-0.png\" alt=\"aws-serverless-arch01.png\" \/><\/div>\n<p>\u53c2\u8003\uff1a<br \/>\n\u4f7f\u7528Node.js\u64cd\u4f5cDynamoDB\uff08\u9002\u7528\u4e8eSDK\u7248\u672c3\uff09<br \/>\n\u4f7f\u7528@aws-sdk\/client-dynamod\u7684PutItemCommand\u547d\u4ee4\u3002<\/p>\n<div>\u5982\u679c\u5728LocalStack\u4e0a\u4f7f\u7528AWS SDK\uff0c\u5fc5\u987b\u6307\u5b9a\u7aef\u70b9\u4e3ahttp:\/\/${LOCALSTACK_HOSTNAME}:${EDGE_PORT}\u3002\u5728\u4ee5\u4e0b\u7684\u4ee3\u7801\u4e2d\u5df2\u7ecf\u6307\u5b9a\u4e86DynamoDBClient\u7684\u4f4d\u7f6e\u3002<br \/>\n\u53c2\u8003\uff1aLocalStack Transparent Endpoint Injection<\/div>\n<pre class=\"post-pre\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">https<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">https<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">querystring<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">querystring<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">DynamoDBClient<\/span><span class=\"p\">,<\/span> <span class=\"nx\">PutItemCommand<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">@aws-sdk\/client-dynamodb<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">BASE_URL<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">https:\/\/mt-auto-minhon-mlt.ucri.jgn-x.jp<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u57fa\u5e95URL (https:\/\/xxx.jp\u307e\u3067\u3092\u5165\u529b)<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">API_KEY<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">***<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ API key<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">API_SECRET<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">***<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ API secret<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">LOGIN_ID<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">***<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u30ed\u30b0\u30a4\u30f3ID<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">API_NAME<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">mt<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ API\u540d (https:\/\/xxx.jp\/api\/mt\/generalNT_ja_en\/ \u306e\u5834\u5408\u306f\u3001\"mt\")<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">API_PARAM<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">generalNT_ja_en<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ API\u5024 (https:\/\/xxx.jp\/api\/mt\/generalNT_ja_en\/ \u306e\u5834\u5408\u306f\u3001\"generalNT_ja_en\")<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">callTranslateApi<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"nx\">accessToken<\/span><span class=\"p\">,<\/span> <span class=\"nx\">input_text<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">postData<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">querystring<\/span><span class=\"p\">.<\/span><span class=\"nf\">stringify<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">access_token<\/span><span class=\"p\">:<\/span> <span class=\"nx\">accessToken<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">API_KEY<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ API Key<\/span>\r\n    <span class=\"na\">api_name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">API_NAME<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">api_param<\/span><span class=\"p\">:<\/span> <span class=\"nx\">API_PARAM<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">LOGIN_ID<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u30ed\u30b0\u30a4\u30f3ID<\/span>\r\n    <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">json<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u30ec\u30b9\u30dd\u30f3\u30b9\u30bf\u30a4\u30d7<\/span>\r\n    <span class=\"na\">text<\/span><span class=\"p\">:<\/span> <span class=\"nx\">input_text<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u4ee5\u4e0b\u3001API\u3054\u3068\u306e\u30d1\u30e9\u30e1\u30fc\u30bf<\/span>\r\n  <span class=\"p\">});<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">options<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"na\">method<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">POST<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Content-Type<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">application\/x-www-form-urlencoded<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Content-Length<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"nx\">postData<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n  <span class=\"p\">};<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Promise<\/span><span class=\"p\">((<\/span><span class=\"nx\">resolve<\/span><span class=\"p\">,<\/span> <span class=\"nx\">reject<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">req<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">https<\/span><span class=\"p\">.<\/span><span class=\"nf\">request<\/span><span class=\"p\">(<\/span><span class=\"nx\">BASE_URL<\/span> <span class=\"o\">+<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/api\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">options<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"kd\">let<\/span> <span class=\"nx\">body<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">;<\/span>\r\n      <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">data<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">chunk<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">body<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">chunk<\/span><span class=\"p\">;<\/span>\r\n      <span class=\"p\">});<\/span>\r\n      <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">end<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">bodyJson<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nf\">parse<\/span><span class=\"p\">(<\/span><span class=\"nx\">body<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"kd\">const<\/span> <span class=\"nx\">output_text<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">bodyJson<\/span><span class=\"p\">.<\/span><span class=\"nx\">resultset<\/span><span class=\"p\">.<\/span><span class=\"nx\">result<\/span><span class=\"p\">.<\/span><span class=\"nx\">text<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"nf\">resolve<\/span><span class=\"p\">(<\/span><span class=\"nx\">output_text<\/span><span class=\"p\">);<\/span>\r\n      <span class=\"p\">});<\/span>\r\n    <span class=\"p\">});<\/span>\r\n    <span class=\"nx\">req<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">error<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nf\">reject<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">});<\/span>\r\n\r\n    <span class=\"nx\">req<\/span><span class=\"p\">.<\/span><span class=\"nf\">write<\/span><span class=\"p\">(<\/span><span class=\"nx\">postData<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"nx\">req<\/span><span class=\"p\">.<\/span><span class=\"nf\">end<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"p\">});<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">getAccessToken<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">tokenData<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">querystring<\/span><span class=\"p\">.<\/span><span class=\"nf\">stringify<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">grant_type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">client_credentials<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">client_id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">API_KEY<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ API Key<\/span>\r\n    <span class=\"na\">client_secret<\/span><span class=\"p\">:<\/span> <span class=\"nx\">API_SECRET<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ API secret<\/span>\r\n    <span class=\"na\">urlAccessToken<\/span><span class=\"p\">:<\/span> <span class=\"nx\">BASE_URL<\/span> <span class=\"o\">+<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/oauth2\/token.php<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ \u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3\u53d6\u5f97URI<\/span>\r\n  <span class=\"p\">});<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">tokenOptions<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"na\">method<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">POST<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Content-Type<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">application\/x-www-form-urlencoded<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Content-Length<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"nx\">tokenData<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n  <span class=\"p\">};<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Promise<\/span><span class=\"p\">((<\/span><span class=\"nx\">resolve<\/span><span class=\"p\">,<\/span> <span class=\"nx\">reject<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">tokenReq<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">https<\/span><span class=\"p\">.<\/span><span class=\"nf\">request<\/span><span class=\"p\">(<\/span>\r\n      <span class=\"nx\">BASE_URL<\/span> <span class=\"o\">+<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/oauth2\/token.php<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"nx\">tokenOptions<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">let<\/span> <span class=\"nx\">body<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">data<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">chunk<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n          <span class=\"nx\">body<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">chunk<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"p\">});<\/span>\r\n        <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">end<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n          <span class=\"kd\">const<\/span> <span class=\"nx\">accessToken<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nf\">parse<\/span><span class=\"p\">(<\/span><span class=\"nx\">body<\/span><span class=\"p\">).<\/span><span class=\"nx\">access_token<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ \u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3<\/span>\r\n          <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">accessToken<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Access token not found.<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\r\n            <span class=\"nf\">reject<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Error<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\r\n          <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"nf\">resolve<\/span><span class=\"p\">(<\/span><span class=\"nx\">accessToken<\/span><span class=\"p\">);<\/span>\r\n          <span class=\"p\">}<\/span>\r\n        <span class=\"p\">});<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"p\">);<\/span>\r\n\r\n    <span class=\"nx\">tokenReq<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">error<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nf\">reject<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">});<\/span>\r\n    <span class=\"nx\">tokenReq<\/span><span class=\"p\">.<\/span><span class=\"nf\">write<\/span><span class=\"p\">(<\/span><span class=\"nx\">tokenData<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"nx\">tokenReq<\/span><span class=\"p\">.<\/span><span class=\"nf\">end<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"p\">});<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">callDynamoDB<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"nx\">input_text<\/span><span class=\"p\">,<\/span> <span class=\"nx\">output_text<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">dynamoConfig<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"na\">endpoint<\/span><span class=\"p\">:<\/span> <span class=\"s2\">`http:\/\/<\/span><span class=\"p\">${<\/span><span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">LOCALSTACK_HOSTNAME<\/span><span class=\"dl\">\"<\/span><span class=\"p\">]}<\/span><span class=\"s2\">:<\/span><span class=\"p\">${<\/span><span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">EDGE_PORT<\/span><span class=\"dl\">\"<\/span><span class=\"p\">]}<\/span><span class=\"s2\">`<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">region<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">us-east-1<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"p\">};<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">dynamoDBClient<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">DynamoDBClient<\/span><span class=\"p\">(<\/span><span class=\"nx\">dynamoConfig<\/span><span class=\"p\">);<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">createdAt<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Date<\/span><span class=\"p\">().<\/span><span class=\"nf\">toLocaleDateString<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">ja-JP<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"na\">year<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">numeric<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">month<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">2-digit<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">day<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">2-digit<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"p\">});<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">putItemCommand<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">PutItemCommand<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">TableName<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">translate-history<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">Item<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">timestamp<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">S<\/span><span class=\"p\">:<\/span> <span class=\"nx\">createdAt<\/span> <span class=\"p\">},<\/span>\r\n      <span class=\"na\">input_text<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">S<\/span><span class=\"p\">:<\/span> <span class=\"nx\">input_text<\/span> <span class=\"p\">},<\/span>\r\n      <span class=\"na\">output_text<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">S<\/span><span class=\"p\">:<\/span> <span class=\"nx\">output_text<\/span> <span class=\"p\">},<\/span>\r\n    <span class=\"p\">},<\/span>\r\n  <span class=\"p\">});<\/span>\r\n  <span class=\"k\">await<\/span> <span class=\"nx\">dynamoDBClient<\/span><span class=\"p\">.<\/span><span class=\"nf\">send<\/span><span class=\"p\">(<\/span><span class=\"nx\">putItemCommand<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">};<\/span>\r\n<span class=\"nx\">exports<\/span><span class=\"p\">.<\/span><span class=\"nx\">handler<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"nx\">event<\/span><span class=\"p\">,<\/span> <span class=\"nx\">context<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">let<\/span> <span class=\"nx\">message<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">failed...<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"kd\">let<\/span> <span class=\"nx\">output_text<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">none<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">queryStringParameters<\/span> <span class=\"o\">!==<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">INPUT_TEXT<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">queryStringParameters<\/span><span class=\"p\">.<\/span><span class=\"nx\">input_text<\/span><span class=\"p\">;<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">accessToken<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">getAccessToken<\/span><span class=\"p\">();<\/span>\r\n      <span class=\"nx\">output_text<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">callTranslateApi<\/span><span class=\"p\">(<\/span><span class=\"nx\">accessToken<\/span><span class=\"p\">,<\/span> <span class=\"nx\">INPUT_TEXT<\/span><span class=\"p\">);<\/span>\r\n      <span class=\"nx\">message<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">success<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n      <span class=\"k\">await<\/span> <span class=\"nf\">callDynamoDB<\/span><span class=\"p\">(<\/span><span class=\"nx\">INPUT_TEXT<\/span><span class=\"p\">,<\/span> <span class=\"nx\">output_text<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">statusCode<\/span><span class=\"p\">:<\/span> <span class=\"mi\">200<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Content-Type<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">application\/json<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">},<\/span>\r\n      <span class=\"na\">body<\/span><span class=\"p\">:<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nf\">stringify<\/span><span class=\"p\">({<\/span>\r\n        <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"nx\">message<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">output_text<\/span><span class=\"p\">:<\/span> <span class=\"nx\">output_text<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"p\">}),<\/span>\r\n    <span class=\"p\">};<\/span>\r\n\r\n    <span class=\"k\">return<\/span> <span class=\"nx\">response<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"p\">}<\/span> <span class=\"k\">catch <\/span><span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">.<\/span><span class=\"nx\">stack<\/span><span class=\"p\">);<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u5c06\u4fee\u6b63\u8fc7\u7684Lambda\u51fd\u6570\u6253\u5305\u6210zip\u6587\u4ef6\u5e76\u8fdb\u884c\u90e8\u7f72\u3002<\/p>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>zip translate.zip translate.js\r\nUbuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal lambda update-function-code <span class=\"nt\">--function-name<\/span> translateFunction <span class=\"nt\">--zip-file<\/span> fileb:\/\/translate.zip\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"FunctionName\"<\/span>: <span class=\"s2\">\"translateFunction\"<\/span>,\r\n    <span class=\"s2\">\"FunctionArn\"<\/span>: <span class=\"s2\">\"arn:aws:lambda:us-east-1:000000000000:function:translateFunction\"<\/span>,\r\n    <span class=\"s2\">\"Runtime\"<\/span>: <span class=\"s2\">\"nodejs18.x\"<\/span>,\r\n    <span class=\"s2\">\"Role\"<\/span>: <span class=\"s2\">\"arn::iam::000000000000:role\/demo\"<\/span>,\r\n    <span class=\"s2\">\"Handler\"<\/span>: <span class=\"s2\">\"translate.handler\"<\/span>,\r\n    <span class=\"s2\">\"CodeSize\"<\/span>: 3500,\r\n    <span class=\"s2\">\"Description\"<\/span>: <span class=\"s2\">\"\"<\/span>,\r\n    <span class=\"s2\">\"Timeout\"<\/span>: 60,\r\n    <span class=\"s2\">\"MemorySize\"<\/span>: 128,\r\n    <span class=\"s2\">\"LastModified\"<\/span>: <span class=\"s2\">\"2023-05-20T09:39:03.989290+0000\"<\/span>,\r\n    <span class=\"s2\">\"CodeSha256\"<\/span>: <span class=\"s2\">\"eXu7kuOEmiXkW5T85scNKFpH9a2akXman1OxKFjxNWk=\"<\/span>,\r\n    <span class=\"s2\">\"Version\"<\/span>: <span class=\"s2\">\"<\/span><span class=\"nv\">$LATEST<\/span><span class=\"s2\">\"<\/span>,\r\n    <span class=\"s2\">\"TracingConfig\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"Mode\"<\/span>: <span class=\"s2\">\"PassThrough\"<\/span>\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"RevisionId\"<\/span>: <span class=\"s2\">\"61d78423-094c-4bc6-a242-7b55f891e4fa\"<\/span>,\r\n    <span class=\"s2\">\"State\"<\/span>: <span class=\"s2\">\"Active\"<\/span>,\r\n    <span class=\"s2\">\"LastUpdateStatus\"<\/span>: <span class=\"s2\">\"InProgress\"<\/span>,\r\n    <span class=\"s2\">\"LastUpdateStatusReason\"<\/span>: <span class=\"s2\">\"The function is being created.\"<\/span>,\r\n    <span class=\"s2\">\"LastUpdateStatusReasonCode\"<\/span>: <span class=\"s2\">\"Creating\"<\/span>,\r\n    <span class=\"s2\">\"PackageType\"<\/span>: <span class=\"s2\">\"Zip\"<\/span>,\r\n    <span class=\"s2\">\"Architectures\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"s2\">\"x86_64\"<\/span>\r\n    <span class=\"o\">]<\/span>,\r\n    <span class=\"s2\">\"EphemeralStorage\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"Size\"<\/span>: 512\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"SnapStart\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"ApplyOn\"<\/span>: <span class=\"s2\">\"None\"<\/span>,\r\n        <span class=\"s2\">\"OptimizationStatus\"<\/span>: <span class=\"s2\">\"Off\"<\/span>\r\n    <span class=\"o\">}<\/span>,\r\n    <span class=\"s2\">\"RuntimeVersionConfig\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"RuntimeVersionArn\"<\/span>: <span class=\"s2\">\"arn:aws:lambda:us-east-1::runtime:8eeff65f6809a3ce81507fe733fe09b835899b99481ba22fd75b5a7338290ec1\"<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u786e\u8ba4API Gateway\u3001Lambda\u3001\u7ffb\u8bd1API\u548cDynamoDB\u662f\u5426\u5df2\u8fde\u63a5\u3002<\/h2>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d108f37434c4406bf1497\/132-0.png\" alt=\"image.png\" \/><\/div>\n<pre class=\"post-pre\"><code>Ubuntu@dev01:~\/workplace\/translate-function\/node\/nodejs<span class=\"nv\">$ <\/span>awslocal dynamodb scan <span class=\"nt\">--table-name<\/span> translate-history\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"Items\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"input_text\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"S\"<\/span>: <span class=\"s2\">\"\u304a\u306f\u3088\u3046\u3054\u3056\u3044\u307e\u3059\"<\/span>\r\n            <span class=\"o\">}<\/span>,\r\n            <span class=\"s2\">\"timestamp\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"S\"<\/span>: <span class=\"s2\">\"203505082144\"<\/span>\r\n            <span class=\"o\">}<\/span>,\r\n            <span class=\"s2\">\"output_text\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"S\"<\/span>: <span class=\"s2\">\"Good morning\"<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">}<\/span>,\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"input_text\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"S\"<\/span>: <span class=\"s2\">\"\u3053\u308c\u3067\u30cf\u30f3\u30ba\u30aa\u30f3\u306f\u5b8c\u4e86\u3067\u3059\"<\/span>\r\n            <span class=\"o\">}<\/span>,\r\n            <span class=\"s2\">\"timestamp\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"S\"<\/span>: <span class=\"s2\">\"2023\/05\/20\"<\/span>\r\n            <span class=\"o\">}<\/span>,\r\n            <span class=\"s2\">\"output_text\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"S\"<\/span>: <span class=\"s2\">\"This completes the hands-on.\"<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">]<\/span>,\r\n    <span class=\"s2\">\"Count\"<\/span>: 2,\r\n    <span class=\"s2\">\"ScannedCount\"<\/span>: 2,\r\n    <span class=\"s2\">\"ConsumedCapacity\"<\/span>: null\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u6211\u786e\u8ba4DynamoDB\u4e2d\u4fdd\u5b58\u4e86\u5386\u53f2\u8bb0\u5f55\uff01\u606d\u559c?<\/p>\n<h1>\u7ed3\u675f<\/h1>\n<p>\u611f\u8c22\u60a8\u9605\u8bfb\u3010AWS\u8d44\u683c\u51c6\u5907\u3011\u514d\u8d39\u5b9e\u8df5\u5b66\u4e60AWS\u5165\u95e8#1\u3010\u521d\u5b66\u8005\u4e13\u5c5e\u3011\uff01\u672c\u6587\u7684\u5b9e\u8df5\u90e8\u5206\u5230\u6b64\u7ed3\u675f\u3002<br \/>\n\u5e0c\u671b\u8fd9\u5bf9\u4e8e\u8ffd\u6c42AWS\u8d44\u683c\u8ba4\u8bc1\u7684\u4eba\u4eec\u80fd\u6210\u4e3a\u6709\u4ef7\u503c\u7684\u4fe1\u606f\u6e90?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7ae0\u8282\u7d22\u5f15 \u3069\u3093\u306a\u8a18\u4e8b\uff1f &nbsp; \u4f55\u3092\u4f5c\u308b\u306e\u304b &nbsp; \u74b0\u5883 &nbsp; LocalStack\u74b0\u5883 [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-32181","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u3010AWS\u8ba4\u8bc1\u5907\u8003\u3011\u96f6\u6210\u672c\u5728\u7ebf\u5b9e\u8df5\u5b66\u4e60AWS\u5165\u95e8\uff08API Gateway, Lambda, DynamoDB\uff09\u3010\u9002\u5408\u521d\u5b66\u8005\u3011 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u3010aws\u8ba4\u8bc1\u5907\u8003\u3011\u96f6\u6210\u672c\u5728\u7ebf\u5b9e\u8df5\u5b66\u4e60aws\u5165\u95e8\uff08api-gateway-lambda-dynamodb\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u3010AWS\u8ba4\u8bc1\u5907\u8003\u3011\u96f6\u6210\u672c\u5728\u7ebf\u5b9e\u8df5\u5b66\u4e60AWS\u5165\u95e8\uff08API Gateway, Lambda, DynamoDB\uff09\u3010\u9002\u5408\u521d\u5b66\u8005\u3011\" \/>\n<meta property=\"og:description\" content=\"\u7ae0\u8282\u7d22\u5f15 \u3069\u3093\u306a\u8a18\u4e8b\uff1f &nbsp; \u4f55\u3092\u4f5c\u308b\u306e\u304b &nbsp; \u74b0\u5883 &nbsp; LocalStack\u74b0\u5883 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u3010aws\u8ba4\u8bc1\u5907\u8003\u3011\u96f6\u6210\u672c\u5728\u7ebf\u5b9e\u8df5\u5b66\u4e60aws\u5165\u95e8\uff08api-gateway-lambda-dynamodb\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-17T13:25:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-04T09:21:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d108f37434c4406bf1497\/9-0.png\" \/>\n<meta name=\"author\" content=\"\u5b87, \u534e\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u5b87, \u534e\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e8%ae%a4%e8%af%81%e5%a4%87%e8%80%83%e3%80%91%e9%9b%b6%e6%88%90%e6%9c%ac%e5%9c%a8%e7%ba%bf%e5%ae%9e%e8%b7%b5%e5%ad%a6%e4%b9%a0aws%e5%85%a5%e9%97%a8%ef%bc%88api-gateway-lambda-dynamodb\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e8%ae%a4%e8%af%81%e5%a4%87%e8%80%83%e3%80%91%e9%9b%b6%e6%88%90%e6%9c%ac%e5%9c%a8%e7%ba%bf%e5%ae%9e%e8%b7%b5%e5%ad%a6%e4%b9%a0aws%e5%85%a5%e9%97%a8%ef%bc%88api-gateway-lambda-dynamodb\/\",\"name\":\"\u3010AWS\u8ba4\u8bc1\u5907\u8003\u3011\u96f6\u6210\u672c\u5728\u7ebf\u5b9e\u8df5\u5b66\u4e60AWS\u5165\u95e8\uff08API Gateway, Lambda, DynamoDB\uff09\u3010\u9002\u5408\u521d\u5b66\u8005\u3011 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2024-01-17T13:25:19+00:00\",\"dateModified\":\"2024-05-04T09:21:45+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e8%ae%a4%e8%af%81%e5%a4%87%e8%80%83%e3%80%91%e9%9b%b6%e6%88%90%e6%9c%ac%e5%9c%a8%e7%ba%bf%e5%ae%9e%e8%b7%b5%e5%ad%a6%e4%b9%a0aws%e5%85%a5%e9%97%a8%ef%bc%88api-gateway-lambda-dynamodb\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e8%ae%a4%e8%af%81%e5%a4%87%e8%80%83%e3%80%91%e9%9b%b6%e6%88%90%e6%9c%ac%e5%9c%a8%e7%ba%bf%e5%ae%9e%e8%b7%b5%e5%ad%a6%e4%b9%a0aws%e5%85%a5%e9%97%a8%ef%bc%88api-gateway-lambda-dynamodb\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e8%ae%a4%e8%af%81%e5%a4%87%e8%80%83%e3%80%91%e9%9b%b6%e6%88%90%e6%9c%ac%e5%9c%a8%e7%ba%bf%e5%ae%9e%e8%b7%b5%e5%ad%a6%e4%b9%a0aws%e5%85%a5%e9%97%a8%ef%bc%88api-gateway-lambda-dynamodb\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u3010AWS\u8ba4\u8bc1\u5907\u8003\u3011\u96f6\u6210\u672c\u5728\u7ebf\u5b9e\u8df5\u5b66\u4e60AWS\u5165\u95e8\uff08API Gateway, Lambda, DynamoDB\uff09\u3010\u9002\u5408\u521d\u5b66\u8005\u3011\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\",\"name\":\"\u5b87, \u534e\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"caption\":\"\u5b87, \u534e\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e8%ae%a4%e8%af%81%e5%a4%87%e8%80%83%e3%80%91%e9%9b%b6%e6%88%90%e6%9c%ac%e5%9c%a8%e7%ba%bf%e5%ae%9e%e8%b7%b5%e5%ad%a6%e4%b9%a0aws%e5%85%a5%e9%97%a8%ef%bc%88api-gateway-lambda-dynamodb\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u3010AWS\u8ba4\u8bc1\u5907\u8003\u3011\u96f6\u6210\u672c\u5728\u7ebf\u5b9e\u8df5\u5b66\u4e60AWS\u5165\u95e8\uff08API Gateway, Lambda, DynamoDB\uff09\u3010\u9002\u5408\u521d\u5b66\u8005\u3011 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u3010aws\u8ba4\u8bc1\u5907\u8003\u3011\u96f6\u6210\u672c\u5728\u7ebf\u5b9e\u8df5\u5b66\u4e60aws\u5165\u95e8\uff08api-gateway-lambda-dynamodb\/","og_locale":"zh_CN","og_type":"article","og_title":"\u3010AWS\u8ba4\u8bc1\u5907\u8003\u3011\u96f6\u6210\u672c\u5728\u7ebf\u5b9e\u8df5\u5b66\u4e60AWS\u5165\u95e8\uff08API Gateway, Lambda, DynamoDB\uff09\u3010\u9002\u5408\u521d\u5b66\u8005\u3011","og_description":"\u7ae0\u8282\u7d22\u5f15 \u3069\u3093\u306a\u8a18\u4e8b\uff1f &nbsp; \u4f55\u3092\u4f5c\u308b\u306e\u304b &nbsp; \u74b0\u5883 &nbsp; LocalStack\u74b0\u5883 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u3010aws\u8ba4\u8bc1\u5907\u8003\u3011\u96f6\u6210\u672c\u5728\u7ebf\u5b9e\u8df5\u5b66\u4e60aws\u5165\u95e8\uff08api-gateway-lambda-dynamodb\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2024-01-17T13:25:19+00:00","article_modified_time":"2024-05-04T09:21:45+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d108f37434c4406bf1497\/9-0.png"}],"author":"\u5b87, \u534e","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u5b87, \u534e","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"20 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e8%ae%a4%e8%af%81%e5%a4%87%e8%80%83%e3%80%91%e9%9b%b6%e6%88%90%e6%9c%ac%e5%9c%a8%e7%ba%bf%e5%ae%9e%e8%b7%b5%e5%ad%a6%e4%b9%a0aws%e5%85%a5%e9%97%a8%ef%bc%88api-gateway-lambda-dynamodb\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e8%ae%a4%e8%af%81%e5%a4%87%e8%80%83%e3%80%91%e9%9b%b6%e6%88%90%e6%9c%ac%e5%9c%a8%e7%ba%bf%e5%ae%9e%e8%b7%b5%e5%ad%a6%e4%b9%a0aws%e5%85%a5%e9%97%a8%ef%bc%88api-gateway-lambda-dynamodb\/","name":"\u3010AWS\u8ba4\u8bc1\u5907\u8003\u3011\u96f6\u6210\u672c\u5728\u7ebf\u5b9e\u8df5\u5b66\u4e60AWS\u5165\u95e8\uff08API Gateway, Lambda, DynamoDB\uff09\u3010\u9002\u5408\u521d\u5b66\u8005\u3011 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2024-01-17T13:25:19+00:00","dateModified":"2024-05-04T09:21:45+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e8%ae%a4%e8%af%81%e5%a4%87%e8%80%83%e3%80%91%e9%9b%b6%e6%88%90%e6%9c%ac%e5%9c%a8%e7%ba%bf%e5%ae%9e%e8%b7%b5%e5%ad%a6%e4%b9%a0aws%e5%85%a5%e9%97%a8%ef%bc%88api-gateway-lambda-dynamodb\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e8%ae%a4%e8%af%81%e5%a4%87%e8%80%83%e3%80%91%e9%9b%b6%e6%88%90%e6%9c%ac%e5%9c%a8%e7%ba%bf%e5%ae%9e%e8%b7%b5%e5%ad%a6%e4%b9%a0aws%e5%85%a5%e9%97%a8%ef%bc%88api-gateway-lambda-dynamodb\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e8%ae%a4%e8%af%81%e5%a4%87%e8%80%83%e3%80%91%e9%9b%b6%e6%88%90%e6%9c%ac%e5%9c%a8%e7%ba%bf%e5%ae%9e%e8%b7%b5%e5%ad%a6%e4%b9%a0aws%e5%85%a5%e9%97%a8%ef%bc%88api-gateway-lambda-dynamodb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u3010AWS\u8ba4\u8bc1\u5907\u8003\u3011\u96f6\u6210\u672c\u5728\u7ebf\u5b9e\u8df5\u5b66\u4e60AWS\u5165\u95e8\uff08API Gateway, Lambda, DynamoDB\uff09\u3010\u9002\u5408\u521d\u5b66\u8005\u3011"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458","name":"\u5b87, \u534e","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","caption":"\u5b87, \u534e"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e8%ae%a4%e8%af%81%e5%a4%87%e8%80%83%e3%80%91%e9%9b%b6%e6%88%90%e6%9c%ac%e5%9c%a8%e7%ba%bf%e5%ae%9e%e8%b7%b5%e5%ad%a6%e4%b9%a0aws%e5%85%a5%e9%97%a8%ef%bc%88api-gateway-lambda-dynamodb\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/32181","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=32181"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/32181\/revisions"}],"predecessor-version":[{"id":99660,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/32181\/revisions\/99660"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=32181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=32181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=32181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}