【AWS】Lambda ~ Lambda で気を付ける事項 ~

■ はじめに

Lambda で気を付ける事項を細々とまとめていく。

目次

【1】気を付ける事項
 1)作成するアプリは、冪等性であるべき
 2) デフォルトの時間/タイムゾーンは、日本時間じゃない
 3)頻繁にリリースする場合、リリースバージョンの運用・管理を考えておく
【2】制限事項
 1)前回の状態を保持しない
 2)RDSへのアクセスにはVPCに関連することが必要
【3】その他・Lambda仕様

 【1】気を付ける事項

1)作成するアプリは、冪等性であるべき
2) デフォルトの時間/タイムゾーンは、日本時間じゃない
3)リリースバージョンを上がってくるので、運用・管理を考えておく

1)作成するアプリは、冪等性であるべき

 * 作成するアプリは、冪等性(※)であるべき
  => AWS Lambdaで保証しているのは最低1回実⾏することであり1回しか実⾏しないことではなく
     2回起動される可能性もあるので、DynamoDBを利⽤するなどして冪等性を担保する必要がある

※:冪等性(べきとうせい)とは?

 * ある操作を、1回行っても複数回行っても、結果が変わらない特性

2)デフォルトの時間/タイムゾーンは、日本時間じゃない

対応策

 * 環境変数を TZ・Asia/Tokyo に変更する

公式サイト:Lambda 関数で使用できる環境変数
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html

3)頻繁にリリースする場合、リリースバージョンの運用・管理を考えておく

* Lambda には、リリースバージョンがある
 => 頻繁にリリースする場合、以下のような事項を考慮して、
  バージョンの運用・管理を決めておく必要がある
 ~~~~~~~
 [1] v1.0.997, v1.0.998, v1.0.999 ... のようにオーバフローしないようにする
 [2] 古いバージョンをどのタイミング消すか
 ~~~~~~~

 【2】制限事項

 1)前回の状態を保持しない

 => 上記「気を付ける事項」の「【1】作成するアプリは、冪等性であるべき」に関連

 2)RDSへのアクセスにはVPCに関連することが必要

VPC(Virtual Private Cloud;仮想プライベート・クラウド

 * Amazon RDS DBインスタンス / Amazon EC2インスタンス にアクセスする場合、
   VPCに関連付ける必要がある

 => ただし、VPC 設定を追加した場合、
    Lambdaのデフォルトのアクセス設定(パブリックインターネット経由でのアクセス)は失われる

 => VPC リソースとパブリックインターネットの両方にアクセスする必要がある場合は、
    VPC 内に NAT (Network Address Translation) を設定する必要がある

公式サイト
https://aws.amazon.com/jp/premiumsupport/knowledge-center/internet-access-lambda-function/
http://aws.typepad.com/aws_japan/2016/02/access-resources-in-a-vpc-from-your-lambda-functions.html
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/vpc.html

追加の考慮事項

 * Lambda 関数に VPC 設定を追加した場合、
 関数でアクセスできるのは、その VPC 内のリソースのみになります。

 * Lambda 関数から VPC リソースとパブリックインターネットの両方に
 アクセスする必要がある場合は、
   VPC 内に NAT (Network Address Translation) インスタンスが必要になります。

 * Lambda 関数が VPC 内で動作するように構成されている場合、
 追加の ENI の使用を開始するペナルティが発生します。
   これは、ネットワークリソースに接続する際に
 アドレス解決が遅延する場合があることを意味します。

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

より一部抜粋
~~~~~~~~~~~~
プライベートサービスまたはリソースへのアクセス

デフォルトでは、お客様のサービスや API に AWS Lambda がパブリックインターネット経由でアクセスできます。
ただし、API やサービスがこのように公開されていない場合があります。
通常、これらのリソースは、パブリックインターネット経由でアクセスできないように、
Amazon Virtual Private Cloud (Amazon VPC) 内に作成します。
これらのリソースは、(略)Amazon RDS インスタンスなどの AWS サービスリソースです。
独自の EC2 インスタンスで実行する独自のサービスを作成することもできます。
デフォルトでは、Lambda 関数から VPC 内のリソースにアクセスすることはできません。

AWS Lambda はデフォルトでは VPC 内で安全に関数コードを実行します。
ただし、Lambda 関数からプライベート VPC 内のリソースにアクセスできるようにするには、
VPC サブネット ID やセキュリティグループ ID など、追加の VPC 固有設定情報を指定する必要があります。
AWS Lambda はこの情報を、関数がプライベート VPC 内の他のリソースに
安全に接続できる Elastic Network Interface (ENI) のセットアップに使用します。
~~~~~~~~~~~~

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

 【3】その他・Lambda仕様

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

より一部抜粋 
 * 最大稼働時間は、5分間
  => システム全体のアーキテクチャを考えた際に、小さい部品を組み合わせるように設計する

 * 圧縮 .zip/.jar のサイズ 50MB / 非圧縮時のサイズ 250MB

 /tmp領域

一時的な領域として、/tmp領域が使用可能だが、以下の事項に注意する 
 * 使用領域の最大は、512MB
 * 前回のファイルが残っている可能性がある

参考文献

https://qiita.com/nullian/items/39ecf1f6d0194b72e8e6

 関連記事

Lambda ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2017/04/05/235618