[Hands-On Serverless Applications with Go] やってみた感想

この記事は [Goのカレンダー | Advent Calendar 2021 - Qiita](https://qiita.com/advent-calendar/2021/go) の3つ目のカレンダーの14日目です。

## はじめに
表題通り、**Hands-On Serverless Applications with Go**という書籍を一通り読んだ感想を書きます。

http://www.amazon.co.jp/dp/1789134617

初めて英語の技術書を読みながら手を動かしましたが、英語で書かれていること自体はいいのですが、**約400P**となると数日で読み終えるのは難しいですね。
この書籍は夏の夏季休暇中に読破したので、2週間ちょっとかけて私は読み終えました。

最近は、[Udemy](https://www.udemy.com/)を筆頭に自分で勉強しようと思ったときにセール中なら書籍を購入するよりも安く学習できるサービスも増えてきています。
しかし、実際の業務レベルのハンズオンになるとweb上のサービスだけでは難しいとも思います。
この書籍は初心者向けでは決してありませんが、一通りやり終えればしっかりとスキルが身につくかと感じました。

## 書籍について
冒頭触れましたが、本書籍は**英語**です。
英文はそんなに難しくないですが、たまに検索しないとわからない単語が出てきます。
あと、単純に普段英語を読まないので、読むのにかなりエネルギーが必要です・・・。

また、この書籍では以下のプログラム言語とサービスについて学ぶことになります。
#### クラウドサービス
- AWS  
[AWS Lambda](https://aws.amazon.com/jp/lambda/)や[Amazon DynamoDB](https://aws.amazon.com/jp/dynamodb/)をはじめとした
何かのイベントが発生したときだけ実行され料金が発生する**サーバーレス**なアーキテクチャや、
aws上でのCICDの構築、awsサービスを活用した保守面についてを一通り体験することが可能です。

#### プログラミング言語
- Go言語  
書籍の第一章でAWS LambdaとGo言語はなぜ相性が良いのかについて触れられています。  
1.クラウド指向(Cloud-oriented)  
2.早い(Fast)  
3.拡張性(Scalable)  
4.効率的(Efficient)  
5.コミュニティが活発(Growing community)  

ちなみに書籍内では、2017年度のstackoverflowがまとめている[最も愛されているプログラミング言語](https://www.grapecity.com/blogs/stackoverflows-2017-developer-survey-loved-and-dreaded-languages-tabs-and-spaces)でgo言語は上から5番目に愛されている言語になっています。
2021年の[stackoverflowの調査](https://insights.stackoverflow.com/survey/2021#most-loved-dreaded-and-wanted-language-love-dread)では上から10番目に大分順位を落としています。

[Datadog Japanの調査](https://it.impress.co.jp/articles/-/21998)では、AWS Lambdaで使用できるプログラミング言語の9割はpythonかnode.jsで記述されているとのことです。
そのため、Go言語を1から今から勉強してawsのサービスを始めるのは正直割に合わないと思います。

- typeScript  

AWSのサービス部分はGo言語で実装しますがフロントエンドの部分は、
本書籍では**Angularフレームワーク + TypeScript**で実装していきます。  
書籍内でAngularやTypeScriptの導入については触れられていますが、
特にAngularの仕様面は初心者には難しいので事前に学習しておいたほうが良いと感じました。  
自分はAngularもTypeScriptも触ったことがなく、調べながら進めていたのでフロントエンドの実装部分はかなり時間がかかりました。

書籍の4章まではAWSの簡単なサービスを使ったサンプルレベルのため、書籍内に該当コードがすべて記述されていますが、5章以降はサンプルコードの一部しか掲載されておらず、[https://github.com/PacktPublishing/Hands-On-Serverless-Applications-with-Go](https://github.com/PacktPublishing/Hands-On-Serverless-Applications-with-Go)上のサンプルコードを確認しながら進めることになります。

## 各章についての簡単な概要

### 2.Getting Started with AWS Lambda

この章では、AWS環境のインストール・構築と、AWSマネジメントコンソールの使い方、Go言語のコンパイルと実行までをステップバイステップでやっていきます。

### 3.Developing a Serverless Function with Lambda

- Go言語によるLambdaの記述方法
- Lambdaを実行するためのロールの付与
- zipファイル or AWS S3へのパッケージアップロード
- Lambdaのイベントテストの記述

をこの章では見ていきます。

Go言語の簡単なLambdaの記述は下記のような内容になります。

```go
package main

import "github.com/aws/aws-lambda-go/lambda"

func handler() (string, error){
  return "welcome to serverless world", nil
}

func main(){
  lambda.Start(handler)
}
```

lambdaコンソール上でインラインでスクリプトが記述できるpythonやnode.jsと違い、
コンパイル言語であるGo言語はexeを作成後にzipに格納して、lambdaコンソールかS3にアップロードする必要があります。
このあたりのLambdaコンソールで動かすまでをハンズオンで学びます。

### 4.Setting up API Endpoints with API Gateway
API GatewayとLambdaを組み合わせてRESTFul APIをどのように実装するかを学習します。
このあたりまでは書籍内のサンプルコードで十分動かせます。

### 5.Managing Data Persistence with DynamoDB
前章で(この記事では説明していませんが)Lambdaはステートレスであることが触れられており、
処理した結果の格納先としてNoSQL型のDynamoDBへどのようにGo言語で格納や参照、削除を行うかを学びます。

#### **躓いたポイント**

windows環境だと書籍通りに進めると、curlコマンドでjson文字列を渡すときにダブルクオーテーションの扱いでよくエラーをだしてしまいました。

> curl -i -X POST -d "{\"name\":\"test name2\",\"type\":\"1\",\"year\":1977}" -H "Content-Type: application/js
on" http://phalcon-restapi.local/api/robots

windowsでcurlコマンドを書くときの注意点は、
1.ダブルクォーテーションのエスケープ処理
2.全体をダブルクォーテーションで括る

- credentialsfileを使ったセッションとdynamoDBの初期化  

```go
sess := session.New(&aws.Config{Region: aws.String("ap-northeast-1")})
	db := dynamodb.New(sess)
	table_name := "Idols"
```

### 6.Developing Your Serverless Application
この章ではGo言語の記述はほぼ登場せず、AWSでのデプロイやバージョニングなどのtips的な情報がつまっています。

#### **躓いたポイント**

aws cli2からjsonファイルがbase64デフォになるようなので、**--cli-binary-format raw-in-base64-out**をつける必要がありました。

> aws lambda invoke --function InsertIdole --payload file://input.json result.json --cli-binary-format raw-in-base64-out

### 7.Implementing a CI/CD Pipeline
CodeBuild、CodePipelineを使ってCICD環境の構築方法を行います。
この章に関しては、チュートリアルがweb上に色々落ちてあるので興味があればチュートリアルを是非試してみてください。

### 8.Scailing Up Your Application
書籍では https://github.com/rakyll/hey を使ったLambdaのスケーリングについて触れられています。

### 9.Building the Frontend with S3
[Angular](https://angular.jp/)を使ったSPA(Single Page Application)を構築していきます。
かなり躓いたポイントが多いのでメモしておきます。

#### **躓いたポイント**
書籍内では``angular/http パッケージ`` が使われていますがAngularのバージョンが5.0.0以降は`angular/common/http`を使う必要があります。
[httpクライアントの実装例](https://qiita.com/ksh-fthr/items/840ae54472892a87f48d)

```ts
// REST クライアント実装ののためのサービスを import ( Angular 5.0.0 以降はこちらを使う )
import { HttpClient, HttpHeaders } from '@angular/common/http';
```

AWS S3のバケットを作成するときに、バケット名に大文字は含めることができません。
[バケット名の名前付け](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/bucketnamingrules.html)
```
aws s3 mb s3://ServerlessApplicationMorichan.com make_bucket failed: s3://ServerlessApplicationMorichan.com An error occurred (InvalidBucketName) when calling the CreateBucket operation: The specified bucket is not valid.
```

## 終わり
11章~14章までありますが、残りはawsサービスを使った保守的な項目なので割愛させていただきます。

改めて文章に書いてみると、この書籍はGoの本というよりもAWSサービスを使ったwebアプリ作成のハンズオン本ですね。

### 参考

- [goropikariの備忘録](https://goropikari.hatenablog.com/entry/serverless_with_go)
  -  今回紹介している書籍についての感想を書かれているブログです。

- [Hands-On Serverless Applications with Go / Github](https://github.com/PacktPublishing/Hands-On-Serverless-Applications-with-Go)

- [サーバーレスアーキテクチャとは何か？　AWSの「Lambda」と「EC2」を比較して解説](https://www.sbbit.jp/article/cont1/32603)
  - サーバーレスアーキテクチャ（サーバーレス）」の定義やメリット・デメリットについて解説されています。
- [AWS Lambda で Go が使えるようになったので試してみた](https://dev.classmethod.jp/articles/aws-lambda-supports-go/)
  - LambdaでGo言語をどのように使うかについてまとめられています。