LINEBotをAWSを使ったサーバレスで作成しようとしたところ,既存のウェブサイトだと仕様変更等があり躓く部分があったので,仕様変更後の作り方を書こうと思った.
どんなものを実装するのか
LINE公式アカウントを作って、オウム返しLINEBotを作成する
使用するもの
・API Gateway
・LINE Developers
作成方法
①LINE公式アカウントを作成する
★LINE Developers(https://developers.line.biz/ja/) を使用し,コンソール画面からプロバイダーを作成する.(自分が普段使ってるLINEアカウントでログインした)
Messaging APIを作成する(Messaging APIのアイコンをクリック)

”LINE公式アカウントを作成する”をクリックすると,「LINE公式アカウントの作成」という外部ページに移行する
各項目を入力し”確認”→”完了”でLINE公式アカウントの作成が完了.
★の時にログインしたLINEアカウントに,作った公式アカウントが追加されていればOK(LINEのトーク画面に自動的にメッセージが送られてくる)
”LINE Official Account Managerへ”をクリックし,外部サイトへ移動
規約に同意する
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ボタンを押し忘れた場合は下記のURLをクリック
LINE Official Account Manager(https://manager.line.biz/)
開けたら作成した公式アカウントがアカウントリストにあることを確認.
アカウントの名前を押して選択→規約に同意
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
右上にある設定ボタンを押し左側のバーでMessaging APIを選択

"Messaging APIを利用する"→★の時に作成したプロバイダーを選択→同意する→OK(下の写真のようにURLは空欄でOK)→OK
LINE Developers(https://developers.line.biz/ja/ )で★のときに作ったプロバイダーにMessaging APIチャネルが作成されているかを確認
IAMは,Lambdaが他のAWSサービス(S3など)にアクセスするための権限を管理する仕組み.
今回はデフォルト設定でも問題ないが,S3と連携する場合は追加で権限設定が必要になる.
下記のようにLambdaとAPI Gatewayが作成されていれば成功.

API Gatewayで先ほど作ったAPIを選択→メソッドを作成

ルートディレクトリを選択した後,”CORSを有効にする”をクリック

下記のように設定して保存

※今回はLINEからのWebhookのみを受けるためCORSは必須ではないが、
ブラウザからAPIを呼び出す場合には必要になる.
LINE Developersに戻り,プロバイダーのMessaging API設定からチャネルアクセストークンを発行
このチャネルアクセストークンをLambdaに結び付ける.Lambdaの設定,環境変数,編集をおす
●環境変数の追加
キー名:任意,値:LINE Developersで発行したアクセストークン
③API Gatewayのデプロイをする
まだステージを作っていない場合は新しいステージを作ってください
ステージ名:任意

→デプロイ
④API GatewayとLINEボットの連携
Webhookを設定する
Webhookとは、LINEでメッセージ受信などのイベントが発生した際に、
指定したURL(今回はAPI Gateway)へHTTPリクエストを送る仕組みである.
LINE Developers>Messaging API設定>Webhook URLにコピペ
Webhookの利用をONにして画面がこうなっていることを確認
Lambdaにコードを追加
説明は以下の通り
- event["body"]にはLINEから送られてきたJSONが格納されている
- replyTokenはユーザーへの返信に必要な一時トークン
- Reply APIは「受信したメッセージへの返信」、
Push APIは「任意のタイミングでの送信」に使用する
⚠8行目にある”CHANNEL_ACCESS_TOKEN_LINE”は●環境変数の追加で指定したキー名と一致させてください
以下にLambda関数の実装例を示す.
import json
import os
import urllib.request
def lambda_handler(event, context):
# --- 環境変数からLINEチャネルアクセストークン取得 ---
# ※ 事前に Lambda の「環境変数」に LINE_CHANNEL_ACCESS_TOKEN を登録しておく
line_channel_access_token = os.environ.get('CHANNEL_ACCESS_TOKEN_LINE')
# --- LINE Messaging API のエンドポイント ---
REPLY_API_URL = "https://api.line.me/v2/bot/message/reply"
PUSH_API_URL = "https://api.line.me/v2/bot/message/push"
# --- 共通ヘッダー ---
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {line_channel_access_token}"
}
# --- リクエストボディを取得 ---
try:
body = json.loads(event["body"])
except (KeyError, json.JSONDecodeError):
return {
'statusCode': 200,
'body': json.dumps({'message': 'ok (no body)'})
}
# --- events が存在しない場合 ---
if "events" not in body or not body["events"]:
return {
'statusCode': 200,
'body': json.dumps({'message': 'ok (no events)'})
}
# --- イベント情報を抽出 ---
event_data = body["events"][0]
event_type = event_data["type"]
user_id = event_data["source"]["userId"]
# --- メッセージイベントの場合 ---
if event_type == "message":
message_type = event_data["message"]["type"]
reply_token = event_data["replyToken"]
# メッセージタイプ別処理
if message_type == "text":
user_message = event_data["message"]["text"]
reply_text = user_message # オウム返し
elif message_type == "image":
reply_text = "綺麗な画像ですね"
elif message_type == "sticker":
reply_text = "かわいいスタンプですね"
else:
reply_text = "対応していないメッセージタイプです。"
# --- 返信データ作成 ---
data = {
"replyToken": reply_token,
"messages": [
{"type": "text", "text": reply_text}
]
}
# --- LINEのReply APIへPOST ---
req = urllib.request.Request(
REPLY_API_URL,
data=json.dumps(data).encode("utf-8"),
headers=headers
)
with urllib.request.urlopen(req) as res:
res.read()
# --- メッセージ取消イベント ---
elif event_type == "unsend":
data = {
"to": user_id,
"messages": [
{"type": "text", "text": "送信取消されました。"}
]
}
req = urllib.request.Request(
PUSH_API_URL,
data=json.dumps(data).encode("utf-8"),
headers=headers
)
with urllib.request.urlopen(req) as res:
res.read()
# --- その他イベントは無視 ---
else:
print(f"Unhandled event type: {event_type}")
return {
'statusCode': 200,
'body': json.dumps({'message': 'OK'})
}
ここまで出来たらAPI Gatewayでデプロイする.
※Lambdaのコードを変更しただけでは反映されないため,
API Gatewayで再度デプロイを行う必要がある.(さっきステージを作ったので二回目以降デプロイするときは既存のステージでデプロイする.→下記変わるけどいいですか?といった警告文が出るが,そのままデプロイして問題ない)
実際に公式LINEに文字を送るとオウム返しで文字を返してくれるLINE Botを生成できた.
まとめ
本記事では、AWSのAPI GatewayとLambdaを用いて、
オウム返しを行うLINE Botの作成方法を紹介した.
サーバレス構成によりサーバ構築が不要であり、
比較的簡単にLINE Botを構築できることが分かる.
今後はS3やデータベースと連携することで、
より実用的なBotに拡張することが可能である.



















