AWS Lambdaで実践できる効率化の秘訣
こんにちは、佐野です!
皆さんは
・アプリに新規ユーザーが登録されたら自動で通知が来たら管理しやすいのになぁ…
・データベースに情報が追加されたとき、自動で集計されたら業務も楽になるのに…
と考えたことはないですか?
そんな「自動化」や「効率化」をサーバー準備なしでコストを抑えて実装できる夢のようなサービス。 それが「AWS Lambda」というAWSサービスです!
今回は、AWS Lambdaを利用することでできることやユースケースをご紹介したいと思います!
【目次】
・AWS Lambdaとは?
・AWS Lambdaを使うことでできること
・どんな場面で便利なのか?
・Lambdaのユースケース
・実際にAWS Lambdaを活用してみた!
・まとめ
AWS Lambdaとは?
AWS Lambdaは、Amazonが提供する「サーバーレスコンピューティングサービス」です。
「サーバーレス」というと、「サーバーがないの?」と思う方もいるかもしれませんが、実際には裏側でAWSがサーバーを管理してくれています。(マネージドサービス)
つまり、ユーザーはサーバーの運用・保守の手間を必要とせず、「動かしたいプログラム(コード)」だけを用意すればいいのが特徴です。
また、プログラムが必要なときに自動で動き、終われば停止するので、無駄なコストがかかりません!
AWS Lambdaを使うことでできること
・webサイトにアップロードされた画像を小さくリサイズ
-3.png?width=495&height=334&name=GetImage%20(1)-3.png)
・アプリに新規ユーザが登録されたら自動でメールが送信される
-3.png?width=495&height=285&name=GetImage%20(2)-3.png)
・決まった時刻に天気予報を取得して通知される
-3.png?width=495&height=330&name=GetImage%20(3)-3.png)
・データベースに新しいデータが入ったら自動で集計する
-3.png?width=495&height=330&name=GetImage%20(4)-3.png)
など 、従来では、自分でサーバーを用意して、ソフトウェアをインストールして、プログラムを常に動かして…という手間が必要でした。
しかしLambdaを使えば、必要なときだけプログラムが起動し、自動で処理してくれるのです。
どんな場面で便利なのか?
AWS Lambdaは、「何かのきっかけ(イベント)」が起こったときに自動で処理させるのが便利です!
例えば、
・S3にファイルがアップロードされた → Lambdaが起動してファイル処理を実行
-2.png?width=495&height=296&name=GetImage%20(5)-2.png)
他にも、
・データベースに新しいデータが追加された → Lambdaが起動して集計
・API経由でリクエストを受け取った → Lambdaが起動してデータを返す
また、常に処理させるわけではないため、コストも最小限に抑えることができます。
Lambdaのユースケース
実際にLambdaは以下のような用途に利用されています。
・webアプリケーションの簡単なバックエンド処理 
→ webでアップロードされた画像の加工やユーザ登録の自動メール送信など 
・データ処理の自動化 
→ データの収集、集計、データベースへの保存を自動化 
・サーバーレスAPIの実装 
→ API Gatewayと組み合わせて、webサービスのAPIをサーバーレスで作成 
・チャットボットのバックエンド 
→ 会話内容に応じてLambdaが処理を実行 
Lambdaは他のAWSサービス(S3やDynamoDB、API Gatewayなど)を組み合わせることで「自動化」「効率化」「サーバーレスでの構築」が簡単に実現することができます。
実際にAWS Lambdaを活用してみた!
今回は、「対象者が対象範囲外に出たときに通知される」といった機能をAWS Lambdaを活用して実装してみました! 
※本構成では「iPhoneのショートカット」が外部API(API Gateway)にアクセスする必要があるため、圏外などネットワークが使えない状況では通知処理が実行されません。 
利用したサービス
・LINE Developers
- Messaging API
・API Gateway
・AWS Lambda
・iPhone(ショートカット)
作成したサービスの全体図
-2.png?width=495&height=291&name=GetImage%20(6)-2.png)
①LINE DevelopersよりMessaging APIを活用し、Botから自動通知されるようにしたい 
→ チャネルアクセストークンを取得し、Lambda関数に使用(Botを介して通知される) 
-2.png?width=1366&height=682&name=GetImage%20(7)-2.png)
-1.png?width=1366&height=675&name=GetImage%20(8)-1.png)
②AWSコンソールからLambdaを検索し、コードタブのコードソースに先ほどのトークンを含めた、通知する本文内容や任意の条件(特定の時間帯には通知されないようにするなど)を設定したコードを書き込む。
※本記事では、実験のためソースコード内にトークンを含めました。実際の運用では環境変数やSecrets Manager等に安全に保存・参照する方法を強く推奨します。
-2.png?width=1366&height=668&name=GetImage%20(9)-2.png)
③AWSコンソールからAPI Gatewayを検索し、APIを作成する。(今回はコスト最適化を重視したため、HTTP APIを使用)この際、「統合」でLambdaを選択する。
-2.png?width=1366&height=676&name=GetImage%20(10)-2.png)
④作成したAPI Gatewayを選択し、デフォルトのエンドポイントをコピーして控えておく。
-2.png?width=1366&height=671&name=GetImage%20(11)-2.png)
⑤先ほど作成したLambda関数の画面に戻り、「トリガーを追加」からAPI Gatewayを選択する。
-2.png?width=710&height=421&name=GetImage%20(12)-2.png)
⑥iPhoneの「ショートカット」で
- 現在地の取得
 - 指定地点を登録し、どの程度離れた際に先ほどのエンドポイントにアクセスするのか条件を定める
 
を設定する。
おまけ:
作成した「ショートカット」をオートメーション機能と組み合わせることで、通知処理をほぼ自動で実行することができます。
-2.png?width=506&height=379&name=GetImage%20(13)-2.png)
完成!!
改めてこの機能が行っていることを簡単に説明すると、
携帯側のショートカットで定めた条件(対象が範囲外に出たとき)をTrueとして返した場合、API Gateway経由でLambdaにアクセスし、Lambda関数が実行されます。今回はMessaging APIを活用したため、LineBot経由で通知される仕組みとなっています。
まとめ
AWS Lambdaの主な特徴:
- サーバーの準備や管理は一切不要(マネージド)
- コードを書くだけで動作する
- 実行された分だけ課金される(従量課金制)
- 他のAWSサービスと連携しやすい
今回は、AWS Lambdaとは何なのか? 使うことによってどのようなメリットがあるのかを説明してきました!
Lambdaのカスタマイズ性は高く、また突き詰めることでコスト最適化や効率化を実現できる素晴らしいサービスとなっています。今回紹介したことはAWS Lambdaの魅力の一部に過ぎないので、ご興味を持って活用していただけたら嬉しいです!
また、「実際にAWS Lambdaを活用してみた!」で利用したサービスはAWSでも無料枠として提供されているサービスです。(一定以上で従量課金となります)
あなたもAWS Lambdaを活用して、日々の業務を効率化してみてはいかがでしょうか?
ぜひ、まずは無料枠で試してみて、自動化してみてください!
今回作成したソースコードはこちらになります。
import json 
import requests 
# LINEのチャネルアクセストークン(長期有効なもの) 
CHANNEL_ACCESS_TOKEN = "YOUR_LINE_TOKEN" 
def lambda_handler(event, context): 
    # POSTで送られたbodyをJSONとして読み取る 
    body = json.loads(event["body"]) 
    lat = body.get("lat") 
    lon = body.get("lon") 
    if not lat or not lon: 
        return { 
            "statusCode": 400, 
            "body": "Missing lat/lon" 
        } 
    # 通知メッセージ 
    message = f"""圏外通知: 
対象が指定範囲外に出ました! 
位置情報: 
緯度 {lat}, 
経度 {lon} 
地図リンク: https://www.google.com/maps?q={lat},{lon}""" 
    headers = { 
        "Authorization": f"Bearer {CHANNEL_ACCESS_TOKEN}", 
        "Content-Type": "application/json" 
    } 
    data = { 
        "messages": [ 
            { 
                "type": "text", 
                "text": message 
            } 
        ] 
    } 
    # LINE botにメッセージ送信(全員に通知) 
    response = requests.post( 
        "https://api.line.me/v2/bot/message/broadcast", 
        headers=headers, 
        data=json.dumps(data) 
    ) 
    return { 
        "statusCode": response.status_code, 
        "body": response.text 
    }