のべラボ.blog

謙虚に、臆せず、さぼらずにブログを書く

AWS SAM Accelerate と POSTMAN を使って AWS Lambda の Function URLs を手早く試す

AWS Lambda の Function URLs で、Auth タイプに AWS_IAM を指定した場合のアクセスを試そうと考えていたところ、AWS SAM Accelerate と POSTMAN を使えば、手早く試せるのではと思い立ったので、やってみました。

AWS Lambda の Function URLs については、次の AWS Blog の記事を参照してください。

aws.amazon.com

また、AWS SAM Accelerate については、次の AWS Blog の記事を参照してください。

aws.amazon.com

まず、SAM CLI が使用できる環境を用意します。

今回は SAM Accelerate を使うので、バージョン 1.34 以上が必要です。

SAM CLI のバージョンを確認します。

sam --version

1.34.1以上のバージョンでなければ、アップグレードします。

まず最新版をダウンロードします。

wget https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip
unzip aws-sam-cli-linux-x86_64.zip -d sam-installation

次にインストールします。

sudo ./sam-installation/install --update

再び SAM CLI のバージョンを確認します。

sam --version

次のように、1.34 以降のバージョンになったので、大丈夫ですね。

SAM CLI, version 1.53.0

では、SAM の初期化を行います。

今回は、Python の Lambda 関数を作成します。また、ここでは Cloud 9 を使っているため、Pythonのバージョンを敢えて3.7 にしています。

sam init --app-template hello-world --name sam-tutorial --package-type Zip --runtime python3.7

あっという間に、SAM のリソースが用意されました。

今回は、Function URLs でのアクセスを試したいだけなので、Lambda 関数のコードは編集せず、Hello World のレベルのままにしておきます。

編集が必要なのは、template.yaml です。これを次のように書き換えます。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.7
      FunctionUrlConfig:
        AuthType: AWS_IAM
Outputs:
  HelloWorldFunctionEndpoint:
      Description: "HelloWorldFunction Function URL Endpoint"
      Value:
        Fn::GetAtt: HelloWorldFunctionUrl.FunctionUrl

Lambda 関数のプロパティで FunctionUrlConfig を指定しています。

また、Outputs セクションで、Function URLs のエンドポイントを出力するように指定しています。

このとき、属性名として、 <Lambda関数のリソース名>に Url.FunctionUrl をつけます。

これで、SAM のテンプレートは完成です。ではリソースを作成します。

cd sam-app
sam sync  --stack-name sam-app

SAM Accelerate の sync を使っているので、SAM の build や package、deploy を行う必要がありません。

次のように確認を求められたら、Y で応答します。

Enter Y to proceed with the command, or enter N to cancel:
 [Y/n]: Y

スタックが作成され、Output セクションで指定したエンドポイントが表示されます。

--------------------
Key                 HelloWorldFunctionEndpoint                                                  
Description         HelloWorldFunction Function URL Endpoint                                    
Value               https://nbuyqvkie2c64v7mjdt7sni3qy0lbgym.lambda-url.ap-northeast-1.on.aws/

Function URLs の Auth タイプが NONE であれば、単純にこのエンドポイントにアクセスするだけでよいのですが、今回は Auth タイプは AWS_IAM なので、アクセスキー ID やシークレットアクセスキーをもとに作成した署名 (AWS の署名v4) が必要です。

docs.aws.amazon.com

AWS の署名v4 を作成する方法はいくつかありますが、今回は POSTMAN を使ってみます。

www.postman.com

POSTMAN は、RESTful API を発行するときに、AWS の 署名v4 を自動生成する機能を提供しています。

次の図のように、指定して下さい。

Service Namelambda と入力するのを忘れないようにしましょう。

https://cdn-ak.f.st-hatena.com/images/fotolife/n/neob/20220813/20220813165211.png

POSTMAN で Send ボタンを選択して、 Function URL のエンドポイントにリクエストを発行すると、次のようなレスポンスが返ってきます。

https://cdn-ak.f.st-hatena.com/images/fotolife/n/neob/20220813/20220813172724.png

正常にアクセスできましたね。

試しに、正しくないアクセスキー ID を指定してみると、ステータスコード 403で 次のようなメッセージが返されます。

{
    "message": "The security token included in the request is invalid."
}

では最後に、作成した Lambda 関数を削除します。

これも、 SAM CLI から削除できます。確認を求められたら、 y で応答します。

sam delete --stack-name sam-app
        Are you sure you want to delete the stack sam-app in the region ap-northeast-1 ? [y/N]: y
        Do you want to delete the template file a19a97a7b854a2609df1ae91982ee843.template in S3? [y/N]: y

以上です!

Lambda 関数の Function URLs を試すだけであれば、マネジメントコンソールから手作業で作成してもいいのですが、デモ環境として再利用することも考慮し、今回は SAM を使ってみました。

ただし、SAM においても、package や deploy で多くのパラメータを指定するような操作はしたくなかったので、SAM Accelerate を使いました。

また、AWS の 署名v4 の生成には、POSTMAN を活用しました。

うまくツールを活用することで、あまり時間をかけず効率的に動作検証できますね。(横着ともいわれそうですが...)