6
3

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 3 years have passed since last update.

【AWS Lambda×LINE Messaging API】ちょー簡単!オウム返しBotを作ろう

6
Last updated at Posted at 2021-06-26

はじめに

皆さん、Lambdaをご存知でしょうか?
Lambdaはサーバーレスアーキテクチャを実現する上で根幹となるサービスです。

サーバーレスアーキテクチャとは

AWSにおけるサーバーレスとは、**「インスタンスベースの仮想サーバー(EC2など)を使わずにアプリケーションを開発するアーキテクチャ」**を指します。

一般にシステムの運用には、プログラムを動かすためのサーバーが必要です。
そしてそのサーバーは、常に稼働していなければなりません。

しかし開発者がやりたいことは、「サーバーの管理」なのでしょうか?
エンドユーザーに価値を届けることこそが使命なわけです。

ということで、こういうめんどくさい作業から解放してくれるのがサーバーレスアーキテクチャなわけです。

サーバーレスアーキテクチャでよく使われるサービスは以下の通りです。
特に、丸で囲っている3つがよく使われます。

スクリーンショット 2021-06-26 15.43.25.png

AWS Lambdaの特徴

サーバーのプロビジョニング/管理なしでプログラムを実行できるサービスです。
**「何言ってんの?」**と思われた方のために要約すると、
「コードの実行などはLambda側でやるから、あなたはコードを書いてなさい」ということです。

そして、Lambdaの圧倒的なメリットは料金の安さです。

リクエストベースの料金体系となっており、
実行回数×実行時間となっています。

リクエスト 100万件あたり 0.20USD
実行時間 GB-秒あたり 0.0000166667USD

これだけ安いのにも関わらず無料枠もあります。
1か月ごとに100万件の無料リクエスト、および40万GB-秒のコンピューティング時間が無料利用枠です。

なので、もはや0円です。
HerokuやNetlifyなど無料でデプロイできる選択肢はたくさんありますが、
これらはレスポンスに時間がかかるなど問題があります。

そういった問題も緩和できるLambdaは初学者の味方です。

しかし対応言語が限られているのが若干のネックです。
Java、Go、PowerShell、Node.js、C#、Python、Rubyなどが対応しています。
有名どころとしては、PHPが対応していないのが残念ですが、カスタムランタイムを実装することで利用可能になります。(少々難易度が上がります)

アプリケーションエンジニアこそぜひ!!

サーバーレスアーキテクチャであれば、EC2と比べ自由度は低くなりますが、管理の手間がほぼありません。
なので、アプリケーションエンジニアのインフラの入口としては最適な題材です。

DynamoDBはRDSに比べるとNoSQLならではの癖があるので、1つ壁があります。(Joinが使えないなど)
テーブル構造など意識して取り組む必要があるのでここだけ難易度があります。

ということで今回は、LambdaとAPI Gatewayの2つのみを使ってオウム返しのBotを作りたいと思います。(デバッグのためにCloutWatchも少しだけ使います。)

アーキテクチャ

LINEで「こんにちは」と入力したら、「こんにちは」と返ってくれば成功です!

arch.png

ハンズオン

前提

初めてAWSを使う方に対しての注意です。
ルートユーザーで行うのはよろしくないので、全ての権限を与えたAdministratorユーザーを作っておいてください。

公式サイトはこちらです。

文章は辛いよって方は、初学者のハンズオン動画があるのでこちらからどうぞ。

また、LINE Developersのアカウントも必要となります。
LINE関連の記事を書いているのでこちらから確認してください。
チャネルシークレットチャネルアクセストークンが発行できればOKです。

Lambdaで使うコードを作る

LINE Messaging API SDK for nodejsに書いていることをやっていきます。
こちらがまんまオウム返しなので、これをLambdaで使えるように書き直していきます。

package.jsonの作成

ターミナル
$ npm init -y

パッケージのインストール

ターミナル
$ npm install @line/bot-sdk --save

コードを書いていきます

先に説明すると、exports.handler = async (event, context) => {}内にコードを書いていきます。

ちなみにここで、大切なので**コールドスタートウォームスタート**についても解説します。
Lambdaは呼び出されると、コンテナ上でプログラムが実行されます。
コンテナは再利用されますが、利用可能なコンテナがないときはコールドスタートとなります。
また、exports.handler外の場合、ウォームスタートとなります。
なので使い回す処理などはウォームスタートにすると早く動作します。

lambda.png

index.js
'use strict';

// パッケージのインストール
const line = require('@line/bot-sdk');

// LINEアクセストークンの設定
const config = {
  channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN,
  channelSecret: process.env.CHANNEL_SECRET,
};

// インスタンス化
const client = new line.Client(config);

exports.handler = async (event, context) => {
  // eventを出力
  console.log(event);

  // JSONとして解析して値やオブジェクトを構築する
  const body = JSON.parse(event.body);
  console.log(`【body】: ${JSON.stringify(body)}`);

  // LINE Eventを取得
  const response = body.events[0];
  console.log(`【response】: ${JSON.stringify(response)}`);

  // メッセージ送信のために必要な情報
  const replyToken = response.replyToken;
  const post = {
    type: 'text',
    text: response.message.text,
  };

  try {
    await client.replyMessage(replyToken, post);
  } catch (err) {
    console.log(err);
  }
};

console.logは、CloudWatch内で確認できるので、デバッグも容易です。
なので、ここでコードの全体像が理解できなくても大丈夫です!

Lambdaを作成する

Lambdaとコンソールで検索してください。

スクリーンショット 2021-06-26 18.10.34.png

「関数の作成」をクリック

スクリーンショット 2021-06-26 18.11.47.png

設定を見ていきましょう!

スクリーンショット 2021-06-26 18.13.05.png

作成完了しました!

スクリーンショット 2021-06-26 18.15.31.png

では、先ほど作成したコードをLambdaで使えるようにしましょう。
方法は2つあります。
・S3経由
・zip経由

zipの方が簡単なので今回はzipにします。

node_moduleindex.jsの2つをzipにしてください。
命名は適当でいいです。

スクリーンショット 2021-06-26 18.18.52.png

ではアップロードしましょう。

スクリーンショット 2021-06-26 18.19.35.png

コードがLambdaで確認できました!

スクリーンショット 2021-06-26 18.20.44.png

では次に環境変数の設定を行います。
先ほどLINEで取得した値をこちらで入力します。

スクリーンショット 2021-06-26 18.22.16.png

これでLambdaは完了です。

API Gatewayの設定

API Gatewayとコンソールで検索してください。

APIタイプはREST APIで作成します。

スクリーンショット 2021-06-26 18.24.51.png

API名は適当でいいです。

スクリーンショット 2021-06-26 18.26.54.png

メソッドの作成をしましょう。

スクリーンショット 2021-06-26 18.27.26.png

POSTを選択して決定。

スクリーンショット 2021-06-26 18.28.04.png

セットアップを行う。

スクリーンショット 2021-06-26 18.29.36.png

CORSの設定を行います。

スクリーンショット 2021-06-26 18.31.10.png

デフォルトのままでOK

スクリーンショット 2021-06-26 18.31.40.png

最後にデプロイしましょう!

スクリーンショット 2021-06-26 18.32.59.png

ステージ名も適当でいいです。

スクリーンショット 2021-06-26 18.33.29.png

このようにURLが発行されます。

スクリーンショット 2021-06-26 18.34.21.png

ではこのURLをLINEの方に入力しましょう。

完了したらテストです。
結果を見てみましょう。

iOS の画像.png

うまくいってますね!
私はユーロ2020全試合見ているので睡眠時間が最近やばいですw
ちなみにポルトガル推しです。

本題に戻ります。
最後にCloudWatchでデバッグがどうなっているのか見ていきましょう。

スクリーンショット 2021-06-26 18.41.29.png

このログストリーム内にデバッグの内容が格納されています。

スクリーンショット 2021-06-26 18.42.29.png

デバッグできてますね!

スクリーンショット 2021-06-26 18.43.30.png

これで完了です。
ちなみに、LambdaはEC2などと違って、起動時間ではなくリクエストが課金条件なのでわざわざ削除する必要もありません。

最後に

次はDynamoDBを使う構成のアプリを作成していきます。
ちょっとレベルアップしてます。

6
3
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
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?