WEB+DBのgRPC + Goサンプルプログラムを動かしてみる
WEB+DBの記事を実践してみたので、公開 著作権的に怒られないと思っている
gRPC
- RPC(RemoteProcedureCall)を実現するGoogle製のプロトコル
- ProtocolBuffersを使ってprotoファイル(IDL)をシリアライズする
- シリアライズしたファイルはgRPCサーバーを呼び出すためのインターフェースとして機能する
以下の要素は気になった
バックサーバー間通信には使えるが、フロントエンド/バックエンドサーバー間通信には使えない grpc-gateway を使うとREST APIを受け付けるリバースプロキシサーバーを立てられるみたい
事前準備
$ mkdir path/to/go/src/grpc_go_sample $ ln -s path/to/work/directory # protobufインストール ## protoファイルコンパイル用 $ brew install protobuf # 確認 protoc --version libprotoc 3.7.1 # Go 用の Protocol Buffers ランタイムをインストール ## Goサーバーで使用 $ go get -u github.com/golang/protobuf/protoc-gen-go
Modules
goのパッケージ管理ツールはglide -> depと進化を遂げたが、go 1.11の世界では新たにModulesという機構が生まれ、go mod コマンドでmodulesを管理することができるようになった。(言語レベルでモジューリングがサポートされたことを意味する)
goの思想としてもdepではなくmodulesに置き換えていくことを推進してるっぽいので、早めに直しておくと良いと思う。
# Go 1.11以上 $ export GO111MODULE=on # path/to/go/src/grpc_go_sample にて実施 $ go mod init
protoファイル実装
gRPC を使った開発では、メソッドとメッセージを Protocol Buffers で用意する必要があります。
# echo/proto/echo.proto syntax = "proto3"; package echo; message EchoRequest { string message = 1; } message EchoResponce { string message = 1; } service EchoService { rpc Echo (EchoRequest) returns (EchoResponce); }
- string型の
message
というフィールドを持つ、EchoRequest
,EchoResponce
というmassage型を定義- フィールド名が
message
なのでややこしいw - RESTだとmessage型はJSONで表現されていた
- フィールド名が
- serviceブロックには
Echo
というメソッドを定義- クライアントからこのメソッドを呼び出す
EchoRequest
はクライアントから渡されるリクエストメッセージEchoResponce
はクライアントに渡すレスポンスメッセージ
コンパイル
$ protoc --proto_path ./echo/proto --go_out=plugins=grpc:./echo/proto/ ./echo/proto/echo.proto
server実装
クライアントstub実装
サーバー起動・クライアントプログラム実行
# サーバー起動 $ go run ./echo/server # 任意の文字列を送信してレスポンスさせる $ go run ./echo/client hogehoge 2019/07/20 19:04:46 hogehoge
terraform 基礎文法
背景
お仕事でterraformをいじることになったので簡単に基礎を学ぶ AWSリソースをコード化する
terraform
プロバイダー
terraformを実行する人は誰か
provider "aws" { access_key = "ACCESS_KEY_HERE" secret_key = "SECRET_KEY_HERE" region = "ap-northeast-1" }
変数
variable
で宣言する
variable "access_key" {} variable "secret_key" {} provider "aws" { access_key = "${var.access_key}" secret_key = "${var.secret_key}" region = "ap-northeast-1" }
リソース
resource {つくりたいリソース} {リソースの名称}
resource "aws_vpc" "myVPC" { cidr_block = "10.1.0.0/16" instance_tenancy = "default" enable_dns_support = "true" enable_dns_hostnames = "false" tags { Name = "myVPC" } }
main.tf, variables.tf
*.tf
だったら自動でテンプレートとして読んでくれる
# main.tf provider "aws" { access_key = "${var.aws_access_key}" secret_key = "${var.aws_secret_key}" region = "${var.region}" } ## リソースの定義を記述 resource "aws_vpc" "myVPC" { cidr_block = "10.1.0.0/16" instance_tenancy = "default" enable_dns_support = "true" enable_dns_hostnames = "false" tags { Name = "myVPC" } } # variables.tf variable "aws_access_key" {} variable "aws_secret_key" {} variable "region" { default = "ap-northeast-1" } variable "images" { default = { us-east-1 = "ami-1ecae776" us-west-2 = "ami-e7527ed7" us-west-1 = "ami-d114f295" eu-west-1 = "ami-a10897d6" eu-central-1 = "ami-a8221fb5" ap-southeast-1 = "ami-68d8e93a" ap-southeast-2 = "ami-fd9cecc7" ap-northeast-1 = "ami-cbf90ecb" sa-east-1 = "ami-b52890a8" } } output "public ip of cm-test" { value = "${aws_instance.cm-test.public_ip}" }
output
はterraformを流したあとに結果を表示してくれる
module
なんかmoduleって言葉があった気がするけど、分かり次第追記する
gcsfuseでVMインスタンスにGCSをマウントしてみる
背景
- 個人プロジェクトでk8sを使ってみたくてGKEでデプロイしたい
- Dockerでローカル構築はできた
- https://github.com/originbenntou/E-Lunch
- ローカルでは docker-compose でソースコードをマウントしている
- けどk8sはイメージからコンテナを起動するからソースコードをマウントできない!ymlに書けない!
- docker-composeから良い感じにk8s.ymlを生成するKomposeってのがあるけど、よくわからず挫折した
- 聞くところによるとソースコードはGCSにアップロードしておいて、コンテナ内でそのボリュームを参照するやり方があるそう
gcs fuse
gcsfuseって?
gcsをインスタンスにマウントするやつ
実際に触ってみる
# マウントしたディレクトリをアップロードして $ gsutil cp -r ~/mywork/E-Lunch/ gs://e-lunch-bucket/ # vmインスタンスにsshしてgcsfuseをインストール $ export GCSFUSE_REPO=gcsfuse-`lsb_release -c -s` $ echo "deb http://packages.cloud.google.com/apt $GCSFUSE_REPO main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list $ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - $ sudo apt-get update $ sudo apt-get install gcsfuse $ groupadd fuse $ sudo usermod -a -G fuse $USER # ディレクトリをつくって $ mkdir -p /mnt/disks/gcs # なんかよくわらんけどgcloudの設定が見れることを確認して $ gcloud config list # マウント ## --implicit-dirs がミソ $ /usr/bin/gcsfuse --implicit-dirs -o allow_other --foreground --gid 0 --uid 0 -file-mode=666 -dir-mode=777 e-lunch-bucket /mnt/disks/gcs
この辺は以下を参考にした
https://www.mark-system.com/?p=985 https://qiita.com/wasnot/items/f1791492f7078f5e5d52
このあとやりたいこと
- k8sでデプロイ
- gcsfuseと組み合わせてみる
初カキコ
毎日ひとつは賢くなるぞ!