カテゴリー
【AWS Lambda使い方ガイド】AWS CLIから関数URLを設定してLambdaをAPIとして公開する
※ 当ページには【広告/PR】を含む場合があります。
2023/06/18

前回までで、Lambda(ランタイムnodejs v18)をAWS CLIでデプロイさせるまでの手順をまとめました。
でもLambdaを新規作成しただけだと、自分のIAMや権限を付与されたVPC内にあるサービスからしか呼び出すことができません。
そこでもっと手軽にLambdaをWebAPIとして公開する仕組みとして、一年前にアップデートされたものが
今回は「関数URL」をAWS CLIで公開設定する方法を試してみます。
Lambdaの関数URL
「関数URL」の追加以前は、ブラウザーなどの外部のクライアントからのLambdaへの直接アクセスする使い方は基本的に対応していませんでした。
ということで、通常Lambdaを使うには、CloudFlontであったり、APIGatewayであったり、Lambdaを同一VPC内でトリガーできるリリースと併用することが求められました。
以前なら、どうしても外部のクライアントからアクセスさせたい場合、
aws-sdk
現在は、「関数URL」の登場により、aws-sdkなしでも外部からLambdaを簡単に実行できるようになりました。

主な「関数URL」の機能の概要は以下の通りになります。
+ LambdaにエンドポイントURLを設定できる
+ URLへアクセスすることで、外部からLambdaを直接実行が可能
+ Lambdaへの関数URLのエンドポイント割り当て・利用料は無料。
--> 料金自体は通常のLambdaと同様
+ 関数URLへのアクセスをパブリック(公開)するか、IAM認証を使うか選択できる
AWS CLIによる関数URLの設定
ここからは関数URLをAWS CLIから設定してみます。
話の流れとして、前回説明したAWS CLIからのLambdaのデプロイの続きとして説明していきます。
関数URLの権限を追加(add-permissionサブコマンド)
前回デプロイしたLambdaにそのまま関数URLを設定します。
関数URLの認証タイプには、認証せずにそのまま公開する
ここでは
「NONE」
そこで、
add-permission
$ aws lambda add-permission \
--function-name [Lambdaの関数名] \
--action lambda:InvokeFunctionUrl \
--principal "*" \
--function-url-auth-type "NONE" \
--statement-id [sidの名前]
ここで最低限指定しなければならないのが、関数URLを割り当てたい対象のLambdaの名前と、ポリシーを識別するための一意に決まるポリシーの名前(Statement-id)の2つです。
ちなみに自分で割り当てたStatement-idの名前など、ポリシーの詳細を確認したいときには
get-policy
$ aws lambda get-policy --function-name [Lambdaの関数名] | jq '.'
{
"Policy": "{\"Version\":\"2012-10-17\",\"Id\":\"default\",\"Statement\":[{\"Sid\":\"ほげほげ\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"lambda:InvokeFunctionUrl\",\"Resource\":\"arn:aws:lambda:ap-northeast-1:123456789012:function:hoge-api\",\"Condition\":{\"StringEquals\":{\"lambda:FunctionUrlAuthType\":\"NONE\"}}}]}",
"RevisionId": "4f16a95a-dd3a-472e-71c7-2a6bc5de2fa2"
}
関数URLエンドポイントの設定(create-function-url-configサブコマンド)
次に関数URLのエンドポイントをLambdaに設定してみます。
$ aws lambda create-function-url-config \
--function-name [Lambdaの関数名] \
--auth-type NONE
関数URLの割り当てに成功すると、URL値を含むレスポンスが返ってきます。
{
"FunctionUrl": "https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws/",
"FunctionArn": "arn:aws:lambda:ap-northeast-1:12345689012:function:hoge-api",
"AuthType": "NONE",
"CreationTime": "2023-06-18T06:12:35.068180Z"
}
これで関数URLが有効になりました。
後は
FunctionUrl
ちなみにこのURLアドレスを忘れた場合や設定を確認したい場合は、わざわざAWSアカウントのダッシュボードにログインしなくても、AWS CLIから
list-function-url-configs
$ aws lambda list-function-url-configs \
--function-name [Lambdaの関数名] | grep https
"FunctionUrl": "https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws/",
関数URLで動作確認
curlを使ってlambdaがWebAPIのように使えるか見てみましょう。
$ curl -XGET \
'https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws/'
{
"message": "HELLO, NODEJS V18!!!"
}
レスポンスが上手く返ってくるようなら、関数URLがちゃんと機能しています。
関数URLの設定を削除する(delete-function-url-config/remove-permissionサブコマンド)
Lambda自体を削除すると設定した関数URLも消えてなくなりますが、場合によっては関数URLの設定だけ削除したいケースもあります。
Lambdaはそのままで関数URLのみ消去したい場合は、
delete-function-url-config
$ aws lambda delete-function-url-config \
--function-name [Lambdaの関数名]
関数URLとば別にlambdaに割り当てたポリシーも削除したい場合には
remove-permission
$ aws lambda remove-permission \
--function-name [Lambdaの関数名] \
--statement-id [sidの名前]
指定するStatement-idはご自身が割り当てたポリシーの名前です。
これで関数URLなしの通常のLambdaにリセットされました。
まとめ
今回は、AWS CLIからデプロイ中のLambdaに関数URLを設定するための手順を解説してみました。
ちょっとしたWebAPIを作りたいのであれば、関数URL付きのLambdaが非常に強力なツールになります。
逆に、しっかりとしたRest APIやHTTP APIなどを作りたい場合には、関数URLは使わずに、APIGateway等のリソースと組み合わせる必要があります。
参考サイト
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー