「Amazon Web Servicesを使ったサーバーレスアプリケーション開発ガイド」をGolangで写経してみた - その2

前回に引き続き、Amazon Web Servicesを使ったサーバーレスアプリケーション開発ガイド | マイナビブックスGolangで写経しています。
今回はChapter4をやってみました。

GitHub - SrcHndWng/go-learning-serverless-apps at chapter4


Twitterからデータを取得してKinesisに投げるアプリ(twitterToKinesis)については
CloudFormationでEC2を立ち上げ、アプリのデプロイ、起動までを行うようにしてみました。

Kinesisからイベントを受け取るLambda(kinesisToDynamo)については
Serverless Frameworkを使用している以外は、本に書かれている機能をそのまま実装しています。

「Amazon Web Servicesを使ったサーバーレスアプリケーション開発ガイド」をGolangで写経してみた

Amazon Web Servicesを使ったサーバーレスアプリケーション開発ガイド | マイナビブックスを読み始めました。
ただ読むだけではなく、Golangの勉強がてら、本で紹介されている処理を実装してみました。

実装言語は先に書いたようにGolang、デプロイ周りはServerless Frameworkを使っています。
とりあえずChapter3をやってみたので、以下のGitHubに載せました。

GitHub - SrcHndWng/go-learning-serverless-apps at chapter3

感想としては(まだChapter3までしかやってないけど)・・・
・本の内容については、AWSでのサーバレスのパターンについてソースと構成が丁寧に説明されていると思う
Golangで実装してみた感想は、数ない文字数・if != errによる明確なエラーへの対応が個人的には好み
という印象です。。。

GolangとServerless FrameworkでGraphQLのAPIを作成 + 動作確認してみる

Building a Golang GraphQL API on AWS Lambda – A man with no server – Mediumという記事を見つけました。
こちらを参考に、Serverless Frameworkを用いてGraphQLのAPIを作成してみました。

主なロジックは上記の記事とほぼ同様なのですが

  • デプロイ周りにServerless Frameworkを使ってみた
  • struct毎にファイルを分割してみた

などの改修を行なっています。

私が作ったソースは以下に上げてありソース自体の説明は不要かと思いますが、デプロイ方法と動作確認の方法について書いておきたいと思います。
GitHub - SrcHndWng/go-learning-graphql-serverless

デプロイ

  • Serverless Frameworkがインストールされていること
  • AWSのアカウントを持っていてクレデンシャルの設定が済んでいること

が前提となります。

githubからソースをcloneする、もしくは以下のコマンドでプロジェクトを作成します。

$ serverless create -u https://github.com/serverless/serverless-golang/-p プロジェクト名

プロジェクトのフォルダに移動してビルドします。

$ GOOS=linux go build -o bin/main

デプロイします。

$ serverless deploy

動作確認

curlAPIを叩いてもいいのですが、今回はGraphiQL.appを使用しました。
ちなみに実行環境はMacとなります。

GitHub - skevy/graphiql-app: Light, Electron-based Wrapper around GraphiQL

GraphiQL.appをインストールし、クエリとして以下のように入力して結果が返ってくれば成功です。

{
  person(id: 1002){
    id
    firstName
    lastName
  }
}

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