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

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

GolangでTwitter Botを作成してみた

タイトルにあるようにGolangTwitter Botを作成してみました。
EC2などのマシン上でバイナリを常駐させて動かすことを想定しています。

ソースは以下となります。
GitHub - SrcHndWng/go-learning-tweet-random-search at v1.0.0


READMEにも書きましたが、機能としては

  • 予め実行するマシンの環境変数Twitter APIAccess Tokenなどを設定しておく
  • マシン上でバイナリを起動する
  • Twitterのアカウントに「@Account Keyword」形式でメッセージを投げる
  • キーワードで検索した結果からランダムにツイートを選んで返却する

というものです。

検索した結果から返却するツイートを選択するロジックは、
リツイート数 * お気に入り数 * ランダムな係数」が一番大きいもの
を選択しています。

Twitterへのアクセス周りは
GitHub - dghubble/go-twitter: Go Twitter REST and Streaming API v1.1
を使用しました。

作って見ての感想としては、こういうのをサクっと作るのにはGolangは向いているかな、と思います。

以下、参考にしたサイトです。
Writing A Twitter Bot in Golang | TutorialEdge.net
GitHub - dghubble/go-twitter: Go Twitter REST and Streaming API v1.1

Mackerel カスタムメトリックプラグインを開発してみた

先日に引き続き、Mackerelのカスタムメトリックプラグインを開発してみました。
今回は独自のロジックで開発してみました(既に同じようなものはあるかも知らないが・・・)。

作成したのは、AWS S3にあるオブジェクトのサイズを取得し、メトリックに送信するものです。
ソースは以下になります。

GitHub - SrcHndWng/go-learning-mackerel-plugin-aws-s3-size

開発環境はMac、実行環境はAMAZON EC2 Linuxで、それぞれで動作確認をしています。
開発環境にはAWSのクレデンシャル、EC2にはS3にアクセスするEC2ロールが必要となります。

開発の手順は以下の記事と同じです。(ロジックは違うけど)
「Mackerel サーバ監視[実践]入門」を買ってみた - カスタムメトリックプラグイン開発手順メモ - ソースコードから理解する技術-UnderSourceCode

ヘルパーライブラリを利用することで独自のロジックの開発に集中できて非常に楽である
というのが作ってみての感想です。

システムの運用時に監視したい項目があったら、サクッとプラグインを作って監視を行う
ということも十分可能かと思います。

「Mackerel サーバ監視[実践]入門」を買ってみた - カスタムメトリックプラグイン開発手順メモ

Mackerel サーバ監視[実践]入門:書籍案内|技術評論社を買い、読み始めました。
Mackerelの魅力の一つとして、プラグインを自作して独自の監視項目を追加することがあります。

本書を参考に、カスタムメトリックプラグインを作り、Mackerelの画面に表示させてみました。
以下、その時の手順のメモです。詳細は方法は本書を参考にしてください。

前提条件

今回はMac上でプラグインを開発し、Amazon EC2 Linuxに配置して監視を行います。
予めMackerelのアカウントを用意し、EC2インスタンスにはmackerel-agentをインストールしておきます。
開発言語はGolangになります。

※ mackerel-agentのインスタンス手順は公式ヘルプを参考
エージェントをインストールする - Mackerel ヘルプ

開発手順

1. ソースを作成

本書の「5.2 カスタムメトリックプラグインを作る」を参考に、「mackerel-plugin-uptime」を写経します。
今回はバイナリの名前だけ「go-learning-mackerel-plugin-uptime」というように変更しました。

ソースについては本書や、以下のGithub上のソースを参考にできます。
mackerel-agent-plugins/mackerel-plugin-uptime at master · mackerelio/mackerel-agent-plugins · GitHub


2. EC2用にビルド

ソースをEC2用にビルドします。

$ GOOS=linux go build

3. mackerel-agent-pluginsをインストール

EC2にmackerel-agent-pluginsをインストールします。

$ sudo yum install mackerel-agent-plugins

4. mackerel-agent.confにプラグインを追加

/etc/mackerel-agent/mackerel-agent.confに以下を追加します。

[plugin.metrics.uptime]
command = "/home/ec2-user/golang/go-learning-mackerel-plugin-uptime" # 作成したプラグインのパス

5. mackerel-agentを再起動 or EC2を再起動

6. 作成したカステムメトリックを確認

Mackerelの監視画面のカスタムメトリックに、作成したメトリックが表示されていることを確認します。

f:id:UnderSourceCode:20180707190141p:plain

「Amazon Web Servicesを使ったサーバーレスアプリケーション開発ガイド」をGolangで写経してみた - その2

前回に引き続き、Amazon Web Servicesを使ったサーバーレスアプリケーション開発ガイド | マイナビブックスGolangで写経しています。
今回はChapter4をやってみました。

GitHub - SrcHndWng/go-learning-serverless-apps at chapter4


Twitterからデータを取得してKinesisに投げるアプリ(twitterToKinesis)については
CloudFormationでEC2を立ち上げ、アプリのデプロイ、起動までを行うようにしてみました。

Kinesisからイベントを受け取るLambda(kinesisToDynamo)については
Serverless Frameworkを使用している以外は、本に書かれている機能をそのまま実装しています。

「Amazon Web Servicesを使ったサーバーレスアプリケーション開発ガイド」をGolangで写経してみた

Amazon Web Servicesを使ったサーバーレスアプリケーション開発ガイド | マイナビブックスを読み始めました。
ただ読むだけではなく、Golangの勉強がてら、本で紹介されている処理を実装してみました。

実装言語は先に書いたようにGolang、デプロイ周りはServerless Frameworkを使っています。
とりあえずChapter3をやってみたので、以下のGitHubに載せました。

GitHub - SrcHndWng/go-learning-serverless-apps at chapter3

感想としては(まだChapter3までしかやってないけど)・・・
・本の内容については、AWSでのサーバレスのパターンについてソースと構成が丁寧に説明されていると思う
Golangで実装してみた感想は、数ない文字数・if != errによる明確なエラーへの対応が個人的には好み
という印象です。。。

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

動作確認

curlAPIを叩いてもいいのですが、今回は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を使用したCRUDAPIを作成してみました。

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について

GolangAPI Gateway + Lambdaを実装する場合、mainはHanderを呼び出していて、HandlerはWebサーバを起動しているようです。
なので、Handler内でリクエストのメソッドの種類とパスを判定し、処理を切り替えてみました。

テストについて

テストについては、現時点ではDynamoDbの値を直接参照・更新しています。(動作確認用に作っただけなので・・・)

データの採番について

DynamoDbのデータの採番については、テーブル内のデータ数 + 1 をしています。(これも実案件では採番テーブルなどで管理すべきかと思います・・・)