#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

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS