ソースコードから理解する技術-UnderSourceCode

手を動かす(プログラムを組む)ことで技術を理解するブログ

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アプリを作るチュートリアルとしても良い記事だと思うので紹介します。

記事の目次、学べること

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

  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は手動(もしくはコマンドで)で設定する

となります。


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

珠玉のプログラミング 第一部の問題をやってみて

珠玉のプログラミング 本質を見抜いたアルゴリズムとデータ構造

珠玉のプログラミング 本質を見抜いたアルゴリズムとデータ構造

「珠玉のプログラミング」の第一部を読み、問題のいくつかを実際に解いてみました。
以下、チラ裏レベルの感想などなど。。。

  • コラム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版での話となります。

  1. 右上の「設定」を押下し、「リモート」タブを選択する。
  2. 「追加」を押下し、「リモートの名前」「URL/パス」を入力する。「URL/パス」には「https://ユーザ名@github.com/・・・」となるようにする。ユーザ名をURLに入れると、下の「ユーザ名」欄に自動的に表示される。
  3. 「高度な設定」タブを選択する。
  4. 「グローバルユーザー設定を使う」のチェックボックスを外し、「名前」「メールアドレス」を入れる。「メールアドレス」を入れないと、使用しているマシンのユーザ名がコミット時に使用されてしまうようです。

以上です。

Visual Studio CodeでGo言語(golang)のユニットテストをデバッグする

タイトルにあるように、Visual Studio CodeGolangユニットテストを実行してデバッグする方法についてです。
とは言っても、ほとんどデバッグ時の設定手順と同じですが・・・。

デバッグ時の設定手順

  1. メニューバーの「Debug」より「Open Configurations」か「Add Configurations」を選ぶ。
  2. launch.jsonが開く。
  3. 「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",
  1. F5を押し、デバッグを実行する。

以上です。

Visual Studio CodeでGo言語(golang)のユニットテストを実行する

例によって忘れないための備忘録です。
Visual Studio CodeGo with Visual Studio Codeが入っていることが前提です。

手順

  1. ユニットテストのファイル(〜_test.go)を作成する。
  2. commnad + shift + p などでコマンドパレットを起動する。
  3. 「Go: Test File」を選択する。

これでユニットテストが実行されると思います。