AWS SAMを使ってローカルでLambdaを実装、AWSにデプロイしてみた

## 概要
AWS SAMを使用することでサーバーレスアプリケーションを簡単に実装〜デプロイまですることができたので共有したいと思います。


## 対象者
- AWS SAMに興味がある方
- サーバーレスアプリケーションに興味がある方
- Lambda関数を簡単に実装〜デプロイしたい方


## 環境
- M1 Mac
- VScode
- Docker　Desktop


## 目次
- 前提
- やってみた
- 最後に


## 前提
- awsアカウントの発行
- aws cliをインストール
- aws configureでアクセスキーとシークレットキーを設定


## やってみた
簡単なLambda関数を作成し、`sam build`して`sam deploy`していきます。


### AWS SAMの準備
SAMをインストールしていきます

[AWS SAM CLI のインストール - AWS Serverless Application Model ](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/install-sam-cli.html)

以下のように表示されれば大丈夫です。
```
❯ sam --version
SAM CLI, version 1.106.0
```

### AWS Lambdaの準備
Lambda関数を作成していきます。ローカルで任意のフォルダを作成しVScodeで開きます。

まずVScodeの拡張機能から [AWS Toolkit](https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-toolkit-vscode) をインストールします。
インストールが完了したらコマンドパレットを開き以下の画像の順に選択します。

`AWS: Create Lambda SAM Application`を選択します。
![スクリーンショット 2024-01-06 18.09.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673964/6ad2e357-f947-c344-4ceb-04db80bb44d1.png)

`nodejs14.x`を選択します。
![スクリーンショット 2024-01-06 18.10.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673964/b8a7ed0a-10ed-1360-843a-d799f3261178.png)

今回はM1 Macなので`arm64`を選択します。
![スクリーンショット 2024-01-06 18.10.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673964/ce952cdb-18c1-5ab3-ebc5-9ced60bc7844.png)

今回は`AWS SAM Hello World`を選択します。
![スクリーンショット 2024-01-06 18.10.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673964/67325229-b70b-165c-b3c5-76036bdfab09.png)

ディレクトリを選択します。
![スクリーンショット 2024-01-06 18.10.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673964/2ef41f7f-89ab-030e-0d14-4dcda333efd4.png)

SAMを展開するディレクトリ名を入力します。
![スクリーンショット 2024-01-06 18.11.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673964/c0a0fe12-ba06-0285-dab0-9152902015bc.png)

設定が完了すると以下のようなディレクトリ構造になります。

```
.
└── app
    ├── README.TOOLKIT.md
    ├── README.md
    ├── events
    ├── hello-world
    ├── samconfig.toml
    └── template.yaml

```

`hello-world`ディレクトリ内を確認すると`app.js`ファイルあると思います。`lambdaHandler`関数内で`hello World`を返しているのがわかるかと思います。

### AWS SAMのビルド、デプロイ
`app`ディレクトリに移動しビルドします。
```
❯ sam build
```

`.aws-sam/build`にビルドされたファイルが格納されます。
ビルドされたLambda関数をローカルで動かしてみます。

```
❯ sam local invoke

{"statusCode": 200, "body": "{\"message\":\"hello world\"}"}
```

ちゃんと`app.js`のレスポンスを確認することができました。
Docker Desktopが起動していないとエラーになるので注意してください。


続いて、AWS上のLambdaにデプロイします。
```
❯ sam deploy --guided
```
対話式で入力していきます。
```
Stack Name [app]: 
AWS Region [us-east-1]: ap-northeast-1
#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
Confirm changes before deploy [Y/n]: Y
#SAM needs permission to be able to create roles to connect to the resources in your template
Allow SAM CLI IAM role creation [Y/n]: Y
#Preserves the state of previously provisioned resources when an operation fails
Disable rollback [y/N]: y
HelloWorldFunction has no authentication. Is this okay? [y/N]: y
Save arguments to configuration file [Y/n]: Y
SAM configuration file [samconfig.toml]: 
SAM configuration environment [default]: 
```

AWSのマネジメントコンソールからCloudFormationのページに行き、デプロイ時に指定したスタック名のスタックが確認できると思います。

```
Deploy this changeset? [y/N]: y
```

スタックのステータスが`CREATE_COMPLETE`になっていれば成功です。

次にAWSのマネジメントコンソールからLambdaを確認します。
`[スタック名]-[ビルドされた .aws-sam/build　直下のディレクトリ名] - [xxx]`の関数名が確認できることができればデプロイは完了です。

## 最後に
とっつきにくそうと思っていましたが、実際に使ってみるととても便利で使いやすかったです。今後は業務でも積極的に活用していきたいと思いました。


最後まで読んでくださりありがとうございました。