AWS::Lambda::Functionのプロパティ

## 概要

前回の記事を書いた時,必要最低限のものしか設定していなかったので,
それぞれのプロパティがどんなものなのかメモ残しておく

### 参考資料
[AWS::Lambda::Function](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)
公式ドキュメントを参考にしています。

## AWS::Lambda::Function
### テンプレートファイル(sample)

コメント書けるのでyaml形式で記述していきます。

```yaml
Type: "AWS::Lambda::Function"
Properties: 
  Code:
    Code
  DeadLetterConfig:
    DeadLetterConfig
  Description: String
  Environment:
    Environment
  FunctionName: String
  Handler: String
  KmsKeyArn: String
  MemorySize: Integer
  ReservedConcurrentExecutions: Integer
  Role: String
  Runtime: String
  Timeout: Integer
  TracingConfig:
    TracingConfig
  VpcConfig:
    VPCConfig
  Tags: 
    Resource Tag
```

それぞれのプロパティに関して説明していきます。

### Code

Lambda関数のソースコード
ここはインラインで直接テンプレートファイルに書くこともできますし,S3に配置したzipファイルを指定することもできます。

#### インラインで書く場合

- ポイント1: インラインで書く場合は**ZipFile**というプロパティを指定する
- ポイント2: インラインでコードを書く場合には`|`をまず記述して次の行からか

```yaml
#必須
Code:
  #必須
  ZipFile: |
    # coding: utf-8
    
    def handler(event, context):
      print "Hello World"
```

#### S3のzipファイルを使用する場合

- ポイント1: zipファイルが存在するS3のバケットの名前を指定する。
    - ※S3のzipファイルを使用する場合は必須
- ポイント2: S3内のzipファイルが存在する場所(パス)と名前(拡張子まで)を指定する
    - ※S3のzipファイルを使用する場合は必須
- ポイント3: バージョニングが有効なS3を使用する時に,zipファイルのバージョンIDを指定することができる
    - ※この値は任意

```yaml
#必須
Code:
  #必須
  S3Bucket: "S3_Bucket_Name"
  #必須
  S3Key: "lambda/hoge.zip"
  #任意
  S3ObjectVersion: "xxxxxxxxxxx"
```

### DeadLetterConfig

- ポイント: Lambdaがイベントを処理できないときに送信するデッドレターキューのARNを指定する。
※**AmazonSNSトピック**または**AmazonSQSキュー** 

- ポイント1: TargetArnというオプションに

```yaml
#任意
DeadLetterConfig:
  TargetArn: "arn:aws:sns:xxxxxxxxxxxxxx"
```

DeadLetterConfigについて詳しくは[これ](https://dev.classmethod.jp/cloud/aws/lambda-supports-dead-letter-queue/)とかを見てもらえると

### Description

関数の説明を記述する項目

```yaml
#任意
Description: "説明"
```

### Environment

- ポイント: Lambdaが使用できる環境変数のキーと値のペアを指定する

```yaml
#任意
Environment:
  Env: "dev"
  S3_ACCESS_KEY: "xxxxxxxxxx"
```

### FunctionName

- ポイント: 関数の名前
    - ※指定しない場合は一意の物理IDを生成し、そのIDを関数名として設定される

必須ではないですが,設定しておいた方がいいでしょう
ただし,名前を指定すると、このリソースの置換が必要な更新はできない

```yaml
#任意
FunctionName: "example-lambda-function"
```

### Handler

Lambdaがコードの実行を開始するために呼び出す(ソースコード内の)関数の名前。
※前述したfunctionNameとは別物

#### インラインでコードを記述した場合

- ポイント: インラインでコードを書いた場合は,**index.**をつける

```yaml
#必須
## index.{関数名}
Handler: "index.handler"
```

#### S3のzipファイルを使用する場合

- ポイント: S3のzipファイルを使用する場合は実行したい関数があるファイル名と関数名を記述する

```yaml
#必須
## {ファイル名}.{関数名}
Handler: "main.handler"
```

### KmsKeyArn

- ポイント: Lambdaが環境変数値を暗号化および復号化するために使用するKMSのARNを指定する

```yaml
#任意
KmsKeyArn: "arn:aws:kms:***********"
```

KMSについて詳しくは[これ](https://dev.classmethod.jp/cloud/aws/10minutes-kms/)とかを見てもらえると

### MemorySize

- ポイント: Lambda関数に割り当てるメモリ量(MB)を指定する

```yaml
#任意
MemorySize: 1024
```

### ReservedConcurrentExecutions

- ポイント: 関数用に予約する最大同時実行数を指定する
    - ※デフォルトは1000

```yaml
#任意
ReservedConcurrentExecutions: 1000
```

### Role

- ポイント: AWSサービスにアクセスするコードを実行するときにLambdaが引き受けるIAM実行ロールのARN

```yaml
#必須
Role: "arn:aws:iam::***********"
```

### Runtime

- ポイント: Lambda関数のランタイム環境を指定する。
    - 有効な値
        - nodejs
        - nodejs4.3
        - nodejs6.10
        - nodejs8.10
        - java8
        - python2.7
        - python3.6
        - dotnetcore1.0
        - dotnetcore2.0
        - dotnetcore2.1
        - nodejs4.3-edge
        - go1.x

```yaml
#必須
Runtime: "python2.7"
```

### Timeout

- ポイント: Lambda関数が実行されてからタイムアウトにする時間を指定する
    - ※最大300秒

```yaml
#任意
Timeout: 300
```

### TracingConfig

- ポイント: AWS X-Rayを使用してLambda関数の追跡とモニタリングをする場合は設定する
    - ※デフォルトは**PassThrough**
    - 有効な値
        - PassThrough
        - Active

TracingConfigに関して詳しくは[これ](https://dev.classmethod.jp/cloud/aws/aws-x-ray-support-aws-lambda/)を見ていただけると

```yaml
#任意
TracingConfig: "Active"
```

### VpcConfig

Lambda関数がVPCのリソースにアクセスする必要がある場合に指定する

- ポイント: VpcConfigを設定する場合は以下の2つが必須項目となる
    - SecurityGroupIds
        - Lambda関数がアクセスを必要とするリソースが含まれるVPC内の1つ以上のセキュリティグループのID 
    - SubnetIds
        - Lambda関数がアクセスを必要とするリソースが含まれるVPC内の1つ以上のサブネットのID

```yaml
#任意
VpcConfig:
  #必須
  SecurityGroupIds:
    - "***********"
    - "***********"
  #必須
  SubnetIds:
    - "***********"
    - "***********"
```

### Tags

- ポイント: Lambdaに関するタグの**キー**と**値**をセットする
    - ※タグを使用して関数をグループ化し、フィルタリングできる

```yaml
#任意
Tags:
  "キー名1": "値1"
  "キー名2": "値2"
```