Golang + API GatewayでCRUDを実装してみた

AWS LambdaがGolangを正式サポートしてから暫く経ちました。
Serverless FrameworkもGolangでの実装をサポートしたようなので、タイトルにあるようにAPI Gatewayを使用したCRUDAPIを作成してみました。

Todoを登録・削除・参照するAPIのサンプルとなります。
先にも書きましたが、Serverless Framework、API Gateway + Lambda、データの格納先にはDynamoDbを使用します。

こちらが今回書いたソースです。
GitHub - SrcHndWng/go-todo-sample-api-gateway

以下、今回作成したモノの備忘録?です。

URL構成について

APIのURL構成については、Serverless FrameworkのAPI Gatewayのサンプルを参考にしました。
examples/serverless.yml at master · serverless/examples · GitHub

mainとHandlerについて

GolangAPI Gateway + Lambdaを実装する場合、mainはHanderを呼び出していて、HandlerはWebサーバを起動しているようです。
なので、Handler内でリクエストのメソッドの種類とパスを判定し、処理を切り替えてみました。

テストについて

テストについては、現時点ではDynamoDbの値を直接参照・更新しています。(動作確認用に作っただけなので・・・)

データの採番について

DynamoDbのデータの採番については、テーブル内のデータ数 + 1 をしています。(これも実案件では採番テーブルなどで管理すべきかと思います・・・)

Visual Studio CodeでSpring Bootのデバッグをやってみる

最近はSpring Bootを再び触り始めたこともあり、タイトルにあるようなことをやってみました。

以下、手順とメモです。

Visual Studio Codeの設定

1. Java Extension Packのインストール

Visual Studio Code のコマンドパレットを起動し、「Install Extention」から「Java Extension Pack」をインストールします。

2. Spring Boot Java Supportのインストール

Visual Studio Codeに「Spring Boot Java Support」もインストールしました。(もしかしら不要かもです。。。)

3. lombokの参照設定

私はlombokを使用することが多いので、Visual Studio Codeがlombokを参照できるように設定しました。
「Code」-「Preferences」-「Settings」を起動し、自分の設定に以下の書式でlombok.jarのパスを記述します。

"java.jdt.ls.vmargs": "-javaagent:/path/to/lombok.jar -Xbootclasspath/a:/path/to/lombok.jar"

参考サイト Lombok support · redhat-developer/vscode-java Wiki · GitHub

これを行うと@Dataを着けたクラスのgetterを参照することはできました。

Sping Bootプロジェクトの実行

以下のサイトよりSpring BootのWeb APIのソースを取得してきました。
Getting Started · Building a RESTful Web Service with Spring Boot Actuator


サイト内で紹介されているgitよりソースを取得し、その中の「complete」フォルダをVisual Studio Codeで読み込みます。

1. 実行

F5を押すとデバッグが始まります。
ブレークポイントを貼ってみましたが、普通に止まって、変数の中身も見れるようです。

2. ビルドなど

以下を見るとMavenをサポートしているようです。
https://code.visualstudio.com/docs/java/java-tutorial
私はgradleを主に使用するのですが、ビルドはコマンドで行うことにしました。
プロジェクト内に.gradlewファイルがある場合、以下のコマンドでビルドやクリーンができます。<

$ ./gradlew build
$ ./gradlew clean

まとめ

Visual Studio Codeは動きが軽いことや、ターミナルが使いやすいことなどが気に入っています。
しばらく使ってみようかと思います。

Golangでテンプレートファイルを使った出力を行うチュートリアルをやってみた

はじめに

Golangでテンプレートファイルを使った出力を行うことについて扱われている
Using Go Templates GopherAcademy
をやってみました。

テンプレートについては今までも使ってはいましたが、改めて復習ということで。。。
チュートリアル形式の記事なのですが、簡単に内容について纏めてみたいと思います。

記事の目次、学べること

以下のことについて扱われています。

  • 導入部
    • Golangでテンプレートを扱うパッケージが以下の二種類であること。
      • text/template
      • html/template
  • "Actions"
    • テンプレートファイルの定義方法、文法についての説明。
  • "Parsing Templates"
    • templateパッケージの基本的な使い方について。
  • "Implementing Templates"
    • "Creating Web Pages using Templates"
      • html形式のテンプレートで出力するフォーマットを定義し、標準出力に出力するサンプル。
      • template.Newを使うと"template: "html-tmpl" is an incomplete or empty template"というエラーとなった。(なので私はtemplate.Newは使いませんでした)
    • "Customizing Command’s Output"
      • CLIアプリケーションで起動引数にテンプレートファイル名を指定する例。

まとめ

テンプレートを使用するケースとして、API・E-mail・Webサイトが挙げられていました。
この記事のサンプルも標準出力に出していたので、Webに限定することなく使うケースは多いかと思います。

以下、今回私が実装したソースです。"Parsing Templates"、"Implementing Templates"について実装してみました。
GitHub - SrcHndWng/go-learning-using-template

GolangでWebAssembly(wasm)を実行するチュートリアルをやってみた

はじめに

GolangでWebAssembly(wasm)を実行する手順を紹介した
Go and wasm: generating and executing wasm with Go GopherAcademy
をやってみました。

元々は「wasmとは何ぞや?」と思ったことからやってみたのですが
この記事の中でも説明されていました。

wasmやそれを使った簡単なアプリを作ってみるチュートリアル形式となっているのですが
その内容を紹介したいと思います。

記事の目次、学べること

以下のことについて扱われています。

  • WebAssemblyについての解説
    • WebAssemblyの略称が「wasm」であること、.wasm形式のファイルがコンパイルした結果の実行ファイルであることなどが書かれている。
  • .wasm形式のファイルを解析するGolangのツール「wagon」を使っての解析
  • 「wasm-run」を使って.wasm形式のファイルを実行してみる
  • 項目名「Executing wasm in the browser」
    • ここはwasmモジュールを返す簡単なWebアプリを作る項目です。
    • この項目は実行結果がメインで書かれているのですが、実行結果が表してることについて簡単に解説します。
      • 作成したWebアプリの結果の画面を見ると、wasmのバイナリは「add」というメソッドがあることが分かる。
      • この「add」メソッドを、HTML内の(JavaScriptメソッド)window.onload()にて「instance.exports.add(1, 2)」として呼び出して、結果を表示している。
  • 項目名「Generating wasm」
    • .wasm形式のファイルをGolangコンパイルして作成する手順と、その実行手順の紹介

まとめ

wasmとは何かから始まり、wasmを使ったWebアプリの作成、wasmファイルの作成と、順を追ってできるチュートリアルでした。
私のように「wasmとは何ぞや?」から始める人にとって、良い記事だと思います。

以下、私が今回「Executing wasm in the browser」の項目をやってみたソースです。
HTMLファイルをテンプレート化したり、起動パラメータのport番号などを改変してあります。
GitHub - SrcHndWng/go-learning-wasm

GolangでWebアプリ作成〜Docker・Kubernetesで実行するチュートリアルをやってみた

はじめに

GolangでWebアプリを作りDockerで動作を確認し、Kubernetesでデプロイする手順を紹介した
Write a Kubernetes-ready service from zero step-by-step GopherAcademy
をやってみました。

とは言ってもKubernetesは当分使用する予定はないので、Kubernetesでのデプロイを除く部分だけですが・・・。

タイトルにはKubernetesとありますが、GolangでWebアプリを作るチュートリアルとしても良い記事だと思うので紹介します。

記事の目次、学べること

記事で学べることを理解するために、記事内の項目を並べてみたいと思います。

  1. 「Step 1. The simplest service」
  2. 「Step 2. Add a logger」
  3. 「Step 3. Add a router」
  4. 「Step 4. Tests」
  5. 「Step 5. Configuration」
  6. 「Step 6. Makefile
  7. 「Step 7. Versioning」
  8. 「Step 8. Let’s have less dependencies」
  9. 「Step 9. Health checks」
  10. 「Step 10. Graceful shutdown」
  11. 「Step 11. Dockerfile」
  12. 「Step 12. Vendoring」
  13. 「Step 13. Kubernetes」

1〜10でアプリを作成し、11でDockerで動作させ、13でKubernetesで動かします。
私が良いと思ったのは、1〜10のアプリ作成で

  • ヘルスチェックやシャットダウンを含むアプリの実装
  • loggerの実装
  • ユニットテストの実装
  • Makefileによるコマンドの自動化

など、実案件で必要そうなことをチュートリアル形式で学べることです。またURLの効率的な管理方法(Router)などソースを綺麗に保つための工夫にも言及されています。
実際に作ってみたアプリはコンテナで動かし、デプロイさせることもできます。

まとめ

アプリ作成〜コンテナ化、(私はやらなかったが)Kubernetesでのデプロイと、開発〜デプロイまでの一連の流れを学ぶのに良い記事だと思います。
GolangでのWebアプリ作成に興味ある方は、一度やってみてはいかがでしょうか。

以下、私が今回やってみたソースです。
GitHub - SrcHndWng/go-learning-kubernetes

Serverless Framework + TypeScriptでAPI Gatewayを作成する

タイトルにあるように、Severless FrameworkとTypeScriptでAPI Gatewayを使ったAPIを作成する手順になります。
HTTPのリクエストはAPI Gatewayが受けて、裏の処理を行うLambdaをTypeScriptで書く形となります。

以下、手順です。
なお、Serverless Frameworkを作業するローカルフォルダにインストールしたため、通常のServerless Frameworkの使い方とは異なっています。
グローバル領域にServerless Frameworkをインストールする場合は、Serverless Frameworkを実行するコマンドを適時置き換えてください。

作成手順

Serverless Frameworkのインストール

$ npm install serverless

$ ./node_modules/.bin/serverless --version
1.24.1

テンプレート作成

$ ./node_modules/.bin/serverless create -t aws-nodejs-typescript

package.jsonにServerless Frameworkを追記。
(これを行わなと次のコマンドでローカルにインストールしたServerless Frameworkが消えるため)
(グローバル領域にServerless Frameworkをインストールする場合は不要)

package.jsonに記載されたライブラリをインストール。

$ npm install

serverless.ymlの編集

(この手順はお好みの値で。やらなくてもOK。)providerに以下を追加。

provider:
  (中略 ここはデフォルト)
  stage: dev
  region: ap-northeast-1
  profile: default

デプロイ

デプロイしようとすると以下のエラーが発生する。

Cannot find name 'AsyncIterator'.

tsconfig.jsonのcompilerOptionsに以下を追加する。

"lib": ["es6", "dom", "esnext"]

参考サイトは
Cannot find name 'AsyncIterator' error in Typescript compilation process. · Issue #83 · apollographql/graphql-subscriptions · GitHub


上記を追加した後でデプロイ。

$ ./node_modules/.bin/serverless deploy

デプロイできたら、curlなどでGETできることを確認してください。

$ curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/hello
"message":"Go Serverless Webpack (Typescript) v1.0! Your function executed successfully!"(以降略)

今回作成したもの

今回作成したものは以下になります。
GitHub - SrcHndWng/aws-nodejs-typescript-sample

API GatewayをGolangで作成する方法について調べてみた

AWSのLambdaは現時点ではGolangは公式にサポートされていないです。
ということで、サーバレスなAPIGolangで作成する方法について調べてみました。


いくつかの方法がありましたが、結果的には以下の記事にある方法が、自分には一番分かりやすかったです。
https://developer.capitalone.com/blog-post/building-a-serverless-rest-api-in-go/


やり方としては

  • Apexを使ってGolangでLambdaを実装してデプロイする
  • API Gatewayは手動(もしくはコマンドで)で設定する

となります。


ほぼこの記事の方法で出来たのですが、いくつか引っかかったところがあったのでメモっておきます。