Serverless FrameworkでAWS Lambdaの開発環境を簡単構築

#はじめに
以前Lambdaを使ってSlack通知を飛ばすような機能をつくったのですが、コンソール上でコードをベタ書きしていたのでデバッグに非常に手間がかかりました。

https://qiita.com/suzuki0430/items/50b72dc936abe58c4ebf

最近の社内勉強会でServerless Frameworkの存在を知り、これを使えばローカル環境で関数をコーディングしてAWSに簡単にデプロイできるということを知ったので早速勉強してみることにしました。

今回の記事では、Serverless Frameworkのインストールからデプロイまでの流れを簡単にまとめました。
**これからServerless Frameworkを使ってみたいという初心者の方向けの内容**となっています。　

#Serverless Frameworkとは
Serverless Frameworkはサーバーレスなアプリケーションを簡単に開発、デプロイするためのツールです。

AWS、Azure、GCP等のクラウドサービスによらず利用することができ、クラウドサービスで使用できる言語(AWSであればC#, Node.js, Pythonなど)を利用することができます。
また、デプロイコマンドを実行することでクラウドサービスのリソースを構築することができます。
例えばAWSだと、ローカルで作成したLambdaのスクリプトとあわせて、Lambdaと連携するDynamoDBやAPI Gatewayなどのリソースも構築することができます。

https://www.serverless.com/

#実装
インストール、serverlessテンプレートの作成、デプロイの流れをそれぞれ簡単にまとめました。

##インストール
インストールの流れは以下になります。

1. nodeのインストール
2. serverlessのインストール
3. IAMユーザの作成
4. Serverless FrameworkにIAMユーザを設定

###nodeのインストール
```
brew install node
```

###serverlessのインストール
```
npm install -g serverless
```

###IAMユーザの作成
AWSコンソールでIAMを開き、新しくIAMユーザを作成します。
Serverless FrameworkからAWSにアクセスするため、「プログラムによるアクセス」をチェックします。
![スクリーンショット 2021-04-30 21.40.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/55e9433e-839e-55cf-6226-791abb81d9f5.png)

既存のポリシーである「AdministratorAccess」を選択し、IAMユーザを作成します。
![スクリーンショット 2021-04-30 21.42.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/72b04a4e-6a25-95e9-8741-c6bc61ec1802.png)

###Serverless FrameworkにIAMユーザを設定
IAMユーザの作成後画面にアクセスキーIDとシークレットアクセスキーが表示されるので、これらを控えます。
ターミナルで以下のコマンド(XXX: アクセスキーID、YYY: シークレットアクセスキー)を実行します。

```
serverless config credentials --provider aws --key XXX --secret YYY --profile serverless-admin
```

##serverlessテンプレートの作成
テンプレート作成のあとに、Lambda関数とserverless.ymlの中身を記述します。

###テンプレート作成
以下のコマンドでテンプレートを作成します。

```
sls create --template aws-python --path [テンプレート名]
```

使用する言語によって、`aws-python`の箇所を`aws-nodejs`などに置き換えます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/dce1fb0d-b878-9002-a999-cfdbaebb4746.png" width="200">

###Lambda関数の作成
`hi !`と表示されるだけのスクリプトです。

```py:handler.py
def hello(event, context):
    print("hi !")
    return "hello-world"
```

###serverless.ymlの作成
Lambdaのスクリプトをデプロイするときのクラウドサービスの設定をserverless.ymlに記述します。

```yml:serverless.yml
provider:
  name: aws #選択するクラウドサービス
  runtime: python2.7 #言語のバージョン
  profile: serverless-admin #IAMユーザをserverlessに設定したときのプロファイル名
  region: us-east-1 #リソースを作成するリージョン
```

##デプロイ
デプロイは以下のコマンドで実行します。

```
sls deploy -v
```
AWSコンソールでLambdaを開くと、ちゃんとデプロイされていることを確認することができます。
![スクリーンショット 2021-05-01 10.26.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/e7cea873-9b3c-1578-ca55-fd1a5ad0c94c.png)

`Test`をクリックすると、デプロイしたLambda関数の実行内容を確認することができます。
![スクリーンショット 2021-05-01 10.29.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/91b45e34-d8e0-f3fa-03bd-b0b2626cf2ad.png)

デプロイまでの大まかな流れは以上です。

##各種slsコマンド
使いそうなslsコマンドをまとめました。

###invoke
ターミナル上でLambda関数の実行内容を確認することができます。

```
sls invoke -f [function名] -l
```

###deploy function -f ~
変更した関数のみデプロイすることができます。
`sls deploy -v`よりもデプロイに時間がかかりません。

```
sls deploy function -f [function名]
```

###logs
ターミナル上でLambda関数の実行ログをリアルタイムに出力することができます。

```
sls logs -f [function名] -t
```

###remove
デプロイしたリソースをすべて削除します。
関数だけではなく、CloudWatchのロググループやIAMロールも削除します。

```
sls remove
```

#Lambdaの各種設定におけるserverless.ymlの記述
オプションをserverless.ymlに記述しておくと、関数をデプロイする際にそれらの設定を反映してくれます。

##IAM
Lambdaはデフォルトで他のAWSサービスへのアクセス権を持っていないので、アクセスが必要な際にはIAMポリシーが必要になります。
S3のデータを取得したり保存したりする場合には、以下のように`iamRoleStatements`を記述します。

```yml:serverless.yml
iamRoleStatements:
  - Effect: "Allow"
    Action:
      - "s3:ListBucket"
    Resource: { "Fn::Join" : ["", ["arn:aws:s3:::", { "Ref" : "ServerlessDeploymentBucket" } ] ]  }
  - Effect: "Allow"
    Action:
      - "s3:PutObject"
    Resource:
      Fn::Join:
        - ""
        - - "arn:aws:s3:::"
          - "Ref" : "ServerlessDeploymentBucket"
          - "/*"
```

##メモリ、タイムアウト
Lambda関数が実行時に使用するメモリ量やLambda関数が停止するまでに許可される実行時間の設定については、providerにmemorySizeとtimeoutを追記します。

```yml:serverless.yml
provider:
  name: aws
  runtime: python2.7
  profile: serverless-admin
  region: us-east-1
  memorySize: 512
  timeout: 2
```

##環境変数
Lambdaで使用する環境変数は以下のように設定します。

```yml:serverless.yml
environment:
  variable1: value1
```

#おわりに
今度はServerless FrameworkでREST APIの構築をやってみようと思います。

#参考資料

https://dev.classmethod.jp/articles/easy-deploy-of-lambda-with-serverless-framework/