originbenntou’s blog

技術的なアウトプットを日々まとめる

WEB+DBのgRPC + Goサンプルプログラムを動かしてみる

WEB+DBの記事を実践してみたので、公開 著作権的に怒られないと思っている

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実装

リポジトリ参照 server

クライアントstub実装

リポジトリ参照 client

サーバー起動・クライアントプログラム実行

# サーバー起動
$ 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-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と組み合わせてみる