12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Go (その2)Advent Calendar 2016

Day 2

Goで作ったLINE BotをAzure WebAppsにホスティングしてみる #linebot

Posted at

GoとLINE BotとAzureの話です。
意外とWebAppsでGoを動かすチュートリアルが無いので書いてみました。

アドベントカレンダー遅刻です すみません汗

前に「GoとlocaltunnelでLine Messaging APIを使ってオウム返しLINE Botを試す #golangjp」の記事でlocaltunnelを使ってGoからLINE Messaging APIを使う記事を書きました。

localtunnelはハローワールドにはいいですが、実際の運用には適していません。今日はWebAppsにホスティングしてみたいと思います。

Running Go on Azure App Servicesを参考に進めます。

WebAppsでアプリケーションを作る

まずはインスタンス立ち上げですが、管理画面からぽちぽちとボタン押せばいけます。

Azure Web AppsにGitHub経由でNode.jsアプリケーションをデプロイする仕組みを無料で作るとほぼ同じ内容でいけます。

URLにアクセスするとこういう画面が表示される状態まで進めましょう

server.goを作成してデプロイ

アプリケーションのメインになるserver.goを作成します。
ファイル名はserver.goじゃないと動かない(かも)です。

  • server.go
server.go
package main  
import (  
    "fmt"
    "net/http"
    "os" 
)

func handler(w http.ResponseWriter, r *http.Request) {  
    fmt.Fprintf(w, "Hi there - this page was served using Go \\o/")
}
func main() {  
    http.HandleFunc("/", handler)
    http.ListenAndServe(":"+os.Getenv("HTTP_PLATFORM_PORT"), nil)
}

作成したserver.goを「Azure Web AppsにGitHub経由でNode.jsアプリケーションをデプロイする仕組みを無料で作る」を参考にGitHub経由でデプロイ設定をします。

URLを叩いてHi there - this page was served using Go \\o/というテキストが表示されてれば成功です。

LINE Botのホスティングに使う

WebAppsの環境変数にLINEのトークンを設定

GoとlocaltunnelでLine Messaging APIを使ってオウム返しLINE Botを試す #golangjpをもとにLINE Botを作りましょう。

LINEのBot管理画面から以下の二つの値をメモしておきましょう。

  • Channel Secret
  • Channel Access Token

この二つの値は外部に知られるとまずいので、ソースコードに入れずに環境変数に埋め込みます。
WebAppsの管理画面のアプリケーション設定 > アプリ設定にキーと値を設定します。

server.goを変更

server.goを以下に変更しましょう。

os.Getenv("LINE_CHANNEL_SECRET")os.Getenv("LINE_CHANNEL_ACCESS_TOKEN")の部分で先ほど設定した値を呼び出しています。それ以外は前回記事と同様です。

  • server.go
server.go
package main  
import (  
    "fmt"
    "net/http"
    "os" 
    "log"

	"github.com/line/line-bot-sdk-go/linebot"
)

func handler(w http.ResponseWriter, r *http.Request) {  
    fmt.Fprintf(w, "Hi there - this page was served using Go \\o/")
}
func main() {
    bot, err := linebot.New(
		os.Getenv("LINE_CHANNEL_SECRET"),
		os.Getenv("LINE_CHANNEL_ACCESS_TOKEN"),
	)
	if err != nil {
		log.Fatal(err)
	}

    http.HandleFunc("/", handler)
	// Setup HTTP Server for receiving requests from LINE platform
	http.HandleFunc("/callback", func(w http.ResponseWriter, req *http.Request) {
        fmt.Printf("ping\n")
		events, err := bot.ParseRequest(req)
		if err != nil {
			if err == linebot.ErrInvalidSignature {
				w.WriteHeader(400)
			} else {
				w.WriteHeader(500)
			}
			return
		}
		for _, event := range events {
			if event.Type == linebot.EventTypeMessage {
				switch message := event.Message.(type) {
				case *linebot.TextMessage:
                    fmt.Printf("%v", message)
					if _, err = bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(message.Text)).Do(); err != nil {
						log.Print(err)
					}
				}
			}
		}
	})
    
	// This is just a sample code.
	// For actually use, you must support HTTPS by using `ListenAndServeTLS`, reverse proxy or etc.
    fmt.Printf("サーバーを起動しています...")
    
	if err := http.ListenAndServe(":"+os.Getenv("HTTP_PLATFORM_PORT"), nil); err != nil {
		log.Fatal(err)
	}
}

ちなみに外部モジュールの読み込みについては特に設定がいらずに、 go getコマンドの作業はWebApps側が自動的にやってくれます。 便利ですね。

Callback URLを設定

LINE Botの設定にhttps://xxxxxxx/callbackを設定しましょう。
(先ほどの画像の青枠で囲まれてる部分)

server.go内の/callbackにハンドリングしてる関数がBotに話しかけた際に呼ばれるようになります。

server.go
 http.HandleFunc("/callback", func(w http.ResponseWriter, req *http.Request) {
 
 
 (ここがLINE Botに話掛けた時に呼ばれるようになる箇所)
 
 
 }

試す

更新したら再度デプロイしてLINE Botの挙動を確認してみましょう。

無事にホスティングされるとこんな感じでオウム返ししてくれます。

おわりに

こんな感じでGoで作ったLINE BotとAzure WebAppsにホスティングして運用準備を整えることができました。

本当はIntroduction to App Service on Linuxの新WebAppsを試してみたかったけどうまくいかなかったので別の機会に再チャレンジします。

12
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?