MacのローカルでServerless Frameworkを使ってみよう

## 概要

MacのローカルにServerless FrameworkをいれてAWSのlambdaに反映してみる。

## 前提

今回のServerless FrameworkはNode.js 20.Xでlambda関数を作成する。

MacのローカルにはNode.jsが入っており、そのNode.jsはvoltaにより管理されている。
下記コマンドを実行して、command not foundにならないこと。またNode.jsのバージョンが20.Xになっていること。

```sh
npm -v
node -v
volta -v
```

MacのローカルにはAWS CLIがはいっており、下記コマンドを実行して、command not foundにならないこと。

```sh
aws -h
```

AWSのアカウントを保持しており、下記を実行した結果がそのアカウント情報と一致していること（アクセスキーとシークレットキーはAWSのマネジメントコンソールログイン後、IAMに移動し、当該ユーザーの詳細に移動し、「アクセスキー」の部分で確認する事ができる。シークレットキーはあとから確認できないため、わからなかったら「アクセスキー」を作り直してしまう方が早い。作り直すときは「AWSの外部のサービスから使用・・・」的なものを選んでアクセスキーを作成する）

```sh
aws configure
```

## 方法

1. 下記を実行してServerless Frameworkのグローバルインストール

    ```sh
    npm install -g serverless
    ```

1. 下記を実行してserverless.ymlファイルを作成して展開

    ```sh
    touch serverless.yml
    vi serverless.yml
    ```

1. serverless.ymlを下記のように記載

    ```serverless.yml
    service: test-serverless
    
    provider:
      name: aws
      runtime: nodejs20.x
    
    functions:
      hello:
        handler: handler.hello
        events:
          - http:
              path: hello
              method: get
    ```

1. 下記を実行してServerless Frameworkの新規プロジェクトを作成

    ```sh
    serverless
    ```

1. 下記のようにでたら「Login/Register」を選択してEnterを押下（押下後、ブラウザが開く。）

    ```sh
    ? Serverless Framework V4 CLI is free for developers and organizations making less than $2 million annually, but requires an account or a license key.
    
    Please login/register or enter your license key: … 
    ❯ Login/Register
      Get A License
      Enter A License Key
      Explain Licensing Basics
    ```

1. アカウントを持っていない場合作成、持っている場合ログイン（筆者は持ってなかったので作成）

    ![CleanShot 2024-07-15 at 12.29.21@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/053ac031-4310-40db-7cd8-e3ffb0328ea4.png)

1. 下記の様にきかれた「AWS / Node.js / HTTP API」を選択してEnterを押下

    ```sh
    ? Select A Template: … 
    ❯ AWS / Node.js / HTTP API
      AWS / Node.js / Express API
      AWS / Node.js / Express API with DynamoDB
      AWS / Node.js / Scheduled Task
      AWS / Node.js / Simple Function
      AWS / Python / HTTP API
      AWS / Python / Flask API
      AWS / Python / Flask API with DynamoDB
      AWS / Python / Scheduled Task
      AWS / Python / Simple Function
    ```

1. 下記のように聞かれたら「test-serverless-project」と入力してEnterを押下

    ```sh
    ? Name Your Project: › test-project
    ```

1. 下記のように聞かれたら「Create A New App」を選択してEnterを押下

    ```sh
    ? Create Or Select An Existing App: … 
    ❯ Create A New App
      Skip Adding An App
    ```

1. 下記のように聞かれたら「test-serverless」と入力してEnterを押下

    ```sh
    ? Name Your New App: › 
    ```

1. ディレクトリを作成し移動（ディレクトリ名は先に指定したプロジェクト名）

    ```sh
    cd test-project
    ```

1. 下記を実行してnpmパッケージをインストール

    ```sh
    npm init -y
    npm install
    ```

1. handler.jsを開き、内容を確認
1. このタイミングで後述する記事の内容を参考にデプロイ対象リージョンの設定を行っておいてください。筆者は設定せず進めたのでバージニア北部にlambdaが作られました。 参考になる　記事はこちら → [Serverless Framework 特に設定せずデプロイしたらバージニア北部のlambdaにデプロイされた](https://qiita.com/miriwo/items/8ee5a78825c4a12c289e) 
    誤って別リージョンにリソースを作ってしまった場合の削除方法はこちら → [Serverless Framework デプロイで作成したリソース群を削除する](https://qiita.com/miriwo/items/55476a8a085824420625)
1. 下記を実行してAWSのlambdaにデプロイを実施

    ```sh
    serverless deploy
    ```

1. 下記のように出たらおそらくデプロイは完了している（設定ミスでバージニア北部のlambdaに追加されてしまった模様、、、）

    ```sh
    Deploying "test-project" to stage "dev" (us-east-1)

    ✔ Service deployed to stack test-project-dev (85s)
    ```

1. バージニア北部のリージョンにデプロイされてしまう問題は別で解決するとして、AWSにログインしlambdaを確認
1. たしかにlambdaが作成されている（コードの内容も先に確認したローカルのhandler.jsと一致している）

    ![CleanShot 2024-07-15 at 13.20.19@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9bf448c1-93dc-4304-e907-b5d882ef1d9a.png)

1. さらにAPI　Gatewayなんかも自動で作成されている

    ![CleanShot 2024-07-15 at 13.21.11@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9d7c65c0-eb17-62ed-518c-419fd269e1a0.png)

ここまでできたら一旦作業は完了