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
API GatewayをGolangで作成する方法について調べてみた
AWSのLambdaは現時点ではGolangは公式にサポートされていないです。
ということで、サーバレスなAPIをGolangで作成する方法について調べてみました。
いくつかの方法がありましたが、結果的には以下の記事にある方法が、自分には一番分かりやすかったです。
https://developer.capitalone.com/blog-post/building-a-serverless-rest-api-in-go/
やり方としては
となります。
ほぼこの記事の方法で出来たのですが、いくつか引っかかったところがあったのでメモっておきます。
- Lambdaについてはサンプルソースが以下のgithubで公開されているので、それを使う。
- project.jsonのrole、profileは適切なものを設定する。
- デプロイコマンドは以下のようにprofile、regionを指定する。
- $ apex deploy --profile default --region ap-northeast-1
- デプロイ時に「Error: function apis: NoCredentialProviders: no valid providers in chain. Deprecated.」というエラーが出た。
- デプロイ前に以下のコマンドを実行する。
- $ export AWS_SDK_LOAD_CONFIG=1
- 参考サイトはこちら。https://qiita.com/shirakia/items/bcd54a1f82ceb69a645a
珠玉のプログラミング 第一部の問題をやってみて
珠玉のプログラミング 本質を見抜いたアルゴリズムとデータ構造
- 作者: ジョン・ベントリー,小林健一郎
- 出版社/メーカー: 丸善出版
- 発売日: 2014/02/28
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
以下、チラ裏レベルの感想などなど。。。
- コラム1
- 数値をビット列にした場合の扱いやすさが印象的だった。golangで実装したので、ビット列はbyteのスライスにしたが。
- 「ビット列は『限られた範囲内にあり、密で、重複がなく、付随する情報も無いようなデータのセット』を表すのに有効」。
- 回答とはだいぶ異なる実装となった。
- コラム2
- 「名前の印(シグナチャー)」と二分探索木の有効性が良く分かった。
- 生データからプログラム内で扱い易い形の「シグナチャー」を生成して、シグナチャーを参照して検索を行う、という流れは、一つのパターンとして覚えておきたい。(今までも無意識で行っていたけど・・・)
- コラム3
- データ構造の重要性について説明している。この事については、常々意識している。
- コラム4
- コラム5
- この辺りの問題も、今の時代だとユニットテストを導入することで解決を図るかな・・・、と。
解いたソースはこちらです。
GitHub - SrcHndWng/go-learning-programming-pearls at part-1.0.0
SourceTreeで別アカウントのリポジトリにPushする方法
タイトルにあるように、SourceTreeで普段使っているのとは別のアカウントのGitにpushする方法についてです。
なお、SourceTreeのMac版での話となります。
- 右上の「設定」を押下し、「リモート」タブを選択する。
- 「追加」を押下し、「リモートの名前」「URL/パス」を入力する。「URL/パス」には「https://ユーザ名@github.com/・・・」となるようにする。ユーザ名をURLに入れると、下の「ユーザ名」欄に自動的に表示される。
- 「高度な設定」タブを選択する。
- 「グローバルユーザー設定を使う」のチェックボックスを外し、「名前」「メールアドレス」を入れる。「メールアドレス」を入れないと、使用しているマシンのユーザ名がコミット時に使用されてしまうようです。
以上です。
Visual Studio CodeでGo言語(golang)のユニットテストをデバッグする
タイトルにあるように、Visual Studio CodeでGolangのユニットテストを実行してデバッグする方法についてです。
とは言っても、ほとんどデバッグ時の設定手順と同じですが・・・。
デバッグ時の設定手順
- メニューバーの「Debug」より「Open Configurations」か「Add Configurations」を選ぶ。
- launch.jsonが開く。
- 「mode」の値を「test」に変更して保存する。
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Launch", "type": "go", "request": "launch", "mode": "test",
- F5を押し、デバッグを実行する。
以上です。
Visual Studio CodeでGo言語(golang)のユニットテストを実行する
例によって忘れないための備忘録です。
Visual Studio CodeにGo with Visual Studio Codeが入っていることが前提です。