はじめに
皆さん、Lambdaをご存知でしょうか?
Lambdaはサーバーレスアーキテクチャを実現する上で根幹となるサービスです。
サーバーレスアーキテクチャとは
AWSにおけるサーバーレスとは、**「インスタンスベースの仮想サーバー(EC2など)を使わずにアプリケーションを開発するアーキテクチャ」**を指します。
一般にシステムの運用には、プログラムを動かすためのサーバーが必要です。
そしてそのサーバーは、常に稼働していなければなりません。
しかし開発者がやりたいことは、「サーバーの管理」なのでしょうか?
エンドユーザーに価値を届けることこそが使命なわけです。
ということで、こういうめんどくさい作業から解放してくれるのがサーバーレスアーキテクチャなわけです。
サーバーレスアーキテクチャでよく使われるサービスは以下の通りです。
特に、丸で囲っている3つがよく使われます。
ということで、この3つ全てを使った翻訳アプリを作りたいと思います。
アーキテクチャ
以下の2つの条件を満たしたら成功です。
①LINEで「こんにちは」と入力したら、「Hello」と返ってくる
②タイムスタンプと「こんにちは」、「Hello」がDBに保存される
ハンズオン
前提
初めてAWSを使う方に対しての注意です。
ルートユーザーで行うのはよろしくないので、全ての権限を与えたAdministrator
ユーザーを作っておいてください。
公式サイトはこちらです。
文章は辛いよって方は、初学者のハンズオン動画があるのでこちらからどうぞ。
また、LINE Developersのアカウントも必要となります。
LINE関連の記事を書いているのでこちらから確認してください。
チャネルシークレットとチャネルアクセストークンが発行できればOKです。
Lambdaで使うコードを作る
LINE Messaging API SDK for nodejsに書いていることをやっていきます。
package.json
の作成
$ npm init -y
パッケージのインストール
$ npm install @line/bot-sdk aws-sdk --save
翻訳部分を作る
今回は、翻訳する部分、DBにデータを登録する部分と様々な機能があるため動作ごとにファイルを切り分けてあげましょう。
以下のように作っていきます。
.
├── api/
│ ├── Common/
│ │ └── getTranslate.js
│ │ └── putDynamoDB.js
│ └── index.js
まずは、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);
// モジュールのインストール
const translate = require('./Common/getTranslate');
exports.handler = async (event, context) => {
// JSONとして解析して値やオブジェクトを構築する
const body = JSON.parse(event.body);
// LINE Eventを取得
const response = body.events[0];
// 翻訳を行うために必要な情報
const input_text = response.message.text;
const sourceLang = 'ja';
const targetLang = 'en';
// 翻訳(関数呼び出し)
const res = await translate.getTranslate(input_text, sourceLang, targetLang);
const output_text = res.TranslatedText;
// メッセージ送信のために必要な情報
const replyToken = response.replyToken;
const post = {
type: 'text',
text: output_text,
};
try {
// メッセージの送信
await client.replyMessage(replyToken, post);
} catch (err) {
console.log(err);
}
};
では次に、getTranslate.js
を作っていきましょう。
コードだけ書いても訳がわからないと思うので、リファレンスを見ましょう。
入力されたテキストをソース言語からターゲット言語に変換する、translateText
を使います。
必須項目は以下の3つで、SourceLanguageCode
に元の言語コード、TargetLanguageCode
に変換先の言語コード、Text
に変換するテキストを入れればいいことがわかります。
SourceLanguageCode: 'STRING_VALUE', /* required */
TargetLanguageCode: 'STRING_VALUE', /* required */
Text: 'STRING_VALUE', /* required */
そのあとはこのデータを実行するだけです。
translate.translateText(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
APIが理解できたところで進めていきましょう。
// パッケージのインストール
const AWS = require('aws-sdk');
// 必要なAWSサービス
const translate = new AWS.Translate();
exports.getTranslate = (input, inLang, outLang) => {
return new Promise((resolve, reject) => {
// 必要なデータ
const params = {
Text: input,
SourceLanguageCode: inLang,
TargetLanguageCode: outLang,
};
// 翻訳を行う
translate.translateText(params, (err, data) => {
if (err) {
console.log(err);
reject();
} else {
resolve(data);
}
});
});
};
Lambdaを作成する
Lambdaとコンソールで検索してください。
「関数の作成」をクリック
設定を見ていきましょう!
作成完了しました!
では、先ほど作成したコードをLambdaで使えるようにしましょう。
方法は2つあります。
・S3経由
・zip経由
zipの方が簡単なので今回はzipにします。
今回ファイルサイズだいぶ限界になるので10MBオーバーしたときはS3にアップロードしてください。
ちなみにaws-sdk
をインストールしましたが、Lambdaに標準装備しているパッケージなのでこちらをアンストして容量下げてもらっても構いません。
node_module
とCommonディレクトリ
とindex.js
の3つをzipにしてください。
命名は適当でいいです。
ではアップロードしましょう。
では次に環境変数の設定を行います。
先ほどLINEで取得した値をこちらで入力します。
では最後に、実行ロールにAWS Translate
の権限を付与しましょう。
ポリシーをアタッチさせましょう。
これでアタッチできました。
一旦Lambdaは完了です。
API Gatewayの設定
API Gatewayとコンソールで検索してください。
APIタイプはREST APIで作成します。
API名は適当でいいです。
メソッドの作成をしましょう。
POSTを選択して決定。
セットアップを行う。
CORSの設定を行います。
デフォルトのままでOK
最後にデプロイしましょう!
ステージ名も適当でいいです。
このようにURLが発行されます。
ではこのURLをLINEの方に入力しましょう。
完了したらテストです。
結果を見てみましょう。
うまくいってますね!
Lambdaで使うコードを作る
DBにデータを登録する機能を作る
.
├── api/
│ ├── Common/
│ │ └── getTranslate.js
│ │ └── putDynamoDB.js
│ └── index.js
最初に、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);
// モジュールのインストール
const translate = require('./Common/getTranslate');
const dynamodb = require('./Common/putDynamoDB');
exports.handler = async (event, context) => {
// JSONとして解析して値やオブジェクトを構築する
const body = JSON.parse(event.body);
// LINE Eventを取得
const response = body.events[0];
// 翻訳を行う
const input_text = response.message.text;
const sourceLang = 'ja';
const targetLang = 'en';
// 翻訳(関数呼び出し)
const res = await translate.getTranslate(input_text, sourceLang, targetLang);
const output_text = res.TranslatedText;
// メッセージ送信のために必要な情報
const replyToken = response.replyToken;
const post = {
type: 'text',
text: output_text,
};
// DB-タイムスタンプ
const date = new Date();
const Y = date.getFullYear();
const M = ('00' + (date.getMonth() + 1)).slice(-2);
const D = ('00' + date.getDate()).slice(-2);
const h = ('00' + (date.getHours() + 9)).slice(-2);
const m = ('00' + date.getMinutes()).slice(-2);
const s = ('00' + date.getSeconds()).slice(-2);
const dayTime = Y + M + D + h + m + s;
try {
// メッセージの送信
await client.replyMessage(replyToken, post);
// DB保存(関数呼び出し)
await dynamodb.putDynamoDB(dayTime, input_text, output_text);
} catch (err) {
console.log(err);
}
};
次に、putDynamoDB.js
を作ります。
コードだけ書いても訳がわからないと思うので、リファレンスを見ましょう。
アイテム(レコード)を作成したいので、putItem
を使います。
必須項目は以下の3つで、Item
にデータ、ReturnConsumedCapacity
に集計、TableName
にテーブルの名前を入れればいいことがわかります。
var params = {
Item: {
"AlbumTitle": {
S: "Somewhat Famous"
},
"Artist": {
S: "No One You Know"
},
"SongTitle": {
S: "Call Me Today"
}
},
ReturnConsumedCapacity: "TOTAL",
TableName: "Music"
};
そのあとはこのデータを実行するだけです。
dynamodb.putItem(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
APIが理解できたところで進めていきましょう。
// パッケージのインストール
const AWS = require('aws-sdk');
// 必要なAWSサービス
const dynamodb = new AWS.DynamoDB();
exports.putDynamoDB = (dayTime, input, output) => {
return new Promise((resolve, reject) => {
const params = {
Item: {
timestamp: {
S: dayTime,
},
input_text: {
S: input,
},
output_text: {
S: output,
},
},
ReturnConsumedCapacity: 'TOTAL',
TableName: 'translations_history',
};
dynamodb.putItem(params, (err, data) => {
if (err) {
console.log(err);
reject();
} else {
resolve();
}
});
});
};
では最後に、実行ロールにAWS DynamoDB
の権限を付与しましょう。
ポリシーをアタッチさせましょう。
これでアタッチできました。
DynamoDBを作成する
設定はこのようにします。
これで完了です。
最後に正しく動作するか確認していきましょう。
翻訳は正しくできていますね!
では次に、DBにデータが保存されているか確認しましょう。
保存されてますね!
時刻も問題なく反映されています。
これで全て終了です。
最後に
少し難しかった等あれば、DynamoDBを使わないただのおうむ返しアプリなども作っているのでこちらも参考にされてください。
次は以前作成した天気予報アプリなどをLambdaでデプロイしていきます。
最後まで読んでいただきありがとうございます。