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 SAM Accelerate については、次の AWS Blog の記事を参照してください。
まず、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) が必要です。
AWS の署名v4 を作成する方法はいくつかありますが、今回は POSTMAN を使ってみます。
POSTMAN は、RESTful API を発行するときに、AWS の 署名v4 を自動生成する機能を提供しています。
次の図のように、指定して下さい。
Service Name に lambda と入力するのを忘れないようにしましょう。
POSTMAN で Send ボタンを選択して、 Function URL のエンドポイントにリクエストを発行すると、次のようなレスポンスが返ってきます。
正常にアクセスできましたね。
試しに、正しくないアクセスキー 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 を活用しました。
うまくツールを活用することで、あまり時間をかけず効率的に動作検証できますね。(横着ともいわれそうですが...)