CloudFormationでLambda関数デプロイ(超初歩)

## 概要

Lambda関数デプロイ自動化に向けたCloudFormationによるLambda関数のデプロイ
**※この記事の目標はS3においてあるpythonのzipファイルからLambda関数を作成するところまでです。**

:new: 2018-11-15更新
プロパティについて詳しくまとめた記事書きました
[AWS::Lambda::Functionのプロパティ](https://qiita.com/da-sugi/items/f643a4418cde920daf6f)

## 参考資料

基本は[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-code)を参考にする

## 準備
### 1.Lambda関数にするpythonファイル

無駄にゴリゴリ書いても余計な考えが入っちゃうので今回はシンプルに↓こんなん

```py:test.py
# coding: utf-8

def lambda_handler(event, context):
    print "OK!!"
```

### 2. zipファイル

先程のtest.pyをzip形式で圧縮して,任意のS3のバケットにアップロードする

### 3. テンプレートファイル準備

公式ドキュメントによると`AWS::Lambda::Function`に必要なプロパティは下記のようになっている(JSON)

#### テンプレート

```json
{
  "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, ... ]
  }
}
```

ここからとりあえず必要なものを残すと↓

```json
{
  "Type" : "AWS::Lambda::Function",
  "Properties" : {
    "Code" : Code,
    "Description" : String,
    "FunctionName" : String,
    "Handler" : String,
    "Role" : String,
    "Runtime" : String,
  }
}
```

#### プロパティの説明

- Code (必須項目)
    - バケット内のファイルを指すことも、ソースコードをインラインテキストとして指定することもできます。
        - バケット内ファイル指定
            - S3Bucket: zipファイルを配置したバケット名を入れる
            - S3Key: zipファイル名(拡張子までつける)
- Description
    - 関数の説明
- FunctionName
    - 関数の名前
        - ここを指定しない場合,AWS CloudFormation は一意の物理IDを生成し、そのIDを関数名とするので,設定しておいたほうが良いでしょう
- Handler (必須項目)
    - Lambdaがコードの実行を開始するために呼び出す **(ソースコード内の)** 関数の名前
- Role (必須項目)
    - AWSサービスにアクセスするコードを実行するときにLambdaが引き受けるIAM実行ロールのARN
        - ※ここだけ自分で作ったRoleだとうまく実行できなかったので公式ドキュメントのサンプルを参考にしました:pray:
            - https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/quickref-lambda.html
- Runtime (必須項目)
    - アップロードするLambda関数のランタイム環境




### 4. 以上とドキュメントからテンプレートファイルを作成する

※任意のところには**※(米印)**を入れておきます。

```json
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Description" : "※sample of cloudformation template for deploying a lambda function form S3.",
  "Resources" : {
    "※HelloSample": {
      "Type" : "AWS::Lambda::Function",
      "Properties" : {
        "Code" : {
          "S3Bucket" : "※S3のバケット名",
          "S3Key" : "※test.zip"
        },
        "Description" : "※test deploy lambda template",
        "FunctionName" : "※test_lambda_function",
        "Handler" : "※test.lambda_handler",
        "Role" : { "Fn::GetAtt" : ["LambdaExecutionRole", "Arn"] },
        "Runtime" : "python2.7",
      }
    },
    "LambdaExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [{ "Effect": "Allow", "Principal": {"Service": ["lambda.amazonaws.com"]}, "Action": ["sts:AssumeRole"] }]
        },
      }
    }
  }
}
```

### 5. CloudFormationでスタック作成
#### 5-1. テンプレートをAmazonS3にアップロード

先程作成したテンプレートファイルをアップロードする。
<img width="1401" alt="スクリーンショット 2018-11-13 21.44.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/133737/c6fe6093-b7a5-a354-6617-ef670fcaa386.png">


#### 5-2. 詳細の設定

スタックの任意の名前を入力する
※今回は `test-deploy-lambda-function` という名前に設定します。
<img width="1416" alt="スクリーンショット 2018-11-13 21.44.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/133737/21fcc0ac-52e3-5e4e-9357-a8f9e568e4d7.png">


#### 5-3. オプション

特にデフォルトのままでいいが,タイムアウトのみ念のため,設定する(5分くらい)
<img width="859" alt="スクリーンショット 2018-11-13 21.45.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/133737/0098ae81-12c5-ac44-6656-9da2656acb26.png">


#### 5-4. 作成

以上の設定で `作成` ボタンを押下する

**以上**

## 確認
##### 作成ボタンを押してすぐにスタックの詳細画面に行くと既に,Lambda関数をdeployしてくれている様子
<img width="941" alt="スクリーンショット 2018-11-13 21.47.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/133737/2adc701f-2297-7882-8291-3577a02dc925.png">


##### 指定した名前でLambda関数が作成されているか

<img width="1124" alt="スクリーンショット 2018-11-13 21.48.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/133737/e24e28ff-7280-470d-a04a-e49c3a07da33.png">


##### 中身はtest.pyの内容か

<img width="1283" alt="スクリーンショット 2018-11-13 21.49.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/133737/559840a4-cdb8-3c4b-4e62-4591279c2e2c.png">


##### Handlerも指定したものになっているか

<img width="1283" alt="スクリーンショット 2018-11-13 21.49.05 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/133737/c34f0018-0734-e4b3-1b2e-2ca153d45ff8.png">


### おわり

今回は全然実践的ではなく初歩になってしまいましたが,ここまでたどり着くのに3日間くらいかかったのでとりあえずここまでできればあとはテンプレートのプロパティ駆使して実践的なことができるようになるかと....

何かの参考になれば:pray: