AWS Serverless デジタルバッジを取得する②　Lambda編








[このデジタルバッジ](https://aws.amazon.com/jp/blogs/news/introducing-new-aws-serverless-digital-learning-badges/)取得のために、AWS Skill Builderの[このコース](https://explore.skillbuilder.aws/learn/lp/1585/serverless-learning-plan-japanese)を学習している記録

自分のスキルレベルは以下。
- SAAは取得
  - 4年前ぐらい
- 実務利用なし
  - 趣味レベルではあり

# AWS Lambda Foundations (Japanese) 日本語実写版

https://explore.skillbuilder.aws/learn/course/621/play/1727/aws-lambda-foundations-japanese;lp=1585




## アクセス許可の概要


- IAMリソースポリシー・関数ポリシー
  - Lambdaにアクセスするための許可
- IAM実行ロールポリシー
  - Lambdaからアクセスするための許可
- NW周りの注意点
  - Lambdaのある場所
    - AWSの所有するVPCにある
    - そのため、自分のVPC内にアクセスするためにENIの許可を実行ロールに付与する必要がある。
  - 一つのENIにしかアクセスすることしかできない。
    - そのため、複数のVPCにアクセスするようにNATする必要あり。
  - VPC側にも留意点あり
    - オートスケールさせるために、IPアドレス空間を確保するとか。



### 参考資料

https://docs.aws.amazon.com/lambda/latest/dg/lambda-permissions.html

https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html



## 仕組み



- イベントソース
  - トリガーする呼び出し元
    - データストア
    - エンドポイント
    - リポジトリ
    - メッセージサービス
  - イベント
    - プッシュ型
      - 同期プッシュイベント
      - 非同期プッシュイベント
    - ポーリング型
      - ストリームベース
        - シーケンス処理を重視してるので、以下終わるまで先に進まない。
          - エラー解消される
          - 有効期限切れる。
      - 非ストリームベース
        - メッセージの順序性が保証されるわけではない。
- ライフサイクル
  - 動作の流れ
    - 呼び出し
    - コンテナ起動
    - ブートストラップ
      - この辺までがコールドスタート
    - コード実行
      - ウォームスタート状態
      - リクエストが来るたび即実行
    - リクエストがないとコンテナ停止
      - コールドスタートスタートに戻る

  - 常にウォームスタートにしたい場合
    - プロビジョニングされた同時実行を有効化する
    - 留意事項も多数あり
      - 関数初期化されない等。
  - AWS X-rayで分析することも可能


- あて先指定
  - 成功時・失敗時などであて先を変更できる


### 参考資料



https://aws.amazon.com/blogs/aws/new-provisioned-concurrency-for-lambda-functions/


https://docs.aws.amazon.com/xray/latest/devguide/xray-console.html#xray-console-trace-map


## 関数の作成


- プログラミングモデル・ベストプラクティス
  - 設計
    - ハンドラメソッド
      - 呼び出すために必要
        - Handler(event,context)method
        - イベントオブジェクト
        - コンテキストオブジェクト
    - 関数をステートレスとする
      - /tmpのキャッシュはコールドスタートで消失
      - 別の場所に保存しておく
        - DynamoDBは状態情報
        - ElastiCacheは関数をVPCに配置する場合
        - S3は速度が重要でない場合
    - 必要なもののみを含める
      - 起動時間に影響する
  - コード記述
    - ログ記録ステートメントを含める
      - CloudWatcheに書き込める
    - 結果情報を含める
      - 関数では、関数の実行結果に関する情報を Lambda に渡す必要がある
    - 環境変数を利用する
    - 再帰的なコードは回避する
- コード作成
  - マネジメントコンソール
    - カスタムライブラリのない単純なもの。
    - 記載して保存すると即実行可能な関数となるため、無効化をしておく
  - Lambdaコンソールにアップロード
    - SAM CLIを使ってローカルテスト・デバッグ可能
    - 10MBの制限あり
  - S3経由でアップロード
    - 10MB制限なし。
    - CI/CD管理されてる場合。



### 参考資料

https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html

https://docs.aws.amazon.com/lambda/latest/dg/env_variables.html


##  関数の設定


- メモリとタイムアウト
  - メモリの設定をすると、比例してCPUが利用される
  - 実行時間も価格に影響するため、メモリ・CPUを大きくしたほうがコスト削減される場合もある。
  - Power Tuningを使用しての最適化
- 同時実行とスケーリング
  - デフォルトはアカウントレベルで1000
    - サポートに引き上げリクエストで増やせる
  - 関数単位で予約・制限設定することもできる
  - 同時実行予約されていない枠が最低100保持される
  - 同時実行バーストの管理
    - 同時実行の即時増加量、という設定もある
      - リージョンによって異なる
    - 同時実行の即時増加量＜アカウントの同時実行の上限の場合、１分ずつ評価して、不足していると500ずつ同時実行数を増やす
    - 関数に上限設定した場合はその設定に従う
- 同時実行の予測
  - 非ポーリングイベント
  - ストリームポーリングイベント
    - リクエスト頻度＝同時実行数 (シャード数)÷関数の平均実行時間
  - 非ストリームポーリングイベント（SQS）
- 同時実行に関する CloudWatch のメトリクス
  - ConcurrentExexcutions
  - UnreservedConcurrentExecutions:
- プロビジョニングされた同時実行
  - 常にウォームスタートすることができる。
  - 

### 参考資料

https://aws.amazon.com/about-aws/whats-new/2019/12/aws-lambda-announces-provisioned-concurrency/

https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html#configuration-concurrency-provisioned



##  サーバレスアプリケーションのデプロイとテスト
- デプロイの違い
  - CloudFormation テンプレートを使ってデプロイ
  - アカウント含めて必要
  - ローカルテストデバッグができない
    - SAM CLIを利用
- SAM
  - SAMテンプレートからCloudFormationテンプレートを作ってくれる
- SAM CLI
  - Dockerをローカル起動し、テストできる
- バージョンニング・エイリアス
  - バージョンにARNの$LATESTで指定可能
  - エイリアスで新旧のバージョンを指定することができる
    - 重みづけ・時間をずらしてデプロイすることで影響を限定する
  - LambdaはCodeDeployと統合されている。

### 参考資料
https://github.com/awslabs/serverless-application-model

https://serverlessrepo.aws.amazon.com/applications

##  モニタリングとトラブルシュート

- CloudWatch
  - モニタリング
- デッドレターキュー
  - Lambdaコンソールから設定
  - 失敗を分析
    - SNS トピック
    - SQS キュー
- CloudTrail
  - 分析・監査
- X-Ray
  - パフォーマンスチューニング
  - APIコールの呼び出しフローの特定





## まとめ・その他。
サービス概要からスタートしたので、初心者も安心。
以下みたいな資料の説明がめっちゃ見やすかったです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/284b6859-acdb-4bad-939b-3125414f3fe7.png)

動画・資料のどちらかでしか説明してない内容もあるので、その点は注意。
画像ファイルとしても保存することもできるので、スクラップしてもいいかも。