AWS Lambda Function URLs を利用したLINEとの構築ハンズオン

## はじめに
今年4月6日ごろに発表されました[AWS Lambda 関数 URL: Lambda 関数用の組み込み HTTPS エンドポイント](https://aws.amazon.com/jp/about-aws/whats-new/2022/04/aws-lambda-function-urls-built-in-https-endpoints/)を利用して、LINEとの構築をハンズオンしました。

## どういったもの？
Lambdaのサービスの組み込み機能として、HTTPSエンドポイント（URL）を介してLambda関数を簡単に呼び出せるようになりました。

以前まではAPI Gatewayなどを介してLambda関数を呼び出していたので、その手間が省けますね。

## 構築図
従来のAPIGatewayを利用するのではなく、直接LINEからLambdaを叩く構成です
![](https://cloud5.jp/wp-content/uploads/2022/04/スクリーンショット-2022-04-29-14.21.52-640x348.png)

### 挙動
①LINEにLambdaのURLをWebhookとして設定、LINEのメッセージを送る
②LINEメッセージでLambda起動、Lambdaで設定している文言をLINEに返す

## ハンズオン
### ①Lambda設定
#### ①-1 関数を作成する
下記3点を入力及び選択し、それ以外はデフォルトです

・関数名
・ランタイム（Python3.9利用）
・詳細設定の「関数URLを有効化」にチェックして、認証タイプ「NONE」

![](https://cloud5.jp/wp-content/uploads/2022/04/スクリーンショット-2022-04-18-21.47.35-640x355.png)
![](https://cloud5.jp/wp-content/uploads/2022/04/スクリーンショット-2022-04-18-21.49.58-640x306.png)

認証タイプはテスト構築のため「NONE」にしていますが、Lambdaへのエンドポイント（URL）が流出すると誰でも叩ける状態になるので取り扱いに注意が必要です(既にこちらのLambdaは削除されています)

#### ①-2 Lambdaが構築出来ているか確認する
画面右下辺りに「関数URL」があるので、クリックする
![](https://cloud5.jp/wp-content/uploads/2022/04/スクリーンショット-2022-04-18-21.54.25-640x210.png)

新しい画面が開いて下記文言が表示されたら、Lambdaにてエンドポイントが作成されている状態です
![](https://cloud5.jp/wp-content/uploads/2022/04/スクリーンショット-2022-04-18-21.56.31.png)

※この時点でLambda Function URLsの機能が利用できているという状態なので、あとは好きにLambdaを書き散らして、ご自身のWebhookライフを送ってもらって大丈夫です。

#### ①-3 既存コードからLINEと連携するためのコードに書き換えしてデプロイする
下記今回の利用しているコード
```python:line-url
import json
import os
import urllib.request
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
#環境変数
LINE_CHANNEL_ACCESS_TOKEN   = os.environ['LINE_CHANNEL_ACCESS_TOKEN']

REQUEST_URL = 'https://api.line.me/v2/bot/message/reply'
REQUEST_METHOD = 'POST'
REQUEST_HEADERS = {
    'Authorization': 'Bearer ' + LINE_CHANNEL_ACCESS_TOKEN,
    'Content-Type': 'application/json'
}
#返信メッセージ
REQUEST_MESSAGE = [
    {
        'type': 'text',
        'text': 'これがAWS Lambda Function URLsの力なのかっっ！'
    }
]

def lambda_handler(event, context):
    logger.info(event)
    params = {
        'replyToken': json.loads(event['body'])['events'][0]['replyToken'],
        'messages': REQUEST_MESSAGE
    }
    request = urllib.request.Request(
        REQUEST_URL, 
        json.dumps(params).encode('utf-8'), 
        method=REQUEST_METHOD, 
        headers=REQUEST_HEADERS
        )
    response = urllib.request.urlopen(request, timeout=10)
    return 0
```
後続のLINE設定後環境変数を設定するので、ページは開いたままで後続の設定を行なっていきます

### ②LINE設定
#### ②-1 LINE Developersでプロバイダーの登録
[AWS Lambdaを利用したLINEbotハンズオン 1.LINE Developersでプロバイダーの登録](https://cloud5.jp/aws-lambda_line-api/#1-line-developers-)にある、1.1~1.6までの手順を行いLINE プロバイダーを登録する

#### ②-2 Messaging API設定の「Webhook設定」及び「Webhookの利用」にチェックする
Messaging API設定タブの『Webhook設定』に、Lambdaの関数URLを入力して設定をする
![](https://cloud5.jp/wp-content/uploads/2022/04/スクリーンショット-2022-04-29-13.09.35-640x528.png)
URLの入力後、「Webhook URL」の下にある項目の「Webhookの利用」にチェックを入れる
![](https://cloud5.jp/wp-content/uploads/2022/04/スクリーンショット-2022-04-29-13.18.10-640x45.png)

#### ②-3 Messaging API設定のチャンネルアクセストークン(長期)を発行する
②-2同様にMessaging API設定タブのチャンネルアクセストークン(長期)を発行してCOPYしておく
![](https://cloud5.jp/wp-content/uploads/2022/04/スクリーンショット-2022-04-29-13.23.45-640x67.png)

### ③Lambda設定
#### ③-1 Lambdaの環境変数に、チャンネルアクセストークン(長期)を入力する
①で作成したLambdaの設定タブより「環境変数」を押下して下記の値を入力
キー：LINE_CHANNEL_ACCESS_TOKEN
　　　値：【LINEのチャンネルアクセストークン】
![](https://cloud5.jp/wp-content/uploads/2022/04/スクリーンショット-2022-04-29-13.28.09-640x136.png)

## 挙動確認
### 1 作成したLINEの友達登録
[AWS Lambdaを利用したLINEbotハンズオン 1.LINE Developersでプロバイダーの登録](https://cloud5.jp/aws-lambda_line-api/#5-line-developers-aws-)にある、5.3~6までの手順で作成したLINE の友達登録を行う

### 2 実際の挙動画面
![](https://cloud5.jp/wp-content/uploads/2022/04/S__23633951-360x640.jpg)
※時間を空けるとColdStartの影響か立ち上がりに時間がかかりました。

## まとめ
・とてもお手軽で20分もかからずLINEとの構築をすることが出来ました。

・ただし認証がIAM認証と、一応CORS（あくまでオプション）なので、こういったLINE構築においては役に立つものではない気がしています。あくまで閉じた中でのLambdaを利用する際のものかと触った感じでは思ってます（あくまで30分くらい触った個人の所感です。）

・10日ぶりに起動させようとした際、ColdStartの影響で3〜5分くらい待った気がします。