#author("2023-02-13T21:45:55+00:00","default:hotate","hotate") #author("2023-06-04T00:26:33+00:00;2023-02-13T21:45:55+00:00","default:hotate","hotate") #contents &tag(AWS, Lambda); &tag(AWS,Lambda); * 情報 [#n56f8338] - [[[AWS]知っておいたほうがいいLambda関数の呼び出しタイプとリトライ方式まとめ | DevelopersIO>https://dev.classmethod.jp/cloud/aws/lambda-idempotency/]] Lambda関数の呼び出しタイプがあり、この呼出しタイプによりリトライ方式が変わってきます。 ** [[2023]]年 [#r1da6e35] - [[これからは「FaaS」だ、AWS Lambda最新事例 | 日経クロステック(xTECH)>https://xtech.nikkei.com/atcl/nxt/column/18/02355/]] 開発者がサーバーを管理する必要の無いサーバーレスの環境で、プログラムを実行する「FaaS(ファンクション・アズ・ア・サービス)」 * [[リファレンス]] [#bf5dae4d] - [[update-function-code — AWS CLI 2.4.7 Command Reference>https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html#]] Updates a Lambda function’s code. * [[Node.js]] [#f7693488] - [[Programming Model (Node.js) - AWS Lambda>http://docs.aws.amazon.com/lambda/latest/dg/programming-model.html]] AWS Lambda currently supports the following Node.js runtimes: Node.js runtime v4.3 (runtime = nodejs4.3) - [[Lambda Function Handler (Node.js) - AWS Lambda>http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html#nodejs-prog-model-handler-callback]] callback(); // Indicates success but no information returned to the caller. callback(null); // Indicates success but no information returned to the caller. callback(null, "success"); // Indicates success with information returned to the caller. callback(error); // Indicates error with error information returned to the caller. - [[初めてのJavaScript、初めてのAWS Lambda | Developers.IO>http://dev.classmethod.jp/cloud/aws/1st-javascript-1st-lambda/]] 以下のようにlambdaスクリプトと外部モジュールディレクトリを指定してzip化します。 $ zip -r myfunc.zip index.js node_modules - [[AWS Lambdaのための関数のローカル開発とテスト - Qiita>https://qiita.com/imaifactory/items/092e32b4fc0f69a94061]] event: 実際に渡ってくるイベントのデータ(S3のアップデートとかKinesisのレコードとか)。 context: Lambda functionの呼び出しコンテキスト。 - [[AWS Lambdaの関数をnpmでパッケージ管理 - Qiita>https://qiita.com/imaifactory/items/ac81b4a3ff4a5f5dec85]] ということで、何をやってきたかをまとめてみると、以下のようなステップを実現してみようぜという話でした。 ローカルで開発 npm testでユニットテストやLintを走らせる npm buildでパッケージ(Lambda用のzipファイル)のビルド npm initLambdaでLambda用の設定ファイルを作る npm publishでLambdaにアップロード - [[AWSのLambdaでasync / awaitを使う - Qiita>https://qiita.com/m__ike_/items/fbecc84658212653f309]] 実際にasync / awaitが威力を発揮するLambda特有のコードの例を3つ取り上げます。 ** 環境変数 [#af90a3b3] - [[AWS Lambdaのタイムゾーン変更 - Qiita>https://qiita.com/nullian/items/39ecf1f6d0194b72e8e6]] nvironment variables の Key と Value にそれぞれ TZ・Asia/Tokyo と入力すれば良いみたいです。 ** バージョン [#w00e1fc4] - [[[アップデート] AWS Lambdaが Node.js 18をサポートしました | DevelopersIO>https://dev.classmethod.jp/articles/aws-lambda-support-node-js-18/]] (2022/11/19) Lambdaがサポートするランタイムに Node.js 18 が加わりました - [[【アップデート】LambdaのランタイムにNode.js 14が利用可能になりました | DevelopersIO>https://dev.classmethod.jp/articles/lambda-support-node14/]] (2021/2/14) LambdaのランタイムとしてNode.js 14.xが利用可能になりました。Node.js 14はNode.jsの最新のLTSリリースであり、2023年4月までセキュリティ&バグフィックスがサポートされます。 - [[【アップデート】 LambdaでNode.js v10が利用できるようになりました!! | DevelopersIO>https://dev.classmethod.jp/cloud/aws/lambda-support-nodejs-v10/]] (2019/5/14) 本日のアップデートにより、LambdaでNode.js v10が利用できるようになりました。 現在主流であろうNode.js v8も今年中にはEOLを迎える予定です。 - [[【注意喚起】AWS LambdaでNode.js 6.10ランタイム構成の新規作成/更新が終了となります | DevelopersIO>https://dev.classmethod.jp/cloud/aws/eol-for-node-js-610/]] (2019/3/28) 2019/4/30に予定されているNode.js 6.xのEOLに伴い、AWS Lambdaでの - Node.js 6.10のランタイムを指定しての新規作成は、2019/4/30で終了 - Node.js 6.10のランタイムを指定した関数の更新は、2019/5/30で終了 - 但し、既存のNode.js 6.10のランタイムを指定した関数の呼び出しは引き続き可能 - [[[新機能]AWS LambdaがNode.js v8.10をサポートしました | Developers.IO>https://dev.classmethod.jp/cloud/aws-lambda-nodejs8-support/]] (2018/4/3) 一番の変更点はasync/awaitパターンが使えるようになったことでしょう。 - [[AWS LambdaでNode.js v6.10がサポートされました | Developers.IO>http://dev.classmethod.jp/cloud/aws/lambda-node-js-v6-10-support/]] (2017/3/23) Node.js v4.3 2016/04/07 現在の主流。 Node.js v6.10 2017/03/22 New! - [[AWS Lambda のNode.js が4.3.2 になった - うさぎ駆動開発>http://aile.hatenablog.com/entry/2016/04/11/211558]] contextオブジェクトの仕様変更 * 連携 [#p660170c] ** [[Lambda]]呼び出し [#m8c175a3] - [[[AWS] Lambda から Lambda を呼ぶ | memo.dogmap.jp>https://memo.dogmap.jp/2015/03/12/aws-lambda-invoke-async/]] 小さい機能単位で Lambda ファンクション作って、それを呼ぶ感じで作っていくとやりやすい。 - [[[AWS Lambda] invokeAsync ではなく invoke を使おう - Qiita>https://qiita.com/longtime1116/items/51aebf5e2ce56b91ae7b]] invokeAsync のリファレンスを見ると、↓のように書かれている。 This API is deprecated. We recommend you use Invoke API (see Invoke). - [[Lambda(Node.js)をES2015のPromiseを使って今っぽく書いてみる | DevelopersIO>https://dev.classmethod.jp/server-side/lambda-with-es2015promise/]] あるLambdaから別のLambdaを非同期で実行する部分をPromiseを使って書きなおしてみます。 - [[AWS Lambda内から他のLambda関数を同期的に呼び出すサンプル (Node.js) - キリウ君が読まないノート>https://note.kiriukun.com/entry/20190117-synchronously-invoke-other-lambda-from-lambda]] // 呼び出される側のLambda関数を同期的に実行する const result = await lambda.invoke(params).promise(); // 結果のPayloadにレスポンス内容がJSON文字列で入ってるので、取り出してパースする const body = JSON.parse(result.Payload); ** Amazon [[DynamoDB]] [#j854a3c8] *** Streams [#s2850120] - [[AWS Lambda と Amazon DynamoDB Streams を連係する | Developers.IO>http://dev.classmethod.jp/cloud/aws/lambda-dynamodb-stream/]] Amazon DynamoDB Streams (以下 DynamoDB Streams) とは、先日発表された DynamoDB の新機能です。この機能を有効にすることで、DynamoDB のテーブルに対するすべての更新(Put, Update, Delete)が直近の24時間保持され、API 経由でアクセスできるようになります。 - [[取り寄せた本が届いたら DynamoDB Stream を元に Lambda 経由で Twitter に通知させる - ミームの死骸を待ちながら>http://hash.hateblo.jp/entry/20151205/1449320833]] DynamoDB の更新 Stream をイベントソースとして Lambda で一回だけ通知してくれるように改良する話を書く. - [[DynamoDB Streamのデータをsocket.ioを使ってブラウザに流す - Qiita>http://qiita.com/horike37/items/8d513dbd2ad84aaf747d]] TwitterのストリームデータをKinesisを経由してDynamoDBに保存します。 DynamoDB Streamにデータを流し、ブラウザでストリームデータを可視化する。 * 事例 [#ie14bc73] ** [[LINE]] [#jf755bed] - [[LINE Notify を AWS Lambda (Node.js) から利用してみた - Qiita>http://qiita.com/hkusu/items/75aca4e92eaf02c00db5]] Lambda を利用することで、自分にサーバを持たずにボットを運用することができます(いわゆるサーバレス)。 * API Gateway(プロキシ統合) [#b2d57147] - [[API Gatewayの「Lambda プロキシ統合の使用」オプション - Qiita>http://qiita.com/yoshidasts/items/8a31280a6331b6407c73]] これを使えば、HTTPヘッダーの情報がそのままLambdaに伝わるのでは!? - [[Amazon API Gatewayが非常に便利なHTTPプロキシとして進化したらしいので使ってみた - Qiita>http://qiita.com/seiya_orz/items/4e9d8c62739399b076b7]] 今回はeventの中身を見たかったのでeventをbodyとして出力するようにしました。 - [[AWS Lambda Proxy Integrationを試してみた - Qiita>http://qiita.com/seiya_orz/items/2bd83204e212e35b2c6c]] POSTの場合、bodyの中身はオブジェクトではなくStringで渡される ** POST [#zed0bd09] - [[HTMLフォームからAPIGatewayを使ってAWS LambdaにPOSTする - Qiita>https://qiita.com/satetsu888/items/40fc387735192b794da8]] この設定をしておけば、下記ようなフォームのPOSTリクエストが、良い感じにJSONにマッピングされてLambda functionを呼び出すことができます。 * デプロイ [#ab568ced] ** [[Makefile]] [#nbca4ffb] - [[AWS LambdaのFunctionを開発するときのMakefile - c-bata web>http://nwpct1.hatenablog.com/entry/lambda-makefile]] LambdaだけならAWS CLIで十分簡単に操作出来るのでMakefileを用意してみました。 ** [[AWS-CLI]] [#x87650dd] - [[ステップ 2.3: Lambda 関数を作成する - AWS Lambda>https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-userapp-walkthrough-custom-events-upload.html]] $ aws lambda create-function \ --region us-west-2 \ --function-name helloworld \ --zip-file fileb://file-path/helloworld.zip \ --role role-arn \ --handler helloworld.handler \ --runtime nodejs6.10 \ --profile adminuser - [[AWS CLI による Lambda Layer のアップデートについて - Qiita>https://qiita.com/qjuliar/items/019a315a1b9885a1b056]] 調査中なので割愛しますが、アップデートする際に「LastUpdateStatus」という状態があり、これが「InProgress」になっているとアップデート(上書き)出来ないようになっており、このタイミングで「update-function-configuration」をかけて失敗したものと思っています。 - [[AWS Lambda関数の呼び出しがAWS CLI v2にアップデートすると失敗する | DevelopersIO>https://dev.classmethod.jp/articles/aws-cli-v2-blob-default-base64/]] (2021/05/24) バイナリパラメーター(blob)を指定する際にはBase64でエンコードしてね、ということです。lambda invokeの--payloadはblobで指定することになっています。 * 関連 [#k2fef376] #related