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
動作確認
curlでAPIを叩いてもいいのですが、今回は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を使用したCRUDのAPIを作成してみました。
Todoを登録・削除・参照するAPIのサンプルとなります。
先にも書きましたが、Serverless Framework、API Gateway + Lambda、データの格納先にはDynamoDbを使用します。
こちらが今回書いたソースです。
GitHub - SrcHndWng/go-todo-sample-api-gateway at v1.0.0
以下、今回作成したモノの備忘録?です。
URL構成について
APIのURL構成については、Serverless FrameworkのAPI Gatewayのサンプルを参考にしました。
examples/serverless.yml at master · serverless/examples · GitHub
mainとHandlerについて
GolangでAPI 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で読み込みます。
2. ビルドなど
以下を見るとMavenをサポートしているようです。
https://code.visualstudio.com/docs/java/java-tutorial
私はgradleを主に使用するのですが、ビルドはコマンドで行うことにしました。
プロジェクト内に.gradlewファイルがある場合、以下のコマンドでビルドやクリーンができます。<
$ ./gradlew build $ ./gradlew clean
まとめ
Visual Studio Codeは動きが軽いことや、ターミナルが使いやすいことなどが気に入っています。
しばらく使ってみようかと思います。
Golangでテンプレートファイルを使った出力を行うチュートリアルをやってみた
はじめに
Golangでテンプレートファイルを使った出力を行うことについて扱われている
Using Go Templates | Gopher Academy Blog
をやってみました。
テンプレートについては今までも使ってはいましたが、改めて復習ということで。。。
チュートリアル形式の記事なのですが、簡単に内容について纏めてみたいと思います。
記事の目次、学べること
以下のことについて扱われています。
- 導入部
- Golangでテンプレートを扱うパッケージが以下の二種類であること。
- text/template
- html/template
- Golangでテンプレートを扱うパッケージが以下の二種類であること。
- "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アプリケーションで起動引数にテンプレートファイル名を指定する例。
- "Creating Web Pages using Templates"
まとめ
テンプレートを使用するケースとして、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 | Gopher Academy Blog
をやってみました。
元々は「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とは何かから始まり、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 | Gopher Academy Blog
をやってみました。
とは言ってもKubernetesは当分使用する予定はないので、Kubernetesでのデプロイを除く部分だけですが・・・。
タイトルにはKubernetesとありますが、GolangでWebアプリを作るチュートリアルとしても良い記事だと思うので紹介します。
記事の目次、学べること
記事で学べることを理解するために、記事内の項目を並べてみたいと思います。
- 「Step 1. The simplest service」
- 「Step 2. Add a logger」
- 「Step 3. Add a router」
- 「Step 4. Tests」
- 「Step 5. Configuration」
- 「Step 6. Makefile」
- 「Step 7. Versioning」
- 「Step 8. Let’s have less dependencies」
- 「Step 9. Health checks」
- 「Step 10. Graceful shutdown」
- 「Step 11. Dockerfile」
- 「Step 12. Vendoring」
- 「Step 13. Kubernetes」
1〜10でアプリを作成し、11でDockerで動作させ、13でKubernetesで動かします。
私が良いと思ったのは、1〜10のアプリ作成で
など、実案件で必要そうなことをチュートリアル形式で学べることです。また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"]
上記を追加した後でデプロイ。
$ ./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
参考サイト
Getting Started With Serverless and TypeScript
Serverless Framework Commands - AWS Lambda - Create
Serverless Framework - AWS Lambda Guide - Serverless.yml Reference
Cannot find name 'AsyncIterator' error in Typescript compilation process. · Issue #83 · apollographql/graphql-subscriptions · GitHub
npmでnode.jsのpackageを管理する - Qiita