はじめに
この記事では「この前リリースされた機能って実際に動かすとどんな感じなんだろう」とか「もしかしたら内容次第では使えるかも」などAWSサービスの中でも特定の機能にフォーカスして検証していく記事です。主な内容としては実践したときのメモを中心に書きます。(忘れやすいことなど)
誤りなどがあれば書き直していく予定です。
今回はAWS Lambdaの機能として提供されたAWS Lambda Function URLs(以下、Function URLs)を検証してみます。
この記事で伝えたいこと(Point)
- AWS Lambda Function URLsを使うとAPI Gatewayを使わずにLambdaの機能だけでAPIエンドポイントURLを作成できるよ
- AWS Lambda Function URLsの特色はどこかについて説明しているよ
LambdaがURLを発行するようになったね
AWS Lambda Function URLs の提供開始: 単一機能のマイクロサービス向けの組み込み HTTPS エンドポイント - Amazon Web Services ブログ
もうみなさん使っていると思いますが、ご存知ない人もいるため、簡単に説明します。
AWS Lambda Function URLs(Function URLs)とは
簡単に説明すると、AWSのサービスでAPIを作成する手段が増えたという話です。
URLでLambdaを開けるようになったとも言います。
今までWeb APIを作成しようと思ったときはAmazon API Gatewayを使う必要があります。
つまり、API GatewayでLambdaを実行するための入り口を作ります。
Function URLsがなかった場合は主に以下の方法でLambdaを実行できました。
- AWS CLIで実行
- AWS マネジメントコンソールで実行
- AWS SDK / AWS CDKで実行
- イベントをキャッチして実行(イベント駆動)
ただし、実行方法については開発スタイルによって実行手段が限られてくるため、上記の方法がすべて利用できるわけではありません。(役に立つわけではないという意味)
「APIを実行したい。けど、API Gatewayまで作る必要はないんだよなぁ」みたいな状態でもFunction URLsを使えば、LambdaだけでWeb APIを開発できます。
実際に使ってみよう
今回はFunction URLsを使ってLambdaにアクセスしてみます。
Lambda関数でHello World
Lambda関数を作る
まずは東京リージョンのAWSマネジメントコンソールからAWS Lambdaを検索してクリックします。
左メニューからFunctionsをクリックします。
東京リージョンであることを確認した上でCreate function
をクリックします。
Author from scratch
を選択します。
Basic information
を設定します。以下のとおりに設定します。
項目 | 値 |
---|---|
Function name | LineFuncUrls |
Runtime | Python3.12 |
アーキテクチャ | x86_64 |
Invoke modelはデフォルトの設定で問題ありません。
Additional Configurationsを設定します。ここでFunction URLs
の設定があります。デフォルトでチェックが無効になっているため、忘れずにチェックしてください。
Auth TypeはNone
にします。
AWS LambdaのロールはCreate a new role with basic Lambda permissions
(新規作成)を選択します。
最後にCreate function
をクリックします。
動作確認
作成を実行すると画面がLambdaの編集画面に遷移します。
画面右側にあるURLをクリップボードにコピーして開きます。※赤枠のアイコンをクリックしてください。
小さく表示されますが、無事にURLを発行できました。
Function URLsはどのようなところに使えるか
動作イメージができたところでそもそもどういうところで使えるのか見ていきたいと思います。
筆者の思いつく範囲では以下のとおりです。
- LINE Messaging APIのWebhookに利用できる
- シンプルにAPIとして利用できる
LINE Messaging APIのWebhookに利用できる
Messaging APIではWebhook URLを設定しますが、このURLでFunction URLsのURLが利用できます。なお、オウム返しのLINE botを作る場合は以下のPythonコードで実装できます。
※イベントオブジェクトは中身をチェックして返す必要がありますが、そのあたりは割愛
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'
}
def lambda_handler(event, context):
if not json.loads(event['body'])['events']:
return 0
logger.info(json.loads(event['body'])['events'][0]['message'])
message = str(json.loads(event['body'])['events'][0]['message']['text'])
reply_token = json.loads(event['body'])['events'][0]['replyToken']
#返信メッセージ
REQUEST_MESSAGE = [
{
'type': 'text',
'text': message
}
]
params = {
'replyToken': reply_token,
'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
シンプルにAPIとして利用できる
今回はAuth Type
をNoneに設定して簡単に作成していますが、しっかり設定するとIAMベースの認証APIが作成できます。たとえば、EC2やECSからセキュアなAPIアクセスも可能です。
余談:Google CloudのCloud Run functionsでは自動でエンドポイントURLが作成される
サーバレスサービスにURLでアクセスするというと、Google CloudではCloud Run functions(旧:Cloud Functions)というものがあります。
Cloud Run functionsではエンドポイントURLが自動で作成されますが、AWS Lambda Function URLsでは設定していない限りエンドポイントURLが作成されません。
まとめ
今回はAWS Lambda Function URLsを検証しました。今までAPIを作って対応していたところの一部で便利に利用できると思います。
お試しでLINE botを作るときはAPI Gatewayを作っていましたが、その必要も無くなったのでそういう点でもGoodな機能でした。