GCPのCompute Engine(GCE)を使えば無料枠の範囲内でLINE Botを作ることができます。
このエントリでは、GCEを使ってLINE Botを作る方法を説明します。
システム構成は下記の通りです。一般的なWebサービスと同じような構成で、特に変わったところはないかと思います。
 GCPの設定は、下記のサイトを参考にするとわかりやすいです。
今回はSinatraを使うためRubyをインストールします。おおまかには次のような手順です。
- GCEでusリージョンにf1-microインスタンスを立てる
 - SSHのポート変更 (ネットワークタグ)
 - IPアドレスの固定
 - Ruby & RubyGemsのインストール
 
所有しているドメインから、固定したGCEのIPアドレスが引けるようにAレコードを設定します。
無料クレジットを使うものの、GCPのDNSサービス(CLOUD DNS)が使えます。
SSL証明書は無料のLet's Encryptを使います。
有効期間は90日と短めですが、証明書はCertbotと呼ばれるクライアントを使って簡単に取得、更新することができます。
さらにDebianだと、Certbotインストール時に証明書更新のCRONジョブを自動で追加してくれるので便利です。
 証明書の更新コマンドcertbot renewは動作確認のため一度は実行しておきましょう。  
パーミッションエラーになってしまう場合は、、パーミッションを付与して実行できることを確認しておきましょう。
NginxにSSL証明書を設定します。
セキュリティのために「NginxでSSLの評価をA+にする手順」を参考に、SSLv3の無効化など対応しておきましょう。
下記は今回の設定例です。Unicornを使うためupstreamディレクティブでソケットファイルを指定しています。
upstream linebot {
    server unix:/tmp/linebot.sock;
}
server {
    listen                     443;
    server_name                example.com;
    ssl                        on;
    ssl_certificate            /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key        /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols              TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers  on;
    ssl_ciphers                ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!aNULL!eNull:!EXPORT:!DES:!3DES:!MD5:!DSS;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    location /linebot/ {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://linebot;
        proxy_redirect http:// https://;
    }
}  下記ページが参考になります。
LINE Messaging APIの使い方はLINE Bot SDKに言語ごとにまとめられています。そのままで動くようになっています。
今回作ったLINE Botのコードの抜粋を掲載しておきます。
require './app.rb'
run Linebot  
class Linebot < Sinatra::Base
  def client
    @client ||= Line::Bot::Client.new do |config|
      config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
      config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
    end
  end
  post '/linebot/callback' do
    body = request.body.read
    signature = request.env['HTTP_X_LINE_SIGNATURE']
    unless client.validate_signature(body, signature)
      error 400 do 'Bad Request' end
    end
    events = client.parse_events_from(body)
    events.each do |event|
      case event
      when Line::Bot::Event::Message
        case event.type
        when Line::Bot::Event::MessageType::Text
          reply_text = build_reply_text event.message['text']
          if !reply_text.nil? && reply_text != ""
            client.reply_message(event['replyToken'], type: 'text', text: reply_text)
          end
        when Line::Bot::Event::MessageType::Image, Line::Bot::Event::MessageType::Video
          response = client.get_message_content(event.message['id'])
          tf = Tempfile.open("content")
          tf.write(response.body)
        end
      end
    end
    "OK"
  end
end  
 
以上です。このエントリでは、GCEを使ってLINE Botを作る方法を説明しました。
 
コメントを送る
コメントはブログオーナーのみ閲覧できます