Lambdaテンプレート_AWS SAM版

# はじめに

以前、CloudFormationで単純なLambda関数を作成するテンプレートを記事にしました。

https://qiita.com/a_b_/items/12e3002998d22dfb6385

今回は、AWS SAMで作りましたのでそちらも記事にします。
Cloud9上のAWS Toolkitで実行することを想定しています。

# テンプレート

以下に、テンプレートの解説をしていきます。

## フォルダ構成

CloudFormationとは異なり、ファイルが複数に分かれています。フォルダの構成を以下のようにしました。

```
sample-sam
├── function
│   ├── function.py
│   └── requirements.txt
└── template.yaml
```

- `function/function.py`
    - Lambda関数のスクリプトを記述するファイル。
- `function/requirements.txt`
   - Lambda関数で使うPythonのライブラリを記述するファイル。
   - 今回は外部のライブラリは使わないので0バイト。忘れないように置いているだけ。
- `template.yaml`
    - 構成の設定を記述するファイル。ほぼCloudFormationと同じ。

## 各ファイルの中身
### `function/function.py`

単純に文字列をprintして、リターンするだけのものです。

```
def lambda_handler(event, context):

    print('sample function')
    return {
        'statusCode': 200,
        'body': 'Hello from Lambda!'
    }
```
### `template.yaml`

内容は[以前の記事のCloudFormationのもの](https://qiita.com/a_b_/items/12e3002998d22dfb6385)と一緒です。

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: SAM Template for Lambda Function

Parameters:
    LambdaFunctionName:
        Type: String
        Default: "testfunction001"

Resources:
    FunctionRole:
        Type: AWS::IAM::Role
        Properties:
            RoleName: !Sub "for-lambdafunction-${LambdaFunctionName}"
            AssumeRolePolicyDocument:
                Version: 2012-10-17
                Statement:
                    -   Effect: Allow
                        Principal:
                            Service:
                                - lambda.amazonaws.com
                        Action:
                            - 'sts:AssumeRole'
            Path: '/service-role/'
            Policies:
                # CloudWatch
                -   PolicyName: write-cloudwatchlogs
                    PolicyDocument:
                        Version: 2012-10-17
                        Statement:
                            -   Effect: Allow
                                Action: 
                                    - 'logs:CreateLogStream'
                                    - 'logs:PutLogEvents'
                                Resource: !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/${LambdaFunctionName}:*"

    FunctionLogGroup:
        Type: AWS::Logs::LogGroup
        Properties:
            LogGroupName: !Sub /aws/lambda/${LambdaFunctionName}
            RetentionInDays: 3653
            
    TargetFunction:
        Type: AWS::Serverless::Function
        Properties:
            FunctionName: !Ref LambdaFunctionName
            Role: !GetAtt FunctionRole.Arn
            CodeUri: function/
            Handler: function.lambda_handler
            Runtime: python3.9

```
1点、パラメータにデフォルト値を設定しています。
これは、AWS Toolkitのウィザードでデプロイしようとすると、デフォルトのパラメータが無い場合は`.aws/templates.json`というファイルで宣言するように促されるのですが、このファイルの記載の仕方がわからないので、デフォルト値を使うようにするためです。
どなたか、`.aws/templates.json`の記法をご存じの方は教えてください。

# 使い方 On Cloud9

まずはCloud0にファイル群を置きます。Fileからファイルアップロードを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/2d4bef87-a174-c3d1-ed87-fc569483c67d.png)

ポップアップが出てきます。ここに、フォルダごとドラッグアンドドロップすれば、フォルダごとアップしてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/43252f25-4fdf-b06b-0382-efd0aa8437f3.png)

後は以前書いた記事を参考にしていただければ、デプロイできます。

https://qiita.com/a_b_/items/6b02e08ecacdd21524c2

1点、以下の画面の様にパラメータを上書きするか聞かれますが、デフォルト値を使う場合は"No"を選んでください。
`.aws/templates.json`の記法がわかり、そちらで宣言したい方はYesを選んでください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/001e72ff-38a1-e480-6d99-26c7bd70381a.png)

他は前の記事の通りです。
ここから少しずつブラッシュアップしていく、という使い方を考えています。

# おわりに
Lambda関数のテンプレートをAWS SAMで作りました。
CloudFormationだとどうしてもLambda関数のスクリプトを直書きするか、別ファイルにしてZip圧縮してS3にアップして・・・、と手間でしたが、AWS SAMだと、圧縮してS3アップをやってくれるので、手間が非常に軽減できて、開発がスムーズにできそうです。