0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWSを使ってオウム返しLINE Botを作る

0
Last updated at Posted at 2026-04-19

LINEBotをAWSを使ったサーバレスで作成しようとしたところ,既存のウェブサイトだと仕様変更等があり躓く部分があったので,仕様変更後の作り方を書こうと思った.

どんなものを実装するのか

LINE公式アカウントを作って、オウム返しLINEBotを作成する

使用するもの

・API Gateway
・LINE Developers

作成方法

①LINE公式アカウントを作成する
★LINE Developers(https://developers.line.biz/ja/) を使用し,コンソール画面からプロバイダーを作成する.(自分が普段使ってるLINEアカウントでログインした)

image.png

プロバイダー名は任意
image.png

Messaging APIを作成する(Messaging APIのアイコンをクリック)
image.png

”LINE公式アカウントを作成する”をクリックすると,「LINE公式アカウントの作成」という外部ページに移行する

image.png

各項目を入力し”確認”→”完了”でLINE公式アカウントの作成が完了.
★の時にログインしたLINEアカウントに,作った公式アカウントが追加されていればOK(LINEのトーク画面に自動的にメッセージが送られてくる)

”LINE Official Account Managerへ”をクリックし,外部サイトへ移動
規約に同意する

image.png

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ボタンを押し忘れた場合は下記のURLをクリック
LINE Official Account Manager(https://manager.line.biz/)
開けたら作成した公式アカウントがアカウントリストにあることを確認.
アカウントの名前を押して選択→規約に同意
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

下の画像のページに遷移できればOK!
image.png

右上にある設定ボタンを押し左側のバーでMessaging APIを選択
image.png

"Messaging APIを利用する"→★の時に作成したプロバイダーを選択→同意する→OK(下の写真のようにURLは空欄でOK)→OK

image.png

下記画面になればOK
image.png

LINE Developers(https://developers.line.biz/ja/ )で★のときに作ったプロバイダーにMessaging APIチャネルが作成されているかを確認

image.png

②Lambdaで関数の作成
image.png

image.png

IAMは,Lambdaが他のAWSサービス(S3など)にアクセスするための権限を管理する仕組み.
今回はデフォルト設定でも問題ないが,S3と連携する場合は追加で権限設定が必要になる.

下記のようにLambdaとAPI Gatewayが作成されていれば成功.
image.png

API Gatewayで先ほど作ったAPIを選択→メソッドを作成
スクリーンショット 2026-04-19 094432.png

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

下記のように設定して保存
image.png
※今回はLINEからのWebhookのみを受けるためCORSは必須ではないが、
ブラウザからAPIを呼び出す場合には必要になる.

image.png

LINE Developersに戻り,プロバイダーのMessaging API設定からチャネルアクセストークンを発行

image.png

このチャネルアクセストークンをLambdaに結び付ける.Lambdaの設定,環境変数,編集をおす

image.png

●環境変数の追加

image.png

キー名:任意,値:LINE Developersで発行したアクセストークン

image.png

③API Gatewayのデプロイをする

image.png

image.png

まだステージを作っていない場合は新しいステージを作ってください
ステージ名:任意
image.png
→デプロイ

④API GatewayとLINEボットの連携
Webhookを設定する
Webhookとは、LINEでメッセージ受信などのイベントが発生した際に、
指定したURL(今回はAPI Gateway)へHTTPリクエストを送る仕組みである.

”URLを呼び出す”のURLをコピー
image.png

LINE Developers>Messaging API設定>Webhook URLにコピペ

image.png

Webhookの利用をONにして画面がこうなっていることを確認

image.png

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に拡張することが可能である.

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?