Serverless FrameworkとDockerでLambda環境を構築する

## 概要
Lambdaを今まであまり使ってこなかったので勉強ついでにローカル実行とデプロイまで一通りできる環境を構築したいと思います。

## 前提条件
- Dockerがインストール済みであること
- Awsアカウントを作成済みでアクセスキー、シークレットキーを発行済みであること

## コンソールから関数を作ってみる
まずはどんなものかコンソールから関数を作ってみる。

### 1. 関数の作成
Lambda > 関数に遷移 > 関数の作成

![スクリーンショット 2023-08-15 20.35.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/9fe51b47-f20d-ac97-80b3-125b5979d8c1.png)

ランタイム: Node.js 18.x
アーキテクチャ: arm64

で作成しました。

### 2. コード作成

```javascript
export const handler = async (event) => {
  // TODO implement
  const response = {
    statusCode: 200,
    body: JSON.stringify('hello world !!'),
  };
  return response;
};

```

とりあえず「hello world !!」だけ直してDeploy。

### 3. テスト
テストタブに移動してテストボタンを押下
![スクリーンショット 2023-08-15 21.02.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/e812d3ee-8b88-22b6-7fec-cecb6ed6d36b.png)
いけてるっぽい。簡単だね！

## Node.jsのローカル実行環境を用意する
### 1. Node.jsのバージョンを確認
さっきのLambda関数にバージョン表示を仕込む
```javascript
console.log(process.versions);
```
結果
![スクリーンショット 2023-08-15 22.18.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/e18fca12-b620-fd07-39bf-eae0a4f044a6.png)
18.16.1とのこと

### 2. Docker設定

Dockerfileを作成
```Dockerfile
FROM node:18.16.1-alpine

# アプリケーションディレクトリを作成する
WORKDIR /usr/src

RUN apk update && apk add git
```

docker-compose.ymlを作成
```yml
version: "3.9"

services:
  app:
    tty: true
    build: ./
    volumes:
      - .:/usr/src
    ports:
      - 12345:3000
```

実行する
```bash
docker compose up -d
```

コンテナに入って確認
```bash
docker compose exec app ash
node -v 
```
結果
![スクリーンショット 2023-08-15 22.24.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/542262bd-74d6-9715-f919-941f122f7fd3.png)
OK!
## serverlessを設定
Serverless Frameworkなるものがあるらしい。Lambda関数のデプロイやローカル実行などが可能とのことなので入れてみる。前提としてNode.jsが必要だが上記で構築済み

https://www.serverless.com/framework/docs/getting-started

### 1. インストール
コンテナに入った状態でグローバルインストール
```bash
npm install -g serverless
serverless -v
```
![スクリーンショット 2023-08-17 0.00.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/a5d267ad-b29e-ca61-85ce-bc9eb91f6b18.png)
いけてそう

### 2. serverlessコマンドで各種設定
```
serverless
```
具体的には以下。
![スクリーンショット 2023-08-15 22.43.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/e7debaa0-0ba5-0e7e-cd2e-5c13f5048abb.png)
この時にAwsのキーを設定する。以下のファイルが作成されて追加される。今回はコンテナ内で構築してるので破棄したら消えます。永続化しないとね...
```bash
~/.aws/credentials
```

serverlessコマンドで設定が終わると以下のファイルが作成される
```
├── {projectName}/
│   ├── .gitignore
│   ├── index.js
│   ├── serverless.yml
│   └── README.md 
```
### 3. serverless.ymlを修正
デフォルトからいくつか調整
```yml
service: houshima-devel-video-uploader
frameworkVersion: '3'

provider:
  name: aws
  region: ap-northeast-1
  runtime: nodejs18.x
  stage: beta

functions:
  handle:
    handler: index.handler
```

## ローカルで実行
作成されたindex.jsはこんな感じ
```javascript
module.exports.handler = async (event) => {
  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: 'Go Serverless v3.0! Your function executed successfully!',
        input: event,
      },
      null,
      2
    ),
  };
};
```

ローカルで実行するコマンドは以下
```bash
sls invoke local --function handle
```
実行結果
![スクリーンショット 2023-08-17 0.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/1add64ed-4166-1e7f-2633-efb2df258120.png)
いけてるね！

## デプロイ
以下がコマンド
```bash
sls deploy
```
実行結果
![スクリーンショット 2023-08-17 0.40.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/d346eddd-6e51-beed-5609-84dd6d6e5bb3.png)
コンソール
![スクリーンショット 2023-08-17 0.29.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/11f1406a-a868-e47b-7fde-808560c0a606.png)
できた！

※ちなみにプロジェクト名など含めて長すぎるとエラーになります。
![スクリーンショット 2023-08-17 0.31.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/dfdc050d-ae70-f88a-a9e3-12239a49f5c0.png)

## まとめ
今回の全体像としてはこんな感じ
```
├── {projectName}/
│   ├── .gitignore
│   ├── index.js
│   ├── serverless.yml
│   └── README.md 
├── docker-compose.yml
├── Dockerfile
└── README.md 
```
Lambdaのローカル開発環境とデプロイの仕組みを少ない工数で実装することができました。

## 最後に運動通信社について
運動通信社は「日本を世界が憧れるスポーツ大国にする」というビジョンを達成するべく、一緒に働く仲間を募集しています！
PMやアプリエンジニア、Webエンジニアなど色んな職種を募集しておりカジュアル面談大歓迎なので是非採用フォームよりご連絡ください！
ぜひ一緒に、自分たちも世の中もワクワクするサービスを作りましょう！

https://sportsbull.jp/about/#recruit

Greenも活用中です

https://www.green-japan.com/company/9598