#author("2021-10-21T23:58:51+00:00","default:wikiadmin","wikiadmin") #author("2023-10-30T03:33:26+00:00","default:wikiadmin","wikiadmin") #contents -イベントドリブンで軽い処理をするのに使える -ライブラリはlayerにして共有化するべし。 *layer [#tc69e31c] 出来合いのものがある!これは便利 https://github.com/keithrozario/Klayers *Lambda関数のstatusの全体適用について [#q83a4775] -以前はVPC Lambdaのみ存在したステータスがすべての関数に適用されることに鳴った。 -最新のAPIを利用していれば特に対応不要 -2021/12/06より全適用 *同時実行数の制限 [#cc38147f] -リージョンごとに1000で上限緩和申請可能 -上限超えると 429 Too Many Request -関数ごとに同時実行数を設定でき、0にすると起動しないのでジョブフロー上一時的に実行させたくない時に設定する。 *環境変数 [#k7453284] |LAMBDA_TASK_ROOT|lambda実行ディレクトリのパス。画像などもUPLOADできるので読み込みに利用できる| |PYTHON_PATH|実行時のライブラリ検索パス。いじった場合はlayerが読み込めなくなるので注意| *デプロイ [#ye50d0c5] **Layer [#aaaaf9c6] ***制限 [#t40c114e] -展開後に250Mbまで ***java [#v5696dde] lib/*.jarとなるようにアーカイブする ~java/lib/hoge.jar cd java zip -r /var/tmp/java_layer.zip lib/* **本体 [#w3a90362] *本 [#cb5e5d2d] **Pythonで作るはじめてのサーバレスアプリケーション [#w6777f49] -FLask+pynamodb(DynamoDB) https://github.com/chaingng/serverless_python_tutorial **ほぼPythonだけでサーバーレスアプリをつくろう [#sc0cb821] -Chalice AWS謹製のサーバーレス *後から入れるlibrary [#g2b67218] |request| |pytz|| *起動イベント [#c57ecd50] **CLIから起動 [#lf9c4afe] https://qiita.com/ekzemplaro/items/7dc187885dffe0be6341 -起動 aws lambda invoke --function-name simple_wget output.txt -環境変数設定 aws lambda update-function-configuration --function-name simple_wget --environment "Variables={BUCKET=my-bucket,KEY=file.txt}" -環境変数確認 aws lambda get-function-configuration --function-name simple_wget **CloudWatch events [#webb5109] 1. イベントを定義(aws_cloudwatch_event_rule) 2. イベントに対して実行する関数をターゲット指定(aws_cloudwatch_event_target) **S3 [#t16b0d20] ***S3にPUTされたらLambdaをデプロイするLambda [#oc6794f5] https://qiita.com/bowz_standard/items/c1856821be19e660f06f **SQS [#eb09379a] *terraform deploy [#p7420bb0] -差分のみデプロイする https://dev.classmethod.jp/articles/terraform-lambda-deployment/ -定期実行 https://qiita.com/ktsujichan/items/c0804f155c2cf1962ed3 *VPC Lambda [#q051ce4e] -VPCタブで変更できる。 -実行時に下記のロールが必要 -実行するほうに下記のロールが必要(作成時の権限ではないので注意!書いてあるのにハマった!) AWSLambdaVPCAccessExecutionRole -権限がないと以下のエラーが出てしまう。 The provided execution role does not have permissions to call CreateNetworkInterface on EC2 -コールドスタートの問題 かつてはENIをコールドスタートしたり、その分ENI&サブネットのIPを消費したりのデメリットがあったが、2019年に解消された。 -RDSと相性悪い問題 RDS Proxyで解消 *ローカル開発環境 [#f8ae300a] **Dockerで実行 [#s445d545] https://github.com/lambci/docker-lambda # Test a `lambda_handler` function in `lambda_function.py` with an empty event on Python 3.8 docker run --rm -v "$PWD":/var/task:ro,delegated lambci/lambda:python3.8 lambda_function.lambda_handler CentOS7のDockerだとdelegatedオプションがサポートされてないバージョンなので外すこと! **ローカルで実行 [#l3d72e31] pip install python-lambda-local echo '{"key1": "test"}' > event.json python-lambda-local -f lambda_handler lambda_function.py event.json **Serverless [#ve30737d] lambda以外にも対応している http://momota.github.io/blog/2018/11/05/serverless-framework/ *デプロイ [#dc99b250] -Zappa *イベントトリガーの一例 [#id1ab9d1] |S3へのput| |SESへの着信| |Amazon SNS からの通知の送信| *IAMロールの作成 [#u05482d3] -ロールlambda作成時に追加することもできるが、Lambdaで触りたいリソースに対するアクセス権限があるロールを付与すること -信頼関係でlambda.aws.comを追加しないとlambdaからロールを選択できない。(lambdaの画面から作成すると勝手に追加されている) **EC2のEBS Snapshotを作成削除などを許可するポリシー [#cfc2c6d6] { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:*" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": "ec2:Describe*", "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:CreateSnapshot", "ec2:DeleteSnapshot", "ec2:CreateTags", "ec2:ModifySnapshotAttribute", "ec2:ResetSnapshotAttribute" ], "Resource": [ "*" ] } ] } **CloudWatchからElasticSearchServiceへ投入を許可するポリシー [#wef6ea46] { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:*:*:*" ] }, { "Effect": "Allow", "Action": "es:ESHttpPost", "Resource": "arn:aws:es:*:*:*" } ] } *言語 [#pbe9d568] *例 [#n628e1d2] **EBSのバックアップ [#w7ab6143] https://serverlesscode.com/post/lambda-schedule-ebs-snapshot-backups/ https://serverlesscode.com/post/lambda-schedule-ebs-snapshot-backups-2/ 上記ページに従い実行した。backupというキーを設定したインスタンスのEBSのSnapshotを作成する。PartIIでは削除日を指定してSnapshotを作る機能が追加されている。 まずはlambdaに対しての信頼関係を定義して、lambaで実行すると ebs-backup-worker が付与されるようにする。 ebs-backup-workerには必要なポリシーを付与する。 *ログ [#q3633345] - console.log()したものがログストリームに行くらしい。 -通常の出力はどこかへ消える? *Parameter Storeとの連携 [#c0ed8bd6] https://qiita.com/hoto17296/items/5f17af9b5261b9f219ee #counter