0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GoAdvent Calendar 2021

Day 14

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

Posted at

この記事は Goのカレンダー | Advent Calendar 2021 - Qiita の3つ目のカレンダーの14日目です。

はじめに

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

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

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

書籍について

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

また、この書籍では以下のプログラム言語とサービスについて学ぶことになります。

クラウドサービス

  • AWS
    AWS LambdaAmazon DynamoDBをはじめとした
    何かのイベントが発生したときだけ実行され料金が発生するサーバーレスなアーキテクチャや、
    aws上でのCICDの構築、awsサービスを活用した保守面についてを一通り体験することが可能です。

プログラミング言語

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

ちなみに書籍内では、2017年度のstackoverflowがまとめている最も愛されているプログラミング言語でgo言語は上から5番目に愛されている言語になっています。
2021年のstackoverflowの調査では上から10番目に大分順位を落としています。

Datadog Japanの調査では、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上のサンプルコードを確認しながら進めることになります。

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

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の記述は下記のような内容になります。

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の初期化
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を使ったSPA(Single Page Application)を構築していきます。
かなり躓いたポイントが多いのでメモしておきます。

躓いたポイント

書籍内ではangular/http パッケージ が使われていますがAngularのバージョンが5.0.0以降はangular/common/httpを使う必要があります。
httpクライアントの実装例

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

AWS S3のバケットを作成するときに、バケット名に大文字は含めることができません。
バケット名の名前付け

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アプリ作成のハンズオン本ですね。

参考

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?