AWS SAMを触ってみた

こんにちは、HCB Advent Calendar 2021の8日目を担当する、take-2405です。
研究の都合上あまり時間を確保できず、とても雑な記事になってしまっています。

ごめんなさい！！

[HCB Advent Calendar 2021](https://qiita.com/advent-calendar/2021/hcb-2021)

今回は、AWS Lambdaのローカルでのテストを目的とし、AWS SAMのインストールとテンプレート作成までについてをメインに書いています。

注意：基本的なLambdaの作成方法などは省いています。

# はじめに  
みなさんは普段AWS Lambdaを利用するでしょうか？
私は、割と頻繁に利用します。(体感週に2つはLambdaを作成している)

普段goでLambdaを作成するのですが、goでLambdaを作成する場合以下の手順を踏む必要があります。

```
1. プログラムをコンパイルする(バイナリファイル化)
GOOS=linux go build -o バイナリファイル名 goファイル名

2. デプロイするためにバイナリファイルをzip化
zip ファイル名 バイナリファイル名
```

nodeやpythonであればAWS上のエディタでそのままコードをかけるので、僕的にちょっと手順が多いなぁと感じることがあります。

現在の僕の開発時のサイクルは以下になります。
「デプロイ→テスト→エラー確認→修正して際コンパイル→デプロイ」
しかも、いきなり本番環境のDBを使用しています(恐ろしい)。

万が一にもデータを消す処理を間違って書いていた場合を考えると恐ろしいですね。
また、Lambdaの処理時間、Dynamodbの読み込み、書き込み回数にも気をつけたいところです。

ということで今回はローカルで「dynamodb + lambda」を検証する方法を調べてみました！

dynamodbとlambdaのみのテストであれば今回使用したSAMの他にも方法はあるようですが、APIGatewayも触る機会があるのでSAMを触ることにしました。

# AWS SAMとは
公式によると、AWS SAM(Serverless Application Model)はサーバーレスアプリケーション構築用のオープンソースフレームワークとのことです。

> 迅速に記述可能な構文で関数、API、データベース、イベントソースマッピングを表現できます。リソースごとにわずか数行で、任意のアプリケーションを定義して YAML を使用してモデリングできます。デプロイ中、SAM が SAM 構文を AWS CloudFormation 構文に変換および拡張することで、サーバーレスアプリケーションの構築を高速化することができます。

引用：https://aws.amazon.com/jp/serverless/sam/

AWS CloudFormation 構文に変換可能ということでとても便利そうですね。使いこなせればリスクを減らし、高速にサーバーレスアプリケーションを構築できそうです。

#実際に触ってみる

### SAMのテンプレートを利用  
SAMの利用には、docker、git、homebrewの環境が前提とされています。
AWS SAM CLI のインストール

```
brew tap aws/tap
brew install aws-sam-cli

//versionを確認
sam --version
```
これで問題なくversionが表示されれば準備完了

次にテンプレートを利用したアプリケーションを作成します。

```
sam init --runtime go1.x --name apigw

	SAM CLI now collects telemetry to better understand customer needs.

	You can OPT OUT and disable telemetry collection by setting the
	environment variable SAM_CLI_TELEMETRY=0 in your shell.
	Thanks for your help!

	Learn More: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-telemetry.html

Which template source would you like to use?
	1 - AWS Quick Start Templates
	2 - Custom Template Location
Choice: 1

What package type would you like to use?
	1 - Zip (artifact is a zip uploaded to S3)
	2 - Image (artifact is an image uploaded to an ECR image repository)
Package type: 1

Cloning from https://github.com/aws/aws-sam-cli-app-templates

AWS quick start application templates:
	1 - Hello World Example
	2 - Step Functions Sample App (Stock Trader)
Template selection: 1

    -----------------------
    Generating application:
    -----------------------
    Name: apigw
    Runtime: go1.x
    Architectures: x86_64
    Dependency Manager: mod
    Application Template: hello-world
    Output Directory: .

    Next application steps can be found in the README file at ./apigw/README.md


    Commands you can use next
    =========================
    [*] Create pipeline: cd apigw && sam pipeline init --bootstrap
    [*] Test Function in the Cloud: sam sync --stack-name {stack-name} --watch

```


これでテンプレート準備完了です。

テンプレートには、基本的なLambda関数のコード、ローカル起動用設定ファイル、デプロイ用設定ファイルが生成されています。とりあえず自動してみましょう。

```
//ソースをビルド
make build
//ローカルでAPIを起動
sam local start-api
```

ブラウザでアクセスしてみると「Hello,自分のIPアドレス」と表示されました。問題ないようです。

### 色々やってみた

下記の記事を参考にローカル環境にlocal-dynamodbを用意し、　データを色々操作してみました。  
https://future-architect.github.io/articles/20200323/

僕はビットコインのレートを格納するテーブルをdynamodb-localに構築し、データを挿入するlambdaを作成しました。
ソースは下記のリポジトリにあるので、みてみてください。

https://github.com/take-2405/test-env-use-aws-sam

# おわりに
触ってみた感触ですが、普段作成しているようなLambdaをSAMを用いることでローカルで手軽にテストできると感じました。
また、SAMはデプロイできる点が大きいと感じました。

明日の記事は、西川（twitter：https://twitter.com/takashi54461358 　）が記事を書いてくれる予定なので、お楽しみに！