【AWS Lambda使い方ガイド】AWS CLIから関数URLを設定してLambdaをAPIとして公開する


※ 当ページには【広告/PR】を含む場合があります。
2023/06/18
【AWS Lambda使い方ガイド】AWS CLIから簡単なランタイムNodejs v18対応のLambdaをデプロイする手順
【AWS Lambda使い方ガイド】odemailerのAWS SESクライアントを使ってLambdaからEmailを送信してみる
蛸壺の技術ブログ|AWS CLIから関数URLを設定してLambdaをAPIとして公開する

前回までで、Lambda(ランタイムnodejs v18)をAWS CLIでデプロイさせるまでの手順をまとめました。

合同会社タコスキングダム|蛸壺の技術ブログ
【AWS Lambda使い方ガイド】AWS CLIから簡単なランタイムNodejs v18対応のLambdaをデプロイする手順

Nodejs v18ベースのAWS Lambdaの簡単なハンドラを作成し、AWS CLIでデプロイするまでの手順をおさらいします。

でもLambdaを新規作成しただけだと、自分のIAMや権限を付与されたVPC内にあるサービスからしか呼び出すことができません。

そこでもっと手軽にLambdaをWebAPIとして公開する仕組みとして、一年前にアップデートされたものが
「関数URL」と呼ばれる機能です。

参考|Lambda 関数 URL - AWS公式ドキュメンテーション

今回は「関数URL」をAWS CLIで公開設定する方法を試してみます。


合同会社タコスキングダム|蛸壺の技術ブログ【AWS独習術】AWSをじっくり独学したい人のためのオススメ書籍&教材特集

図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書

Lambdaの関数URL

「関数URL」の追加以前は、ブラウザーなどの外部のクライアントからのLambdaへの直接アクセスする使い方は基本的に対応していませんでした。

ということで、通常Lambdaを使うには、CloudFlontであったり、APIGatewayであったり、Lambdaを同一VPC内でトリガーできるリリースと併用することが求められました。

以前なら、どうしても外部のクライアントからアクセスさせたい場合、
aws-sdkからLambdaのモジュール類を組み込んで、実行権限を付与したユーザーIAM情報を使ってLambdaを実行する、なんてこともできますが、このやり方はとても手軽とはいえません。

現在は、「関数URL」の登場により、aws-sdkなしでも外部からLambdaを簡単に実行できるようになりました。

合同会社タコスキングダム|蛸壺の技術ブログ

主な「関数URL」の機能の概要は以下の通りになります。

            
            + LambdaにエンドポイントURLを設定できる
+ URLへアクセスすることで、外部からLambdaを直接実行が可能
+ Lambdaへの関数URLのエンドポイント割り当て・利用料は無料。
    --> 料金自体は通常のLambdaと同様
+ 関数URLへのアクセスをパブリック(公開)するか、IAM認証を使うか選択できる
        

合同会社タコスキングダム|蛸壺の技術ブログ【AWS独習術】AWSをじっくり独学したい人のためのオススメ書籍&教材特集

図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書

AWS CLIによる関数URLの設定

ここからは関数URLをAWS CLIから設定してみます。

話の流れとして、前回説明したAWS CLIからのLambdaのデプロイの続きとして説明していきます。

合同会社タコスキングダム|蛸壺の技術ブログ
【AWS Lambda使い方ガイド】AWS CLIから簡単なランタイムNodejs v18対応のLambdaをデプロイする手順

Nodejs v18ベースのAWS Lambdaの簡単なハンドラを作成し、AWS CLIでデプロイするまでの手順をおさらいします。

関数URLの権限を追加(add-permissionサブコマンド)

前回デプロイしたLambdaにそのまま関数URLを設定します。

関数URLの認証タイプには、認証せずにそのまま公開する
「NONE」と特定のIAMロールにアクセスを制限する「IAM」から設定することができます。

ここでは
「NONE」タイプしか説明しませんが、このタイプで実際に公開し、APIとして運用する場合には、セキュリティの面からも独自に内部で認証ロジックを構築する必要があります。

そこで、
add-permissionサブコマンドで、リソースベースのポリシーをlambdaへ追加します。

            
            $ 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の値をどこかにメモっておけば、どこからでもWebAPIとして呼び出すことが可能になります。

ちなみにこの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独習術】AWSをじっくり独学したい人のためのオススメ書籍&教材特集

図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書

まとめ

今回は、AWS CLIからデプロイ中のLambdaに関数URLを設定するための手順を解説してみました。

ちょっとしたWebAPIを作りたいのであれば、関数URL付きのLambdaが非常に強力なツールになります。

逆に、しっかりとしたRest APIやHTTP APIなどを作りたい場合には、関数URLは使わずに、APIGateway等のリソースと組み合わせる必要があります。

参考サイト

lambda - AWS CLI Reference